[C con Clase] Ayuda con C
Steven Davidson
srd4121 en njit.edu
Jue Jun 5 21:08:48 CEST 2008
Hola Laura,
Laura wrote:
> Y si me dan una Luz de esto tambien :
>
> Realizar un programa que le solicite a un usuario un número, lo
> almacene en una variable de tipo entero y llame a una función que
> convierta cada dígito de este número en un caracter que se debe
> almacenar en un arreglo de caracteres S. Luego debe imprimir el
> resultado (el valor del arreglo S) por medio de la función puts.
>
Aquí, necesitarás echar mano a las operaciones de división, para dividir
- valga la redundancia - el número entero en dígitos. Partimos de la
idea de que un número entero se compone de dígitos que multiplican la
base (digamos que es 10). Por ejemplo,
1234 = 1*1000 + 2*100 + 3*10 + 4
Esto también implica lo siguiente:
1234 / 1000 => cociente = 1 y resto = 234
Como puedes observar, obtenemos el primer dígito con la división, y
además obtenemos los demás dígitos con el resto. De esta manera, podemos
aplicar nuestro algoritmo al número restante:
234 / 100 => c = 2 y r = 34
Y así sucesivamente. En C/C++, usaríamos los operadores / y %; por ejemplo,
digito = numero / 1000;
numero %= 1000; // El número restante
Podríamos empezar por las unidades para averiguar los dígitos. La
ventaja es que estaríamos dividiendo entre 10 en cada iteración. La
desventaja es que estaríamos obteniendo los dígitos en orden inverso.
Como queremos colocar los dígitos en una cadena de caracteres, esto
implicaría invertir el orden de nuestro array. En lugar de hacer estos
"malabarismos", creo que es mejor obtener cada dígito en orden.
Obtener los dígitos desde izquierda a derecha implica conocer el mayor
exponente de 10 para luego calcular el divisor. Esto se puede hacer con
el logaritmo (en base 10), que en C/C++ es la función estándar
'log10()'. Por ejemplo,
exponente = floor( log10( numero ) );
Para conseguir un exponente entero, aplicamos la función estándar
'floor()'. Ahora nos queda multiplicar la base 10 tantas veces como
nuestro exponente. La función estándar 'pow()' nos servirá:
divisor = pow( 10, exponente );
También podríamos implementar la potencia nosotros mismos. Date cuenta
de que no tenemos que estar usando 'pow()' iterativamente, ya que en
cada iteración dividimos el divisor entre 10.
Por último, nos hace falta convertir el dígito en carácter. Lo bueno de
la tabla ASCII es que los caracteres que representan dígitos existen
contiguamente y en el orden que esperamos: '0', '1', '2', ..., '9'. Por
lo tanto, la fórmula es bien sencilla:
caracter = digito + '0';
Creo que puedes implementar el programa con este diseño.
Espero haber aclarado las dudas.
Steven
Más información sobre la lista de distribución Cconclase