[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