Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con if..else anidado

Estas en el tema de problema con if..else anidado en el foro de C/C++ en Foros del Web. El problema que tengo esta en las instrucciones if else anidadas: Código: #include <stdio.h> /*Este programa lee caracteres representados como calificaciones y al final despliega ...
  #1 (permalink)  
Antiguo 22/04/2015, 21:50
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 5 meses
Puntos: 0
problema con if..else anidado

El problema que tengo esta en las instrucciones if else anidadas:

Código:
#include <stdio.h>                              /*Este programa lee caracteres representados como calificaciones y al final despliega el numero de calificaciones por letra*/

int main ()
{
	int calificacion;
	int cuentaA = 0;
	int cuentaB = 0;
	int cuentaC = 0;
	int cuentaD = 0;
	int cuentaF = 0;
	
	printf("Introduzca la letra que corresponde a la calificacion\n");
	printf("Introduzca el caracter EOF para finalizar la entrada de datos\n");
	
	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("Introduzco una letra incorrecta\n");
		     printf("Introduzca una nueva calificacion\n");
		 }
		     
	}
	
	printf("Los 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; 
	
}
La cosa es que el programa si funciona, pero cada vez que introduzco un caracter siempre se despliega el ultimo else, quisiera saber cual es la razon, pues tengo entendido que una vez una condicion if se toma como verdadera se ignora todo lo demas.
Gracias
  #2 (permalink)  
Antiguo 22/04/2015, 22:21
 
Fecha de Ingreso: noviembre-2010
Mensajes: 9
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: problema con if..else anidado

Hola Bradeu55, creo que el problema que tienes es que despues de cada "else" debes abrir corchete "{" y posteriormente cerrarlos al finalizar las sentencia necesarias, ejemplo:

while ((calificacion = getchar()) != EOF)
{
if (calificacion == 'A' || calificacion == 'a'){
cuentaA++;
}
else
{
if (calificacion == 'B' || calificacion == 'b')
{
cuentaB++;
}
else
{
.
.
.
}
  #3 (permalink)  
Antiguo 22/04/2015, 22:58
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 9 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
  #4 (permalink)  
Antiguo 22/04/2015, 23:10
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 9 meses
Puntos: 38
Respuesta: problema con if..else anidado

El bucle se ejecuta tantas veces como letra hay por que solo esperas recibir un unoco char por vez.

Seria un autentico desastre si por ejemplo tuvieras dentro del while un scanf que esperara una cadena de caracteres y esa por ejemplo solo le cabe 10 letras y tu te tiras media hora poniendo letras en el getchar, total, cuando pulsaras el enter y tuvieras más de 9 letras en el buffer (9+\n=10) irías salir de rango ya que la cadena solo espera 9 letras y tu le has enviado yo que se cuantos. ¡Seria un desastre total! =O, cuidado con eso XDD

PD lo siento pero me salio doble post lo siento. =(

Etiquetas: char, funcion, int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:08.