Errores con el código de una calculadora simple

Iniciado por petrusqui, 4 Marzo 2012, 22:22 PM

0 Miembros y 3 Visitantes están viendo este tema.

petrusqui

Buneas =D

Primero presentarme en el foro, soy un adolescente de 16 años donde estoy estudiando bachillarato y ahora y desde siempre me interesa la programación. Pero solo desde unos meses me puse a estudiar en serio y he empezado con c/c++, eso si de libros y tutoriales de internet. Ya conocia este foro pero ahora me regitre porque es el unico donde veo mucha actividad en programación =P

Bueno, con el código del lenguaje tengo dos problemas, uno es que al sumar dos números grandes no los suma bien, como por ejemplo 100000000000000000+100000000000000000, y la verdad no se porque. Y el otro problema que tengo es que no se me ocurre ninguna idea como poder cerrar la aplicación, porque el ultimo trozo del codigo no funciona o no lo he escrito bien =P

/*Esta aplicación ha sido creada por petrusqui */
/*Calculadora simple que realiza operaciones simples*/
/*A continuación se mostrarán las librerias que usa esta aplicación*/
#include <stdio.h>
#include <stdlib.h>

int main (void) /*A continuación empieza la parte más importante del código*/
{
int operacion_deseada; /*La operacion que el usuario desea hacer*/
char cerrar_ventana; /*Opcion si el usuario desea cerrar la ventana*/
float x; /*Primer número para hacer una operación matemática*/
float y; /*Segundo número para hacer una operación matemática*/
double resultado; /*El resultado de la operación de los dos números anteriores*/

/*Esta es la branca principal de la calcudadora*/
do
{
/*A continuacion se imprime en la pantalla el menu principal de la calculadora*/
printf("\n\tMENU\n");
printf(" -------------------------\n");
printf(" 1. Suma\n");
printf(" 2. Resta\n");
printf(" 3. Multiplicacion\n");
printf(" 4. Division\n");
printf(" 5. Informacion sobre la aplicacion\n");
printf(" 6. Salir\n");
printf("\n");
printf("Escoja una opcion: ");
fflush(stdin);
scanf("%d", &operacion_deseada);

/*A continuación el usuario eligira una un numero y dependiendo del numero realizara una accion u otra*/
switch (operacion_deseada)
{
/*SUMA*/
case 1: printf("Elija el primer numero que desea sumar: ");
scanf("%f", &x);
printf("Elija el segundo numero que desea sumar: ");
scanf("%f", &y);
resultado = x + y;
printf("El resultado de la suma es: %f\n", resultado);
break;
/*Resta*/
case 2: printf("Elija el primer numero que desea restar: ");
scanf("%f", &x);
printf("Elija el segundo numero que desea restar: ");
scanf("%f", &y);
resultado = x - y;
printf("El resultado de la resta es: %f\n", resultado);
break;
/*Multiplicación*/
case 3: printf("Elija el primer numero que desea multiplicar: ");
scanf("%f", &x);
printf("Elija el segundo numero que desea multiplicar: ");
scanf("%f", &y);
resultado = x * y;
printf("El resultado de la multiplicacion es: %f\n", resultado);
break;
/*División*/
case 4: printf("Elija el dividendo de la division: ");
scanf("%f", &x);
printf("Elija el divisor de la division: ");
scanf("%f", &y);
resultado = x / y;
printf("El coeficiente de la division es: %f\n", resultado);
break;
/*Información de la aplicación*/
case 5: printf("\n\tCredito\n");
printf("--------------------------\n");
printf(" Version: 1.1\n");
printf(" Creador: Petrusqui \n");
printf(" Sitio web: http://sobre-todo.es\n");
printf(" \n");
printf("\tInstrucciones\n");
printf("---------------------------\n");
printf(" La aplicacion solo hae operaciones senzillas. \n Para introducir decimales solo hay que añadir un punto, por exemplo 3.14\n");
printf(" Gracias por descargar la aplicacion!\n");
break;
/*Salir*/
case 6: printf("\n");
break;
default: printf("Opcion no valida, cuelve a intentar-lo\n");
break;
}
   /*Pedir al usuario si quiere realizar otra operacion matematica o cerrar la ventana*/
printf("\nQuieres realizar otra operacion (S/N): ");
scanf("%c", &cerrar_ventana);
getchar();
}

while(cerrar_ventana != 'S' && cerrar_ventana != 's');

getchar();
}



¿Una ultima pregunta, como pongo carácteres como "¿" que no pertenecen a ASCII?

Saludos, petrusqui.

Sagrini

Mmm... detalles:
1. No uses flush (). Lee las chinchetas
2. Declara main () como "int main (int argc, char *argv)". Es lo más correcto.
3. No uses tanto "scanf ()". Busca algo de fgetc (), getchar (), etc...
Luego, eso es porque ocurre un integer overflow. Puedes intentar solucionarlo usando la palabra clave "long" a la hora de declarar x, y y resultado. Y lo otro... mira la tabla ascii. Prueba con:
printf ("%cWhat?\n", 168)

armizh

#2
Para escribir el caracter "¿" haces:
printf("&c",(char *)168);
http://es.wikipedia.org/wiki/P%C3%A1gina_de_c%C3%B3digos_850

El problema al sumar los numeros es que 100000000000000000 es igual a 0x5D8A0000, que es un numero de 64 bits, por lo que en un PC de 32 bits no podras sumar.

Si quieres cerrar la ventana podrias probar con retornar EXIT_SUCCESS.
int main()
{
       /*    ...    */
       return EXIT_SUCCES;
}


Con eso se cierra la aplicacion. Tambien puedes retornar 0.

PS: Yo tambien tengo 16 años xd

Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

Caballo_Alado

#3
...
break;
}
   /*Pedir al usuario si quiere realizar otra operacion matematica o cerrar la ventana*/
printf("\nQuieres realizar otra operacion (S/N): ");

}

while((cerrar_ventana=getch())==115);


el getch() capta solo un carácter, por ende no tiene sentido incluir la mayúscula pero ta  >:D, para hacer que trabaje solo con s y n has

while((cerrar_ventana=getch())==115 || cerrar_ventana!=110);

(Aunque tampoco tenga sentido lo ultimo e.e)

♫           ♪ "I'm sexy and I know it"     ♪      ♫

Sagrini

Se me olvidó contestar a eso jajaja
exit (0); / return 0;
En caso de que estés dentro de otra función que no es main (), usa exit, ya que return vuelve a la función anterior.
Por cierto, &c es incorrecto. es %c

PS: Que mayores jejeje

rir3760

Cita de: petrusqui en  4 Marzo 2012, 22:22 PMY el otro problema que tengo es que no se me ocurre ninguna idea como poder cerrar la aplicación, porque el ultimo trozo del codigo no funciona o no lo he escrito bien =P
Es por lo ultimo.

Lo primero que debes hacer es evitar el uso de extensiones como la biblioteca conio de Borland, mas todavía cuando en tu programa su uso no es necesario.

Con "el ultimo trozo del codigo no funciona" supongo te refieres a que el bucle (y por ende la aplicación) no finaliza aun cuando teclees un carácter distinto de 'S' y 's'. Ello se debe a que al utilizar el especificador "%c" este no ignora el espacio blanco y por ello (caso usual) se "traga" el avance de linea introducido después del segundo operando.

Para solucionarlo solo tienes que agregar un espacio antes del especificador "%c", de esta forma:
printf("\nQuieres realizar otra operacion (S/N): ");
scanf(" %c", &cerrar_ventana);


También se puede reducir de forma significativa el programa ya que todas las operaciones son comunes (petición de los operandos, solo varia la operación).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

petrusqui

Cita de: Sagrini en  4 Marzo 2012, 23:03 PM
Mmm... detalles:
1. No uses flush (). Lee las chinchetas
2. Declara main () como "int main (int argc, char *argv)". Es lo más correcto.
3. No uses tanto "scanf ()". Busca algo de fgetc (), getchar (), etc...
Luego, eso es porque ocurre un integer overflow. Puedes intentar solucionarlo usando la palabra clave "long" a la hora de declarar x, y y resultado. Y lo otro... mira la tabla ascii. Prueba con:
printf ("%cWhat?\n", 168)

1. fflush() ya lo he quitado, como lo vi en el libro pensaba que era lo correcto. Gracias por el aviso.
2. ¿Si declaro int main (void) puede provocar algun error?
3. Gracias por el consejo, ¿pero si uso siempre la misma función puede pasar algo?
4. Muchisimas gracisa, aqui has resuelto mi problema con la suma de los dos numeros =D y tambien lo de los accentos :)

Cita de: armizh en  4 Marzo 2012, 23:06 PM
Para escribir el caracter "¿" haces:
printf("&c",(char *)168);
http://es.wikipedia.org/wiki/P%C3%A1gina_de_c%C3%B3digos_850

El problema al sumar los numeros es que 100000000000000000 es igual a 0x5D8A0000, que es un numero de 64 bits, por lo que en un PC de 32 bits no podras sumar.

Si quieres cerrar la ventana podrias probar con retornar EXIT_SUCCESS.
int main()
{
        /*    ...    */
        return EXIT_SUCCES;
}


Con eso se cierra la aplicacion. Tambien puedes retornar 0.

PS: Yo tambien tengo 16 años xd

Saludos

Gracias por lo de los carácteres me ha ayudado muchsíssimo =D Por cierto mi PC es de 64 bits, creo que el problema fue por no poner el long double, diria. Y al final para cerrar la ventana he pusto return 0;


Cita de: Mr.Brooks en  4 Marzo 2012, 23:08 PM
...
break;
}
    /*Pedir al usuario si quiere realizar otra operacion matematica o cerrar la ventana*/
printf("\nQuieres realizar otra operacion (S/N): ");

}

while((cerrar_ventana=getch())==115);


el getch() capta solo un carácter, por ende no tiene sentido incluir la mayúscula pero ta  >:D, para hacer que trabaje solo con s y n has

while((cerrar_ventana=getch())==115 || cerrar_ventana!=110);

(Aunque tampoco tenga sentido lo ultimo e.e)



Es por si el usuario pone "S" que no se le cierre la ventana, ya que c++ es case sensitive, aunque gracias por la ayuda =D

Cita de: Sagrini en  4 Marzo 2012, 23:37 PM
Se me olvidó contestar a eso jajaja
exit (0); / return 0;
En caso de que estés dentro de otra función que no es main (), usa exit, ya que return vuelve a la función anterior.
Por cierto, &c es incorrecto. es %c

PS: Que mayores jejeje

Gracias,  me has ayudado mucho, ya se cierra la ventana =D Y en el código estaba escrito con %c

Cita de: rir3760 en  4 Marzo 2012, 23:56 PM
Es por lo ultimo.

Lo primero que debes hacer es evitar el uso de extensiones como la biblioteca conio de Borland, mas todavía cuando en tu programa su uso no es necesario.

Con "el ultimo trozo del codigo no funciona" supongo te refieres a que el bucle (y por ende la aplicación) no finaliza aun cuando teclees un carácter distinto de 'S' y 's'. Ello se debe a que al utilizar el especificador "%c" este no ignora el espacio blanco y por ello (caso usual) se "traga" el avance de linea introducido después del segundo operando.

Para solucionarlo solo tienes que agregar un espacio antes del especificador "%c", de esta forma:
printf("\nQuieres realizar otra operacion (S/N): ");
scanf(" %c", &cerrar_ventana);


También se puede reducir de forma significativa el programa ya que todas las operaciones son comunes (petición de los operandos, solo varia la operación).

Un saludo

Gracias por la sugerenci, todavia no tengo dominado todas las bibliotecas =P Y tuviste razon tenia que poner un espacio, muchissimas gracias por cierto Esto del c++ tampoco es tan fácil...
Sobre lo de reducir el código lo pense, pero ya que no tengo interfaz gráfica pense en dar un poco más de belleza al castellano =P


GRACIAS A TODOS

rir3760

Cita de: petrusqui en  5 Marzo 2012, 22:08 PM2. ¿Si declaro int main (void) puede provocar algun error?
No.

Si defines la función principal como "int main(void) ..." o "int main(int argc, char *argv[]) ..." el compilador debe aceptarla si o si. Con otras definiciones no hay (y ese es el problema) garantías.

Algunos compiladores se quejan mediante un mensaje de advertencia si defines la función principal en la segunda forma sin utilizar, después, los argumentos en el programa (lo cual es correcto en el sentido de tener variables declaradas pero sin uso).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language