Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 22 Diciembre 2011, 10:48 am



Título: [Solucionado] Problema con Calculadora
Publicado por: Caster en 22 Diciembre 2011, 10:48 am
Código:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int a,f;
  double s,d;
  printf("Elija una opcion: \n\n1.Sumar\n2.Restar\n3.Multiplicar\n4.Dividir\n\n");
  scanf("%d" , &a);
  switch(a) {
            case 1:
                 printf("\nIntroduzca el primer numero:\n\n");
                 scanf("%lf" , &s);
                 printf("\nIntroduzca el segundo numero:\n\n");
                 scanf("%lf" , &d);
                 printf("\nResultado: %lf\n" , s+d);
                 break;
            case 2:
                 printf("\nIntroduzca el primer numero:\n\n");
                 scanf("%lf" , &s);
                 printf("\nIntroduzca el segundo numero:\n\n");
                 scanf("%lf" , &d);
                 printf("\nResultado: %lf\n" , s-d);
                 break;
            case 3:
                 printf("\nIntroduzca el primer numero:\n\n");
                 scanf("%lf" , &s);
                 printf("\nIntroduzca el segundo numero:\n\n");
                 scanf("%lf" , &d);
                 printf("\nResultado: %lf\n" , s*d);
                 break;
            case 4:
                 printf("\nIntroduzca el primer numero:\n\n");
                 scanf("%lf" , &s);
                 printf("\nIntroduzca el segundo numero:\n\n");
                 scanf("%lf" , &d);
                 printf("\nResultado: %lf\n\n" , s/d);
                 break;
            default:
                    printf("Opcion incorrecta\n");
                    break;
                                                                                      
                 }
                
  
  system("PAUSE");
  return 0;
}
He creado esta calculadora, pero no se me ocurre como hacer para que cuando no se introduzca la opción correcta se haga algo.
Ej:
La acabo de poner a funcionar y si en vez de introducir un numero introduzco una letra hace lo que le da la gana y escribe resultados muy raros, y después también, si elijo la opción incorrecta(se ejecuta el default) pero nose como hacer para que vuelva al incio.
PD: He probado con "goto" pero funciona mal y me gustaría prescindir de él.
Gracias

Edito: He cambiado algunas cosillas del código


Título: Re: Problema con Calculadora
Publicado por: Sagrini en 22 Diciembre 2011, 15:21 pm
Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5. int a, b, opt;
  6.  
  7. printf ("Calc 0.1 : Sagrini 2011 : 22-12-11\n");
  8. printf ("Escribe dos numeros enteros: "); scanf ("%d %d", &a, &b);
  9. printf ("Selecciona una opcion:\n1. Sumar\t3. Multiplicar\n2. Restar\t4. Dividir\n> "); scanf ("%d", &opt);
  10.  
  11. switch (opt)
  12. {
  13. case 1 : { a+=b; break; } case 3 : { a=a*b; break; }
  14. case 2 : { a-=b; break; } case 4 : { a=a/b; break; }
  15. default: { printf ("[!] Opcion elegida no valida\n\n"); return 1; }
  16. }
  17.  
  18. printf ("Ans = %d\n\n", a); return 0;
  19. }
  20.  

El código es muy mejorable, podrías modificarlo para que reconociese si los valores A y B son correctos, podrías cambiar scanf por otra función más segura... etc. Te paso la pelota. ¡Te toca!
Un saludo. Sagrini


Título: Re: Problema con Calculadora
Publicado por: isseu en 22 Diciembre 2011, 15:38 pm
¿quieres hacer una calculadora de verdad?, busca sobre Notacion Polaca o Polaca inversa (http://es.wikipedia.org/wiki/Notaci%C3%B3n_polaca_inversa)


Título: Re: Problema con Calculadora
Publicado por: Sagrini en 22 Diciembre 2011, 16:29 pm
La notación polaca inversa no se usa mucho, por lo que un programa que funcione con la notación polaca inversa será ineficiente y poco útil.
Yo más bien sugeriría que modificase el programa para que reconociese las operaciones desde los argumentos de main ().


Título: Re: Problema con Calculadora
Publicado por: Caster en 22 Diciembre 2011, 17:17 pm
Eso era lo que yo quería preguntar, ¿como haces para que reconozca A y B cuando son incorrectos?

Edito: Lo he cambiado, y he hecho este:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.  int op;
  7.  double x,y,resultado;
  8.  printf("Calc 1.0 > Preython < 2011\n\n");
  9.  printf("Introduce dos numeros:\n");
  10.  scanf("%lf %lf", &x, &y);
  11.  printf("\nElije una opcion:\n1.Sumar\t\t2.Restar\n3.Multiplicar\t4.Dividir\n>"); scanf("%d", &op);
  12.  switch (op)
  13.  {
  14.         case 1 : { resultado = x+y; break; }
  15.         case 2 : { resultado = x-y; break; }  
  16.         case 3 : { resultado = x*y; break; }
  17.         case 4 : { resultado = x/y; break; }
  18.         default : { printf("[!] Opcion incorrecta [!]\n\n"); return 1; }                                              
  19.  }
  20.         printf("Resultado > %lf\n", resultado);
  21.  system("PAUSE");
  22.  return 0;
  23. }
Con este código, si cuando elijo la opción incorrecta, me escribe el texto y, automáticamente, se cierra. ¿Como podría hacerlo para que no se cerrase?

¿Lo que utilice para volver a empezar si se da la opción incorrecta también lo podré utilizar para crear un switch con opciones de salir y volver a empezar?
Algo así:
Código
  1. int a;
  2. printf("Opciones:\n1.Volver a empezar\t2.Salir\n"); scanf("%d", &a);
  3. switch (a)
  4. {
  5.       case 1 : { ir al incio; break; }
  6.       case 2 : { return 0; break; }      
  7. }
Saludos


Título: Re: Problema con Calculadora
Publicado por: Ferno en 23 Diciembre 2011, 00:30 am
Cuando da la opción incorrecta se cierra porque tienes un return en el default. Con el return ya estás devolviendo un int y cerrando tu función, es decir, el main, y por ende, se cierra el programa. Debes quitar esa instrucción para que no se cierre.
Y si quieres que empiece de vuelta, puedes meter todo en un while y preguntar al usuario si quiere seguir o no, si la respuesta es si, vuelve al while (elige una condición adecuada) y si no, sales!


Título: Re: Problema con Calculadora
Publicado por: Caster en 23 Diciembre 2011, 09:23 am
Aqui está:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.  int op,a;
  7.  double x,y,resultado;
  8.  do{
  9.         printf("Calc 1.0 > Preython < 2011\n\n");
  10.         printf("Introduce dos numeros:\n");
  11.         scanf("%lf %lf", &x, &y);
  12.         printf("\nElije una opcion:\n1.Sumar\t\t2.Restar\n3.Multiplicar\t4.Dividir\n>"); scanf("%d", &op);
  13.         switch (op)
  14.         {
  15.                case 1 : { resultado = x+y; break; }
  16.                case 2 : { resultado = x-y; break; }  
  17.                case 3 : { resultado = x*y; break; }
  18.                case 4 : { resultado = x/y; break; }
  19.                default : { printf("[!] Opcion incorrecta [!]\n\n");}                                              
  20.         }
  21.                printf("Resultado > %lf\n\n", resultado);
  22.                printf("Opciones:\n1.>Volver a empezar\t2.>Salir\n");
  23.                scanf("%d", &a);
  24.                }while( a==1);
  25.  system("PAUSE");
  26.  return 0;
  27. }
  28.  
Pero hay varios problemas, si en los numeros introduzco una letra me va directamente a "system("PAUSE");" y se cierra. Si en las opciones introduzco el numero incorrecto me dice que lo meti mal y me deja volver a empezar, pero si meto una letra me va directamente a system(PAUSE) para cerrarse.


Título: Re: Problema con Calculadora
Publicado por: Sagrini en 23 Diciembre 2011, 10:40 am
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
Citar
Por el otro lado, para evitar esas pausas fastidiosas es necesario evitar las funciones que dejan basura por doquier (como scanf();) y utilizar funciones como la ya mencionada fgets();

Scanf no es muy recomendable, su uso no es muy seguro y el resultado no siempre correcto.
Un saludo. Sagrini


Título: Re: Problema con Calculadora
Publicado por: Caster en 23 Diciembre 2011, 11:34 am
Me podéis poner un ejemplo fácil con "fgets()", es que no lo entiendo.
¿Vale para números?


Título: Re: Problema con Calculadora
Publicado por: Sagrini en 23 Diciembre 2011, 12:23 pm
http://foro.elhacker.net/programacion_cc/fgets_para_enteros-t348368.0.html;topicseen :¬¬ :¬¬ :¬¬