C/Visual C - No puedo encontrar un error ayuda!!!!

 
Vista:

No puedo encontrar un error ayuda!!!!

Publicado por xj35u5x (63 intervenciones) el 20/08/2000 00:00:00
Miren el siguiente código en c :

#include <stdio.h>
#include <math.h>

main() { int a,b=0,c=0,i=0,j;
int x=0,y=0;
int s[30];
while((a=getch())>47 && a<58)
{ s[i]=a-48;
printf("%i",s[i]);
i++;}
if(a==´+´)
{ printf("+");
for(j=i;j>0;j--)
{ x=x+(pow(10,(j-1)))*s[i-j];
}
printf("%i",x);

}
}
bien, este código lo que hace es, uno pone un número, y al apretar directamente el boton ´+´
se imprime este signo y luego el número nuevamente
o sea, si pongo el numero 43 y luego el signo
+ automaticamente me sale
43+43
eso es todo, ahora, mi problema, es que extrañamente, cuando pongo un número con un número impar de digitos(mayor que 1) el número me aparece
disminuido en 1, o sea, si pusiera por ejemplo 300
me saldria :
300+299
o si pongo 5435 me saldría :
5435+5434

Me ha costado un monton detectar el error, aunque estoy seguro que es algun error matemático o algo que tiene que ver con la math.h

gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problema con la disminución en 1 al ingresar números con un número impar de dígitos

Publicado por Alejandro (913 intervenciones) el 27/08/2024 21:48:50
¡Hola, xj35u5x! Parece que has identificado correctamente el problema en tu código. El error está en la forma en que estás calculando el valor de `x` al ingresar un número con un número impar de dígitos. El problema radica en la línea:

1
x = x + (pow(10, (j - 1))) * s[i - j];

La función `pow` de la biblioteca `math.h` utiliza números en punto flotante, lo que puede causar errores de redondeo al trabajar con enteros. Esto puede llevar a que el valor de `x` se disminuya en 1 cuando se ingresan números con un número impar de dígitos.

Una solución para evitar este problema es utilizar una variable auxiliar para almacenar el resultado de `pow(10, (j - 1))` y luego convertirlo a entero antes de multiplicarlo por `s[i - j]`. Aquí tienes una posible solución:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <math.h>
 
int main() {
    int a, b = 0, c = 0, i = 0, j;
    int x = 0, y = 0;
    int s[30];
    while ((a = getch()) > 47 && a < 58) {
        s[i] = a - 48;
        printf("%i", s[i]);
        i++;
    }
    if (a == '+') {
        printf("+");
        for (j = i; j > 0; j--) {
            int power = pow(10, (j - 1));
            x = x + (int)power * s[i - j];
        }
        printf("%i", x);
    }
    return 0;
}

En esta solución, hemos introducido la variable `power` para almacenar el resultado de `pow(10, (j - 1))` como un entero. Luego, multiplicamos `power` por `s[i - j]` para obtener el valor correcto de `x`.

Espero que esta solución resuelva el problema que estabas experimentando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar