validacion de scanf
Publicado por pedro (2 intervenciones) el 19/04/2017 15:48:01
hola buenos dias! tengo un problema con este programa, no puedo validar scanf, es un trabajo en el que hay que usar scanf si o si(nos lo hacen hacer para que nunca mas usemos scanf), se supone que si el usuario inserta algo que no corresponde, en este caso números enteros, scanf debería valer 0, y mandarme al menú de default, para nuevamente estar en el menú donde estabas parado, pero no se porque no me anda y cuando inserto una letra el programa este en un loop que solo puedo salir cerrando la ventana, y no pude encontrar el error. si me podrían ayudar seria genial, graciass
#include <stdio.h>
2 #include <stdlib.h>
3 #define SALIR 0
4 #define INICIO 1
5 #define MENU_PRINCIPAL 2
6 #define MENU_DE_ALTA_TENCION 3
7 #define MENU_DE_BAJA_TENCION 4
8 #define MENU_DE_ALTA_TENCION_RESISTENCIA_2 5
9 #define MENU_DE_ALTA_TENCION_RESISTENCIA_1 6
10 #define MENU_DE_ALTA_TENCION_VOLTAJE 7
11 #define VOLVER_A_MENU_ANTERIOR 8
12 #define DEFAULT 9
13
14 int main(void)
15 {
16 float resistor1, resistor2, voltaje, resistor3;
17 int menu;
18 int aux;
19 menu = INICIO;
20 while (menu!=SALIR)
21 {
22 switch(menu)
23 {
24 case INICIO:
25 puts("iniciando..");
26 menu = MENU_PRINCIPAL;
27 break;
28 case MENU_PRINCIPAL:
29 while(menu!=SALIR)
30 {
31 puts("\tMenu principal");
32 puts("ingrese:");
33 printf("%i para ir a menu de baja tencion\n",MENU_DE_BAJA_TENCION);
34 printf("%i para ir al menu de alta tencion\n",MENU_DE_ALTA_TENCION);
35 printf("%i para cerrar programa\n",SALIR);
36 aux = scanf("%i", & menu);
37 if(aux == 0)
38 {
39 menu = DEFAULT;
40 }
41 switch (menu)
42 {
43 case MENU_DE_ALTA_TENCION:
44 while (menu == MENU_DE_ALTA_TENCION)
45 {
46 puts("\tMenu de alta tención");
47 puts("(para valores entre 7 y 35 volts)\n");
48 puts("ingrese:");
49 printf("%i para obtener resistencia 2\n",MENU_DE_ALTA_TENCION_RESISTENCIA_2);
50 printf("%i para obtener resistencia 1\n",MENU_DE_ALTA_TENCION_RESISTENCIA_1);
51 printf("%i para obtener la tencion\n",MENU_DE_ALTA_TENCION_VOLTAJE);
52 printf("%i para volver al Menu principal\n",VOLVER_A_MENU_ANTERIOR);
53 printf("%i para cerrar programa\n",SALIR);
54 aux = scanf("%i", & menu);
55 if(aux==0)
56 {
57 menu = DEFAULT;
58 }
59 switch(menu)
60 {
61 case MENU_DE_ALTA_TENCION_RESISTENCIA_1:
62 puts("ingrese su valor de resistencia2 en ohms y la tencion");
63 scanf("%f %f", & resistor2, & voltaje);
64 resistor1 = voltaje * resistor2 - resistor2;
65 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
66 printf("su resistencia 1 es:%3fohms y su resisitencia 3:%3fohms\n\n", resistor1, resistor3);
67 menu = MENU_DE_ALTA_TENCION;
68 break;
69 case MENU_DE_ALTA_TENCION_RESISTENCIA_2:
70 puts("ingrese su valor de resistencia 1 en ohms y la tencion");
71 scanf("%f %f", & resistor1, & voltaje);
72 resistor2 = resistor1 / (voltaje - 1);
73 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
74 printf("su resistencia 1 es :%fohms y su resisitencia 3 es :%fohms\n\n", resistor1, resistor3);
75 menu = MENU_DE_ALTA_TENCION;
76 break;
77 case MENU_DE_ALTA_TENCION_VOLTAJE:
78 puts("ingrese sus resistencia 1 y su resistencia 2");
79 scanf("%f %f", & resistor1, & resistor2);
80 voltaje = (resistor1 + resistor2) / resistor2;
81 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
82 printf("su tencion es: %fvolts y su resistencia 3 es: %f\nohms\n\n", voltaje, resistor3);
83 menu = MENU_DE_ALTA_TENCION;
84 break;
85 case SALIR:
86 break;
87 case VOLVER_A_MENU_ANTERIOR:
88 menu = MENU_PRINCIPAL;
89 break;
90 default:
91 fprintf(stderr,"error, valor no valido, ingrese de nuevo\n");
92 menu = MENU_DE_ALTA_TENCION;
93 break;
94 }
95 }
96 break;
97 case MENU_DE_BAJA_TENCION:
98 puts("\n\tMenu de baja tencion");
99 puts("no hay opciones disponibles\n");
100 break;
101 case SALIR:
102 break;
103 default:
104 puts("error, valor no valido, intente de nuevo\n");
105 menu = MENU_PRINCIPAL;
106 break;
107 }
108 }
109 break;
110 }
111 }
112 return EXIT_SUCCESS;
113 }
#include <stdio.h>
2 #include <stdlib.h>
3 #define SALIR 0
4 #define INICIO 1
5 #define MENU_PRINCIPAL 2
6 #define MENU_DE_ALTA_TENCION 3
7 #define MENU_DE_BAJA_TENCION 4
8 #define MENU_DE_ALTA_TENCION_RESISTENCIA_2 5
9 #define MENU_DE_ALTA_TENCION_RESISTENCIA_1 6
10 #define MENU_DE_ALTA_TENCION_VOLTAJE 7
11 #define VOLVER_A_MENU_ANTERIOR 8
12 #define DEFAULT 9
13
14 int main(void)
15 {
16 float resistor1, resistor2, voltaje, resistor3;
17 int menu;
18 int aux;
19 menu = INICIO;
20 while (menu!=SALIR)
21 {
22 switch(menu)
23 {
24 case INICIO:
25 puts("iniciando..");
26 menu = MENU_PRINCIPAL;
27 break;
28 case MENU_PRINCIPAL:
29 while(menu!=SALIR)
30 {
31 puts("\tMenu principal");
32 puts("ingrese:");
33 printf("%i para ir a menu de baja tencion\n",MENU_DE_BAJA_TENCION);
34 printf("%i para ir al menu de alta tencion\n",MENU_DE_ALTA_TENCION);
35 printf("%i para cerrar programa\n",SALIR);
36 aux = scanf("%i", & menu);
37 if(aux == 0)
38 {
39 menu = DEFAULT;
40 }
41 switch (menu)
42 {
43 case MENU_DE_ALTA_TENCION:
44 while (menu == MENU_DE_ALTA_TENCION)
45 {
46 puts("\tMenu de alta tención");
47 puts("(para valores entre 7 y 35 volts)\n");
48 puts("ingrese:");
49 printf("%i para obtener resistencia 2\n",MENU_DE_ALTA_TENCION_RESISTENCIA_2);
50 printf("%i para obtener resistencia 1\n",MENU_DE_ALTA_TENCION_RESISTENCIA_1);
51 printf("%i para obtener la tencion\n",MENU_DE_ALTA_TENCION_VOLTAJE);
52 printf("%i para volver al Menu principal\n",VOLVER_A_MENU_ANTERIOR);
53 printf("%i para cerrar programa\n",SALIR);
54 aux = scanf("%i", & menu);
55 if(aux==0)
56 {
57 menu = DEFAULT;
58 }
59 switch(menu)
60 {
61 case MENU_DE_ALTA_TENCION_RESISTENCIA_1:
62 puts("ingrese su valor de resistencia2 en ohms y la tencion");
63 scanf("%f %f", & resistor2, & voltaje);
64 resistor1 = voltaje * resistor2 - resistor2;
65 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
66 printf("su resistencia 1 es:%3fohms y su resisitencia 3:%3fohms\n\n", resistor1, resistor3);
67 menu = MENU_DE_ALTA_TENCION;
68 break;
69 case MENU_DE_ALTA_TENCION_RESISTENCIA_2:
70 puts("ingrese su valor de resistencia 1 en ohms y la tencion");
71 scanf("%f %f", & resistor1, & voltaje);
72 resistor2 = resistor1 / (voltaje - 1);
73 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
74 printf("su resistencia 1 es :%fohms y su resisitencia 3 es :%fohms\n\n", resistor1, resistor3);
75 menu = MENU_DE_ALTA_TENCION;
76 break;
77 case MENU_DE_ALTA_TENCION_VOLTAJE:
78 puts("ingrese sus resistencia 1 y su resistencia 2");
79 scanf("%f %f", & resistor1, & resistor2);
80 voltaje = (resistor1 + resistor2) / resistor2;
81 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
82 printf("su tencion es: %fvolts y su resistencia 3 es: %f\nohms\n\n", voltaje, resistor3);
83 menu = MENU_DE_ALTA_TENCION;
84 break;
85 case SALIR:
86 break;
87 case VOLVER_A_MENU_ANTERIOR:
88 menu = MENU_PRINCIPAL;
89 break;
90 default:
91 fprintf(stderr,"error, valor no valido, ingrese de nuevo\n");
92 menu = MENU_DE_ALTA_TENCION;
93 break;
94 }
95 }
96 break;
97 case MENU_DE_BAJA_TENCION:
98 puts("\n\tMenu de baja tencion");
99 puts("no hay opciones disponibles\n");
100 break;
101 case SALIR:
102 break;
103 default:
104 puts("error, valor no valido, intente de nuevo\n");
105 menu = MENU_PRINCIPAL;
106 break;
107 }
108 }
109 break;
110 }
111 }
112 return EXIT_SUCCESS;
113 }
Valora esta pregunta


0