Codigo en C se cuelga sin motivo aparente

Iniciado por Steel_Falcon, 7 Agosto 2012, 14:00 PM

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

Steel_Falcon

Hola, esta es mi primer codigo asi que no seais muy duros conmigo si estoy cometiendo un error de noob.

Resulta que he intentado crear una calculadora simple capaz de sumar, restar, multiplicar y dividir. Los cálculos los realiza sin problemas pero cuando da la solución quiero que pregunte al usuario si quiere realizar otra operación o salir del programa.Cuando el usuario selecciona la opción que quiere es donde se cuelga el programa. Por mas que lo busco no consigo encontrar donde está el fallo. :(

/* Calculadora simple en C */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    int integer1, integer2, total, opcion, opcion2;
   
    printf("Hola mundo\n");
    printf("Soy una calculadora\ny voy a hacer la operaci\242n que tu quieras\n");
   
   
    top:
        printf ("Pulsa 1 para sumar\nPulsa 2 para restar\nPulsa 3 para multiplicar\nPulsa 4 para dividir\nPulsa 5 para salir\n");       
   
    /*
    sumar = 1
    restar =2
    multiplicar =3
    dividir = 4
    salir = 5
    */
   
    scanf ("%d", &opcion);
   
    if (opcion == 5) {
        printf("Adios!!!\n");
        getch(); //<conio.h>
        return 0;
    }else
   
   
   
   
    if (opcion == 1) {
       
        printf("Primero introduce la cantidad inicial\n");
        scanf("%d", &integer1);
        printf("Ahora introduce la cantidad que quieras sumarle a la cantidad anterior\n");
        scanf ("%d", &integer2);
        total = integer1 + integer2;
        printf("Estoy sumando....\n");
        getch(); //<conio.h>
        printf("La cantidad es %d\n", total);
        getch(); //<conio.h>
        goto fin;
       }else;
   
   
   
   
   
   
    if (opcion ==2){
        printf ("Primero introduce la cantidad inicial\n");
        scanf("%d", &integer1);
        printf("Ahora introduce la cantidad que quieras restarle a la cantidad anterior\n");
        scanf ("%d", &integer2);
        total = integer1 - integer2;
        printf("Estoy restando....\n");
        getch(); //<conio.h>
        printf("La cantidad es %d\n", total);
        getch(); //<conio.h>
        goto fin;
    }else
   
   
   
   
    if (opcion ==3){
        printf ("Primero introduce la cantidad inicial\n");
        scanf("%d", &integer1);
        printf("Ahora introduce la cantidad por la que quieras multiplicar la cantidad anterior\n");
        scanf ("%d", &integer2);
        total = integer1 * integer2;
        printf("Estoy multiplicando....\n");
        getch(); //<conio.h>
        printf("La cantidad es %d\n", total);
        getch(); //<conio.h>
        goto fin;
     }else
   
   
   
   
    if (opcion ==4)
    printf ("Primero introduce la cantidad inicial\n");
        scanf("%d", &integer1);
        printf("Ahora introduce la cantidad entre la que quieras dividir la cantidad anterior\n");
        scanf ("%d", &integer2);
        total = integer1 / integer2;
        printf("Estoy dividiendo....\n");
        getch(); //<conio.h>
        printf("La cantidad es %d\n", total);
        getch(); //<conio.h>
        goto fin;
     
     
     
     
       
fin:
    printf("Si quieres salir pulsa 1\nSi quieres hacer otra operaci\242n pulsa 2\n");
        scanf ("%d", opcion2);
            if (opcion2 == 1){
                printf("Adios!!!\n");
                getch(); //<conio.h>
                return 0;
            }else
           
            if (opcion2 ==2)
                goto top;

}


Gracias adelantadas. :)

fary

fin:
   printf("Si quieres salir pulsa 1\nSi quieres hacer otra operaci\242n pulsa 2\n");
       scanf ("%d", opcion2);
           if (opcion2 == 1){
               printf("Adios!!!\n");
               getch(); //<conio.h>
               return 0;
           }else
           
           if (opcion2 ==2)
               goto top;


scanf ("%d", opcion2);

eso es así:

scanf ("%d", &opcion2);

Con ese & funciona perfecto ;)

saludos.
Un byte a la izquierda.

Steel_Falcon

Muchísimas gracias :D, no entiendo como se me había podido pasar algo tan obvio.
Como no me aparecían errores de sintaxis en el IDE pensé que sería algun problema con la estructura de los if-else.

Podemos dar este tema por cerrado.

dato000

yo quisiera saber que significa eso de "top" y "fin". por favor??



fary

Cita de: dato000 en  7 Agosto 2012, 14:40 PM
yo quisiera saber que significa eso de "top" y "fin". por favor??

Son etiquetas, se pueden usar para muchas cosas, en esta ocasion el las usa para saltar de nuevo a una parte de la funcion. Salta con goto ej: goto top;

saludos.
Un byte a la izquierda.

maxim_o

top y fin son etiquetas.... para hacer saltos con el goto....
El uso del goto está contraindicado.... Y no se debería usar y menos en un programa tan sencillo.

Podrías solucionarlo mediante un do-while... y lo mejor que puedes hacer es ir olvidando el goto y su práctica....
Tambien estaría muy bien, que usaras un switch... en vez de encadenar tantos ifs....

Basicamente seria

do{
printf ("Pulsa 1 para sumar\nPulsa 2 para restar\nPulsa 3 para multiplicar\nPulsa 4 para dividir\nPulsa 5 para salir\n");
scanf ("%d", &opcion);

printf("Primero introduce la cantidad inicial\n");
scanf("%d", &integer1);
printf("Ahora introduce la cantidad que quieras sumarle a la cantidad anterior\n");
scanf ("%d", &integer2);
switch(opcion){
case 1:  total= integer1 + integer2;break;
case 2: total=integer1-integer2;break;
case 3:total=integer1*integer2;break;
case 4:total=integer1/integer2;break;
}

if(opcion!=5)
printf("La cantidad es %d\n", total);
getchar();
}while(opcion!=5);


Mas o menos sería asi... Lo he hecho rapido y no se si está bien , pero vamos esa es la idea.... tambien si puedes no usar la libreria conio.h ... ya que no es estandar y dara muchos fallos y te hará que no pueda ser portable....
Aqui tienes un link donde te da consejos :
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

dato000

ummm vale muchas gracias, nunca habia visto el goto, habia visto el break y el continue pero no ese.