[ Foro de C ]

Primer mensaje - Saludos a todos

24-Apr-2008 15:26
Juan Manuel
4 Respuestas

En este primer mensaje voy a plantear una duda con respecto a uno de los ejercicios del curso de lenguaje C.  Ocurre que he llegado al ejercicio de la página 56:

"Ejercicio propuesto: Crear un programa calcule cuantas cifras
tiene un número entero positivo (pista: se puede hacer dividiendo
varias veces entre 10)." 

y no logro resolverlo, le doy vueltas y vueltas y no encuentro el
error. Incluso he recurrido a otras fuentes, como ya lo hice con el
ejercicio de la página 43.  Pero esta vez no he tenido suerte.

A continuación el programa que he escrito utilizando el bucle WHILE
como lo indica el texto.

#include <stdio.h>

main()

{
      int y, z=1;
      float x;  
      printf("Teclee un numero entero positivo:  ");
      scanf("%f", &x);
      while (z!=0)
      {     
           if (x/10>=1)
             y++;
           else
           z=0;
           break;  
      }        
      printf("El numero contiene %d digito/s \n", y);       
      printf("Fin del programa, presione una tecla para salir.\n");
      getch();
      exit(1);
      return 0;
} 

Como podrán observar, he utilizado tres variables.  Una para cargar el
número que el usuario ingrese "x", otra para contar los dígitos de ese
número "y" y la última para controlar el bucle "z".  Ahora bien, cuando
lo compilo (utilizo dev-c++) y lo pruebo, ocurre que sin importar el
número que ingrese siempre da como resultado:

"El numero contiene 3 digito/s"


24-Apr-2008 18:21
Nacho Cabanes (+83)

Bienvenido!

En cuanto a tu consulta: En primer lugar, intenta usar variables más legibles: en vez de

int y, z=1;

sería mejor

int cifras=0, terminado=0;

Y el fallo en sí está en la parte repetitiva, que puede no tener fin:

while (z!=0)
{
if (x/10>=1)
y++;
else
z=0;
break;
}

Si x vale 5000 (por ejemplo), siempre tendrás que x/10>=1, luego siempre aumentarías y... pero no harías nada más.

El "truco" es modificar el número en cada pasada, dividiendo entre 10: así valdría 5000, luego 500, luego 50, luego 5 y luego ya es <1, lo que quiere decir que tenía 4 cifras.

Es decir, basta con que además de y++ hagas x /= 10 en cada pasada.





25-Apr-2008 01:53
Javier Hernández

Conclusión: Debes de dividir hasta que x (en este caso) valga menos que 0.
Recuerdo este ejercicio de clase :P

Saludos!!

P.D.: Felicidades Nacho!! ya me lo han chivado (espero que sepas a lo que me refiero ;) )

25-Apr-2008 05:07
Aneudy E. Labour de la Cruz

#include <stdio.h>

main()

{
int y, z=1;
float x;
printf("Teclee un numero entero positivo: ");
scanf("%f", &x);
while (z!=0)
{
if (x/10>=1) /* Nunca cambiara el resultado de la evaluacion */
y++; /*No esta inicializada */
else
z=0;
break; /*Esto para que? */
}
printf("El numero contiene %d digito/s \n", y);
printf("Fin del programa, presione una tecla para salir.\n");
getch();
exit(1);
return 0;
}

Suponiendo que introduscas 123, x tomara ese valor, en la evaluacion x/10 >= 1 lo que hara es, preguntar si 12 es mayor a 1, y como el valor de x nunca cambia siempre preguntara lo mismo, la unica manera de que de falso es que introduscas un numero menor a 10.

Las variables en C no se inicializan en cero, sino que contienen basura. cuando dices y++, y en ese momento podria contener un valor de 12343 siendo la primera vez que se convoca esa instrucción.

la instruccion break no esta incluida dentro del else, puesto que necesitas llaves para incluir mas de una instrucción, por lo que el bucle se ejecutará solo una vez sin importar su condicion. En todo caso, cuando le asignas 0 a Z el bucle termina, asi que no es necesario ni aconsejable ese uso del break.

for(y = 0; x >0; x /=10)
y++;

es una posible solucion a tu bucle.
/* Inicializa y en 0, pregunta si x es mayor que cero, si lo es, aumenta y en uno y divide a x entre 10. */

Por ultimo, le pides al usuario un numero entero positivo, entonces, no seria mejor declarar x como unsigned int? en fin, esto ultimo es mas una sugerencia :), siempre es bueno tratar de encontrar una solucion a los problemas que pueda cometer el usuario



25-Apr-2008 13:48
Juan Manuel

Muchas gracias a todos por su ayuda. 






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)