elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda intercambiando switch por if-else
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda intercambiando switch por if-else  (Leído 1,745 veces)
++c

Desconectado Desconectado

Mensajes: 29


Ver Perfil
ayuda intercambiando switch por if-else
« 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


« Última modificación: 14 Mayo 2014, 22:08 pm por ++c » En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: ayuda intercambiando switch por if-else
« Respuesta #1 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


« Ú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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda intercambiando switch por if-else
« Respuesta #2 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
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 Desconectado

Mensajes: 29


Ver Perfil
Re: ayuda intercambiando switch por if-else
« Respuesta #3 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en un menu en switch « 1 2 3 »
Programación C/C++
poisonkhriz 27 23,839 Último mensaje 20 Marzo 2011, 19:40 pm
por Akai
Ayuda con switch(urgente)
Programación C/C++
eltyh 3 2,961 Último mensaje 5 Junio 2011, 00:17 am
por eltyh
ayuda con red+switch+router
Redes
SystemLinux 0 2,852 Último mensaje 7 Noviembre 2011, 01:53 am
por SystemLinux
Ayuda con el switch
Programación C/C++
MGMR 2 1,749 Último mensaje 31 Marzo 2015, 03:23 am
por MGMR
Ayuda con un switch
Programación C/C++
ZeroMiku 7 3,359 Último mensaje 14 Febrero 2016, 18:57 pm
por abaadoon
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines