Autor
|
Tema: ayuda intercambiando switch por if-else (Leído 1,780 veces)
|
++c
Desconectado
Mensajes: 29
|
Hola amigos que tal, estoy intentando de intercambiar la sentencia switch por un if-else anidado y mi problema viene acarreado a la hora de que cada vez se ejecuta una sentencia se ejecuta igualmente el último else mostrando: else{ printf( "**Introdujo una letra incorrecta**" ); printf( "\nIntroduzca una nueva calificacion: " ); }
Donde supuestamente es el default de la antigua estructura switch por la que estoy intercambiando por este if-else anidado. Les adjunto el código. /* Cuenta las calificaciones con letras pero se usa if-else anidados en lugar de condicional switch */ #include <stdio.h> int main() { int calificacion,cuentaA = 0,cuentaB = 0,cuentaC = 0,cuentaD = 0,cuentaF = 0; printf( "**Introduzca el caracter EOF para finalizar la entrada de datos**\n" ); printf( "\nIntroduzca la letra de la calificacion: " ); while ( ( calificacion = getchar() ) != EOF ) { if( calificacion =='a' || calificacion == 'A' ) ++cuentaA; else if( calificacion =='b' || calificacion == 'B' ) ++cuentaB; else if( calificacion =='c' || calificacion == 'C' ) ++cuentaC; else if( calificacion =='d' || calificacion == 'D' ) ++cuentaD; else if( calificacion =='f' || calificacion == 'F' ) ++cuentaF; else{ printf( "**Introdujo una letra incorrecta**" ); printf( "\nIntroduzca una nueva calificacion: " ); } } printf( "\nLos totales por calificacion son:\n" ); printf( "A: %d\n", cuentaA ); printf( "B: %d\n", cuentaB );printf ( "C: %d\n", cuentaC );printf ( "D: %d\n", cuentaD ); printf( "F: %d\n", cuentaF ); return 0; }
Y claro me gustaría como tratar este supuesto caso default pero adaptado a if-else.. sin que me arroje en cada petición de introducción de carácter lo que les indico.. Muchas gracias
|
|
« Última modificación: 14 Mayo 2014, 22:08 pm por ++c »
|
En línea
|
|
|
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
int calificacion;
Lo primero que veo es que declaras calificación como un entero, y luego lo comparas como un carácter
Si no quieres cambiar esa declaración, puedes dejarlo así while ( ( calificacion = getchar() ) != EOF ) { getchar(); #Este getchar esta para que se coma el intro if( (char)calificacion =='a' || (char)calificacion == 'A' ) ++cuentaA; else if( (char)calificacion =='b' || (char)calificacion == 'B' ) ++cuentaB; else if( (char)calificacion =='c' || (char)calificacion == 'C' ) ++cuentaC; else if( (char)calificacion =='d' || (char)calificacion == 'D' ) ++cuentaD; else if( (char)calificacion =='f' || (char)calificacion == 'F' ) ++cuentaF; else{ printf( "**Introdujo una letra incorrecta**" ); printf( "\nIntroduzca una nueva calificacion: " ); } }
Si te fijas he añadido un getchar() para que se coma el intro, tal y como lo tienes puesto, cuando introduces un caracter, por ejemplo la 'a', en el buffer se queda algo como 'a\n', ya que \n es el salto de linea, por lo que incrementaria cuentaA y luego verias el error del caracter incorrecto, al poner el getchar, lo que haces es calificacion = (int)a; y el siguiente getchar, se traga el \n
Saludos
|
|
« Última modificación: 14 Mayo 2014, 23:16 pm por MeCraniDOS »
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
estoy intentando de intercambiar la sentencia switch por un if-else anidado y mi problema viene acarreado a la hora de que cada vez se ejecuta una sentencia se ejecuta igualmente el último else Como ya te indico MeCraniDOS el problema que tienes es un error logico: al introducir la calificacion seguida de un avance de linea este lo procesas y por supuesto se considerara una entrada no valida. Soluciones hay varias: descartar el resto de la linea mediante un bucle, leer el caracter con scanf utilizando el especificador " %c", etc.. int calificacion;
Lo primero que veo es que declaras calificación como un entero, y luego lo comparas como un carácter No hay problema con ello ya que el retorno de getchar, la macro EOF y los caracteres literales como 'a', 'b', etc. son todos de tipo int. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
++c
Desconectado
Mensajes: 29
|
Hola gracias por los sabios consejos, he aprendido con sus explicaciones varias formas para solventar este problema.
No caía en ese salto de línea que me producía el que se tragara el último else...
Me gustaría conocer para futuros problemas como o que medios usan para corregir o detectar errores, he visto uso de debugger o imprimir por pantalla lo que deseo ver si se ejecuta adecuadamente... no se si voy bien encaminado....
Me despido agradeciendo de nuevo su ayuda.
Saludos
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda en un menu en switch
« 1 2 3 »
Programación C/C++
|
poisonkhriz
|
27
|
24,038
|
20 Marzo 2011, 19:40 pm
por Akai
|
|
|
Ayuda con switch(urgente)
Programación C/C++
|
eltyh
|
3
|
3,001
|
5 Junio 2011, 00:17 am
por eltyh
|
|
|
ayuda con red+switch+router
Redes
|
SystemLinux
|
0
|
2,882
|
7 Noviembre 2011, 01:53 am
por SystemLinux
|
|
|
Ayuda con el switch
Programación C/C++
|
MGMR
|
2
|
1,789
|
31 Marzo 2015, 03:23 am
por MGMR
|
|
|
Ayuda con un switch
Programación C/C++
|
ZeroMiku
|
7
|
3,418
|
14 Febrero 2016, 18:57 pm
por abaadoon
|
|