[Solucionado] Problema con Calculadora

Iniciado por Caster, 22 Diciembre 2011, 10:48 AM

0 Miembros y 1 Visitante están viendo este tema.

Caster

#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

Sagrini


#include <stdio.h>

int main ()
{
int a, b, opt;

printf ("Calc 0.1 : Sagrini 2011 : 22-12-11\n");
printf ("Escribe dos numeros enteros: "); scanf ("%d %d", &a, &b);
printf ("Selecciona una opcion:\n1. Sumar\t3. Multiplicar\n2. Restar\t4. Dividir\n> "); scanf ("%d", &opt);

switch (opt)
{
case 1 : { a+=b; break; } case 3 : { a=a*b; break; }
case 2 : { a-=b; break; } case 4 : { a=a/b; break; }
default: { printf ("[!] Opcion elegida no valida\n\n"); return 1; }
}

printf ("Ans = %d\n\n", a); return 0;
}


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

isseu

¿quieres hacer una calculadora de verdad?, busca sobre Notacion Polaca o Polaca inversa (http://es.wikipedia.org/wiki/Notaci%C3%B3n_polaca_inversa)

Sagrini

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 ().

Caster

#4
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:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int op;
 double x,y,resultado;
 printf("Calc 1.0 > Preython < 2011\n\n");
 printf("Introduce dos numeros:\n");
 scanf("%lf %lf", &x, &y);
 printf("\nElije una opcion:\n1.Sumar\t\t2.Restar\n3.Multiplicar\t4.Dividir\n>"); scanf("%d", &op);
 switch (op)
 {
        case 1 : { resultado = x+y; break; }
        case 2 : { resultado = x-y; break; }  
        case 3 : { resultado = x*y; break; }
        case 4 : { resultado = x/y; break; }
        default : { printf("[!] Opcion incorrecta [!]\n\n"); return 1; }                                              
 }
        printf("Resultado > %lf\n", resultado);
 system("PAUSE");
 return 0;
}

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í:
int a;
printf("Opciones:\n1.Volver a empezar\t2.Salir\n"); scanf("%d", &a);
switch (a)
{
       case 1 : { ir al incio; break; }
       case 2 : { return 0; break; }       
}

Saludos

Ferno

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!

Caster

#6
Aqui está:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int op,a;
 double x,y,resultado;
 do{
        printf("Calc 1.0 > Preython < 2011\n\n");
        printf("Introduce dos numeros:\n");
        scanf("%lf %lf", &x, &y);
        printf("\nElije una opcion:\n1.Sumar\t\t2.Restar\n3.Multiplicar\t4.Dividir\n>"); scanf("%d", &op);
        switch (op)
        {
               case 1 : { resultado = x+y; break; }
               case 2 : { resultado = x-y; break; }  
               case 3 : { resultado = x*y; break; }
               case 4 : { resultado = x/y; break; }
               default : { printf("[!] Opcion incorrecta [!]\n\n");}                                              
        }
               printf("Resultado > %lf\n\n", resultado);
               printf("Opciones:\n1.>Volver a empezar\t2.>Salir\n");
               scanf("%d", &a);
               }while( a==1);
 system("PAUSE");
 return 0;
}

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.

Sagrini

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
CitarPor 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

Caster

#8
Me podéis poner un ejemplo fácil con "fgets()", es que no lo entiendo.
¿Vale para números?