Test Foro de elhacker.net SMF 2.1

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
#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

#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
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:
#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
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á:
#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.
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
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
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 :¬¬ :¬¬ :¬¬