Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/04/2015, 22:58
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: problema con if..else anidado

no es que siempre te despliega el else. se ve que no entiendes como trabaja el getchar, es un poco complicado pero venga vamos allá.

tu crees que el getchar solo lee una letra y la guarda en calificación pero en realidad getchar trabaja bastante distinto de eso XD

Digamos que getchar lo que hace es vaciar el buffer. si pulso a + b + c y por ultimo el enter

en el buffer tengo un bonito string asi: "abc\n", o sea que te va funcionar 4 veces el ciclo while XD

getchar espera que pulses todas las teclas que quieras y las va metiendo en el buffer, el lo que espera es la tecla enter que es la que dice "vanga, ya me harto de meter letras en el buffer, librate de ellas XD", hasta que no se deshaga de todas no se para el tio. XD

te demuestro ;)
Ejecuta eso:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main () {
  4.     int letra = 0;
  5.     int contador = 1;
  6.     while ( ( letra = getchar() ) != EOF ) {
  7.         printf ( "bucle%d: %c\n", contador, letra );
  8.         contador++;
  9.     }
  10.    
  11.     return 0;
  12. }
Venga escribe una bonita cadena y vea como se va ejecutar el bucle tantas veces como letras tengas en la cadena incluyendo el enter ;)

Ahora que te has quedado de piedra y ya sabes como funciona getchar buscamos la solución.

Solución 1, usar scanf, solución 2 poner todo lo que se imprime dentro del else y limpiar la pantalla antes de imprimir XD. El bucle se ejecuta 2 veces, una por la letra y la otra por el enter, pero solo la letra produce los cambios el enter conduce al else que es cuando se imprime =D. ¡Ah! Por cierto, para salir del bucle ese debes pulsar control+letraZ o nunca saliras de el, esa combinaciones de tecla en windows simula el EOF que se necesita para salir ;)

vamos con la solucion2:
Código C:
Ver original
  1. #include <stdio.h>                              /*Este programa lee caracteres representados como calificaciones y al final despliega el numero de calificaciones por letra*/
  2. #include <stdlib.h>
  3. int main () {
  4.     int calificacion = 0;
  5.     int residuo;
  6.     int cuentaA = 0;
  7.     int cuentaB = 0;
  8.     int cuentaC = 0;
  9.     int cuentaD = 0;
  10.     int cuentaF = 0;
  11.    
  12.     printf ( "Introduzca la letra que corresponde a la calificacion\n" );
  13.     printf ( "Introduzca el caracter EOF(Control+z en windows) para finalizar la entrada de datos\n" );
  14.    
  15.     while ( ( calificacion = getchar() ) != EOF ) {
  16.    
  17.         if ( calificacion == ( int ) 'A' || calificacion == 'a' ) {
  18.             cuentaA++;
  19.         } else if ( calificacion == 'B' || calificacion == 'b' ) {
  20.             cuentaB++;
  21.         } else if ( calificacion == 'C' || calificacion == 'c' ) {
  22.             cuentaC++;
  23.         } else if ( calificacion == 'D' || calificacion == 'd' ) {
  24.             cuentaD++;
  25.         } else if ( calificacion == 'F' || calificacion == 'f' ) {
  26.             cuentaF++;
  27.         } else {
  28.             system("cls");
  29.             printf ( "Los totales por calificacion son:\n" );
  30.             printf ( "A: %d\n", cuentaA );
  31.             printf ( "B: %d\n", cuentaB );
  32.             printf ( "C: %d\n", cuentaC );
  33.             printf ( "D: %d\n", cuentaD );
  34.             printf ( "F: %d\n", cuentaF );
  35.         }
  36.        
  37.        
  38.     }
  39.    
  40.    
  41.     return 0;
  42.    
  43. }

forma 1:
Código C:
Ver original
  1. #include <stdio.h>                              /*Este programa lee caracteres representados como calificaciones y al final despliega el numero de calificaciones por letra*/
  2.  
  3. int main ()
  4. {
  5.     int calificacion = 0;
  6.     int residuo;
  7.     int cuentaA = 0;
  8.     int cuentaB = 0;
  9.     int cuentaC = 0;
  10.     int cuentaD = 0;
  11.     int cuentaF = 0;
  12.    
  13.     printf("Introduzca la letra que corresponde a la calificacion\n");
  14.     printf("Pulse 0 para salir\n");
  15.     scanf("%c", &calificacion);
  16.     do{
  17.         if (calificacion == (int)'A' || calificacion == 'a'){
  18.            cuentaA++;
  19.         }
  20.         else if (calificacion == 'B' || calificacion =='b'){
  21.            cuentaB++;}                                
  22.         else if (calificacion == 'C' || calificacion =='c'){
  23.            cuentaC++;}                                
  24.         else if (calificacion == 'D' || calificacion =='d'){
  25.            cuentaD++;}                                
  26.         else if (calificacion == 'F' || calificacion =='f'){
  27.            cuentaF++;}
  28.         else{
  29.              printf("Introduzco una letra incorrecta\n");
  30.              printf("Introduzca una nueva calificacion o pulse 0 para salir\n");
  31.          }
  32.          scanf("%c", &calificacion);
  33.     }while( calificacion != (int)'0' );
  34.    
  35.     printf("Los totales por calificacion son:\n");
  36.     printf("A: %d\n", cuentaA);
  37.     printf("B: %d\n", cuentaB);
  38.     printf("C: %d\n", cuentaC);
  39.     printf("D: %d\n", cuentaD);
  40.     printf("F: %d\n", cuentaF);
  41.    
  42.     return 0;
  43.    
  44. }
Se puede mejorar ;)

Espero que te sirva.
Suerte