Fallo de segmentacion en codigo fuente de calculadora en C

Imagen de Vinicio Steven
0 puntos

Hola comunidad de ubuntu.es, es que trato de hacer que ande este programita en C pero se compila bien pero a la hora de ejecutarlo lanza "fallo de segmentacion".

Aqui les dejo el codigo fuente y espero me ayuden lo mas pronto posible!!!:

/*calculadora.cpp*/

#include "ncurses.h"

int main(){

double a,b,x,y; int re,di;

initscr();

if (has_colors){
start_color();

init_pair(1,COLOR_YELLOW,COLOR_GREEN);
init_pair(2,COLOR_WHITE,COLOR_BLUE);
init_pair(3,COLOR_WHITE,COLOR_CYAN);
init_pair(4,COLOR_RED,COLOR_CYAN);

bkgd(COLOR_PAIR(2));
attron(COLOR_PAIR(1));

mvprintw(2,15,"CALCULADORA DE TERMINAL LINUX\n");
attroff(COLOR_PAIR(1));
attron(COLOR_PAIR(2)|A_BOLD);
mvprintw(4,4,"Selecciona una operacion o pulsa 5 para salir:\n");
mvprintw(6,2,"1)SUMAR");
mvprintw(7,2,"2)RESTAR");
mvprintw(8,2,"3)MULTIPLICAR");
mvprintw(9,2,"4)DIVIDIR");
mvprintw(10,2,"5)SALIR");
mvprintw(12,2,"OPERACION: ");
scanw("%s", re);

switch(re){

case 1:

printw("Has seleccionado la operacion sumar!!!\n");
printw("Cuantos digitos tiene tu operacion: ");
scanw("%s", di);

if (di == 1){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MENOS DE UN DIGITO\n");
attroff(COLOR_PAIR(4));
getch();
}

if (di == 2){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a+b);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 3){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a+b+x);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 4){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
printw("Cuarto digito: ");
scanw("%s", y);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a+b+x+y);
attroff(COLOR_PAIR(5));
getch();
}

if (di > 4){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MAS DE 4 DIGITOS\n");
attroff(COLOR_PAIR(4));
getch();
}

break;

case 2 :

printw("Has seleccionado la operacion restar!!!\n");
printw("Cuantos digitos tiene tu operacion: ");
scanw("%s", di);

if (di == 1){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MENOS DE UN DIGITO\n");
attroff(COLOR_PAIR(4));
getch();
}

if (di == 2){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a-b);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 3){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a-b-x);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 4){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
printw("Cuarto digito: ");
scanw("%s", y);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a-b-x-y);
attroff(COLOR_PAIR(5));
getch();
}

if (di > 4){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MAS DE 4 DIGITOS\n");
attroff(COLOR_PAIR(4));
getch();
}

break;

case 3:

printw("Has seleccionado la operacion multiplicar!!!\n");
printw("Cuantos digitos tiene tu operacion: ");
scanw("%s", di);
if (di == 1){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MENOS DE UN DIGITO\n");
attroff(COLOR_PAIR(4));
getch();

if (di == 2){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a*b);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 3){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a*b*x);
attroff(COLOR_PAIR(5));
getch();
}

if (di == 4){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
printw("Tercer digito: ");
scanw("%s", x);
printw("Cuarto digito: ");
scanw("%s", y);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a*b*x*y);
attroff(COLOR_PAIR(5));
getch();
}

if (di > 4){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MAS DE 4 DIGITOS\n");
attroff(COLOR_PAIR(4));
getch();
}

break;

case 4:

printw("Has seleccionado la operacion dividir!!!\n");
printw("Cuantos digitos tiene tu operacion: ");
scanw("%s", di);

if (di == 1){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MENOS DE UN DIGITO\n");
attroff(COLOR_PAIR(4));
}

if (di == 2){
attron(COLOR_PAIR(2)|A_BOLD);
printw("Primer digito: ");
scanw("%s", a);
printw("Segundo digito: ");
scanw("%s", b);
attroff(COLOR_PAIR(2));
init_pair(5,COLOR_YELLOW,COLOR_BLACK);
attron(COLOR_PAIR(5));
printw("RESULTADO: %s", a/b);
attroff(COLOR_PAIR(5));
getch();
}

if (di > 2){
attron(COLOR_PAIR(4)|A_UNDERLINE);
printw("ERROR, LA OPERACION NO PUEDE CONTENER MAS DE 2 DIGITOS\n");
attroff(COLOR_PAIR(4));
getch();
}

break;

case 5:
refresh();
endwin();
return 0;

}
}
}
}

Imagen de AbdulJabar
+1
0
-1

1)si el programa es cpp no es c es c++
2)en los cace tendrias que poner case'1':(ya que si oprimes 1 re vale el ascii de 1 y no 1)
3)en el sacanw %s se usa para cadenas de caracteres ,%d %c son para guardarlo como decimal o caracter respectivamente.
4)falta el default del swich

+1
0
-1
Imagen de Vinicio Steven
+1
0
-1

gracias por ayudarme, pero sigue lanzado fallo de segmentacion, he seguido todos sus consejos pero no anda.

+1
0
-1