Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ++c en 14 Mayo 2014, 22:03 pm



Título: ayuda intercambiando switch por if-else
Publicado por: ++c en 14 Mayo 2014, 22:03 pm
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:

Código
  1. else{
  2.                printf( "**Introdujo una letra incorrecta**" );
  3.                printf( "\nIntroduzca una nueva calificacion: " );
  4.        }
  5.  

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.

Código
  1. /* Cuenta las calificaciones con letras pero se usa if-else anidados en lugar de condicional switch */
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.   int calificacion,cuentaA = 0,cuentaB = 0,cuentaC = 0,cuentaD = 0,cuentaF = 0;
  7.  
  8.   printf(  "**Introduzca el caracter EOF para finalizar la entrada de datos**\n"  );
  9.   printf(  "\nIntroduzca la letra de la calificacion: "  );
  10.  
  11.   while ( ( calificacion = getchar() ) != EOF ) {
  12.  
  13.        if( calificacion =='a' || calificacion == 'A' )
  14.                ++cuentaA;
  15.        else if( calificacion =='b' || calificacion == 'B' )
  16.                ++cuentaB;
  17.        else if( calificacion =='c' || calificacion == 'C' )
  18.                ++cuentaC;
  19.        else if( calificacion =='d' || calificacion == 'D' )
  20.                ++cuentaD;
  21.        else if( calificacion =='f' || calificacion == 'F' )
  22.                ++cuentaF;
  23.        else{
  24.                printf( "**Introdujo una letra incorrecta**" );
  25.                printf( "\nIntroduzca una nueva calificacion: " );
  26.        }
  27.   }
  28.   printf( "\nLos totales por calificacion son:\n" );
  29.   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 );
  30.   return 0;
  31. }
  32.  

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


Título: Re: ayuda intercambiando switch por if-else
Publicado por: MeCraniDOS en 14 Mayo 2014, 23:07 pm
Código
  1. int calificacion;

Lo primero que veo es que declaras calificación como un entero, y luego lo comparas como un carácter  :silbar:



Si no quieres cambiar esa declaración, puedes dejarlo así

Código
  1.  while ( ( calificacion = getchar() ) != EOF ) {
  2.  
  3.       getchar(); #Este getchar esta para que se coma el intro
  4.  
  5.       if( (char)calificacion =='a' || (char)calificacion == 'A' )
  6.               ++cuentaA;
  7.       else if( (char)calificacion =='b' || (char)calificacion == 'B' )
  8.               ++cuentaB;
  9.       else if( (char)calificacion =='c' || (char)calificacion == 'C' )
  10.               ++cuentaC;
  11.       else if(  (char)calificacion =='d' ||  (char)calificacion == 'D' )
  12.               ++cuentaD;
  13.       else if(  (char)calificacion =='f' ||  (char)calificacion == 'F' )
  14.               ++cuentaF;
  15.       else{
  16.               printf( "**Introdujo una letra incorrecta**" );
  17.               printf( "\nIntroduzca una nueva calificacion: " );
  18.       }
  19.  }

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


Título: Re: ayuda intercambiando switch por if-else
Publicado por: rir3760 en 15 Mayo 2014, 04:39 am
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..

Código
  1. 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


Título: Re: ayuda intercambiando switch por if-else
Publicado por: ++c en 15 Mayo 2014, 22:03 pm
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