Buenos días, he escrito un código que tenia que hacer para clase y cuando depuro me salen números muy grandes. Alguien sabe porque? Gracias de ante mano. Aqui dejo el código en C:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int cifras(num1, cont);
int main()
{
int num1 = 0;
int cont = 1;
int numeros = 0;
int cont2 = 0;
char str[128];
printf("Cuantos numeros va a introducir? \n");
fgets(str, 128, stdin);
sscanf(str, "%d", &numeros);
while (cont2 < numeros)
{
printf("introduce un numero: \n");
fgets(str, 128,stdin);
sscanf(str,"%d" , &num1);
if (num1 > 0)
{
cont = cifras(num1, cont);
printf("el numero tiene %d cifras \n");
cont2++;
}
else
{
printf("introduce un numero positivo \n");
cont2 = 0;
}
}
printf("pulse enter para finalizar...");
getchar();
return 0;
}
int cifras(num1, cont)
{
while (num1 / 10 > 0)
{
num1 = num1 / 10;
cont++;
}
return cont;
}
printf("el numero tiene %d cifras \n");
Ahí falta una variable para dar valor a %d
Ya lo he puesto pero me sigue pasando lo mismo.
Te lo digo:
Fíjate que no reinicias la variable cont en cada bucle por tanto parte del valor que tenía en la interación anterior.
No es mejor poner un cout y std, obtenerlo en un char buffer[500]; y luego usar atoi( )?...
Después haces esto:
if( valor >= 0 && valor <= 9) cifras = 1;
if( valor >= 10 && valor <= 99) cifras = 2;
if( valor >= 100 && valor <= 999) cifras = 3;
y asi sucesivamente :v ( si querés te armo algo mejor :3 y sin poner tantos if xD. )
Corregi2
el first lo puse xq el tuyo al poner un segundo numero no se porque le restaba uno, y al primero no xD.
int cifras( int num1, int cont);
int main( )
{
int Roberto = 555;
int num1 = 0;
int cont = 1;
int numeros = 0;
int cont2 = 0;
int first = 0;
char str[128];
printf("Cuantos numeros va a introducir? \n");
fgets(str, 128, stdin);
sscanf(str, "%d", &numeros);
while (cont2 < numeros)
{
printf("introduce un numero: \n");
fgets(str, 128,stdin);
sscanf(str,"%d" , &num1);
printf( str );
if (num1 > 0)
{
cont = cifras(num1, cont);
if( first )
cont++;
printf("el numero tiene %d cifras \n", cont);
cont = 0;
first++;
cont2++;
}
else
{
printf("introduce un numero positivo \n");
cont2 = 0;
}
}
printf("pulse enter para finalizar...");
getchar();
system( "PAUSE" );
return 0;
}
int cifras( int num1, int cont)
{
while (num1 / 10 > 0)
{
num1 = num1 / 10;
cont++;
}
return cont;
}
He copiado tu codigo en visual studio y tambien me devuelve numeros muy grandes. Tal vez sea problema de mi visual...
Y la verdad que si, es tu VC, ami me anda d10, lo testee todo.
Me reafirmo en mi respuesta: en sucesivos bucles no reseteas cont, por eso crece sin control.
y yo te reafirmo diciendo que ya se lo corregi :v, y si vas a volver a reafirmar, no reafirmes directamente corregí el código y lesto.
Cita de: MAFUS en 11 Noviembre 2017, 00:32 AM
Me reafirmo en mi respuesta: en sucesivos bucles no reseteas cont, por eso crece sin control.
Puedes solucionarlo y lo pruebo?
Gracias de antemano
Ya te di el código solucionado, compilalo en otro programa, devc++ codeblocks, vc++ 2010 no sé.
Introduce entre la línea 17 y 18 una nueva con la instrucción: cont = 1;
sigue sin funcionar
Vale, muestra lo que tienes.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int cifras(int num1, int cont);
int main()
{
int num1 = 0;
int cont = 1;
int numeros = 0;
int cont2 = 0;
char str[128];
printf("Cuantos numeros va a introducir? \n");
fgets(str, 128, stdin);
sscanf(str, "%d", &numeros);
while (cont2 < numeros)
{
cont = 1;
printf("introduce un numero: \n");
fgets(str, 128,stdin);
sscanf(str,"%d" , &num1);
if (num1 > 0)
{
cont = cifras(num1, cont);
printf("el numero tiene %d cifras \n", &cont);
cont2++;
}
else
{
printf("introduce un numero positivo \n");
fgets(str, 128, stdin);
sscanf(str, "%d", &num1);
cont2 = 0;
}
}
printf("pulse enter para finalizar...");
getchar();
return 0;
}
int cifras(int num1,int cont)
{
while (num1 / 10 > 0||num1/10==0)
{
num1 = num1 / 10;
cont++;
}
return cont;
}
El fallo lo tienes en
printf("el numero tiene %d cifras \n", &cont);
el apmersand sirve para obtener la dirección de memoria. Lo que ves es eso y no el dato que hay en él, es decir, el número de cifras de cada número. Quita & y listo.
de esa forma ni me saca el numero.
Dentro de la función int cifras() tienes el while así:
while (num1 / 10 > 0||num1/10==0)
Cuando num1 sea un número de un solo dígito el resultado será 0, la sentencia num1/10==0 hará que el bucle se repita y 0/10 = 0, por tanto estarás en un bucle infinito.
Todo solucionado gracias a todos!!!