F1 Help! La solución que buscabas

Desarrollo, programación, tips, consejos y soluciones para los usarios de PC

lunes, 20 de septiembre de 2010

Un simple pero efectivo atoi

Hace mucho que no escribo en esta seccion del blog, pero bueno, no se alarmen. Hoy en uno de los foros que leo me pidieron que les enseñe a crear un atoi (convertir de cadena a entero) en c. Y como fue codigo 100% hecho por mi se me ocurrio compartirlo. Ademas por la explicacion que hice. Aqui va el codigo.
numero = 0;

for(i=0;cadena[i] != '\0' ;i ++) {

 digito=cadena[i] - '0';

 numero = numero * 10 + digito;

}
Como cada caracter es representado por un numero, a esto le podemos restar otros caracteres para obtener otro caracter o un numero. Por ejemplo para obtener el digito 5 desde el caracter '5' podemos hacer:

'5' - '0' = 5
'2' - '0' = 2

La idea es restar siempre el primer elemento de la secuencia ordenada de caracteres que queramos. Es posible aplciar esta tecnica para averiguar el numero de letra( 'g' - 'a').

Luego pensemos en un poco de matematica:

2345 = 2 x 1000 + 3 * 100 + 4 * 10 + 5

Esta idea nos da una pequeña intuicion. Tenemos que ir multiplicando cada digito(obtenido con la tecnica anterior) por un multiplo de 10 segun corresponda. Pero no es muy conveniente llegar al digito menos representativo para empezar a multiplicar.

Existe una mejor tecnica. Miren esta descomposicion efectuada gracias a la distribucion del producto:

2345 = 2 x 1000 + 3 * 100 + 4 * 10 + 5 = (2 * 100+ 3 * 10 + 4) * 10 + 5

Si seguimos desarrollando de esa manera, observaremos que al agregar un nuevo digito al numero, simplemente multiplicamos por 10 el numero anterior y le sumamos el digito siguiente:

numero = numero * 10 + digito

Todos sabemos que al multiplicar un numero por diez, se corre la coma a la derecha, apareciendo un cero final. Simplemente hay que sumarle el digito obtenido y listo.

Un agregado mas, en el for se recorre hasta que se obtiene un final de cadena. Pero se puede modificar para que recorra siempre que se obtenga un digito. Cuando este no aparezca mas se corta. Osea podremos parciar numeros desde cadenas como estos "1234holamundo"

Les dejo la pista para esto. En el for deberian chequear esta condicion: '0'<= cadena[i]<='9'

No hay comentarios: