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

[SOLUCIONADO] Problema con while en C

Estas en el tema de Problema con while en C en el foro de C/C++ en Foros del Web. Hola estoy empezando a programar en C y estoy con un ejercicio de calculo de promedio de unas calificaciones con while que a mi entender ...
  #1 (permalink)  
Antiguo 03/05/2014, 22:25
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 6 meses
Puntos: 1
Problema con while en C

Hola estoy empezando a programar en C y estoy con un ejercicio de calculo de promedio de unas calificaciones con while que a mi entender deberia funcionar pero no lo hace! Aqui esta mi codigo
Código:
//3.8 CLASS AVERAGE PROGRAM WITH SENTINEL CONTROLLED REPETITION
#include <stdio.h>

int main (void)
{
    int counter;//number of grades entered
    int grade;//grades value
    int total;//sum of grades
    float average;//average

    //initialization phase
    total = 0;
    counter = 0;
    grade = 0;

    //processing phase
    while( grade != -1) {
        puts( "Please type the grade and press enter. To finish type \"-1\"." );//asks user to type a grade
        scanf( "%d", &grade );//stores the grade typed by the user into the grade variable
        total = total + grade;//adds the grade typed by the user to the total
        counter = counter + 1;//adds one to the counter
    }//end while

    //termination phase
    //if counter is not equal to zero, calculate the average and print it, if not print "No grades were entered"
    if( counter != 0){
        average = ( float ) total / counter;
        printf( "Average is %.2f\n", average );
    }//end if
    else{
        puts( "No grades were entered" );
    }//end else
}//end main
y aqui esta el codigo que funciona, pero me gustaría entender por que el mio no lo hace:
Código:
//3.8 CLASS AVERAGE PROGRAM WITH SENTINEL CONTROLLED REPETITION
#include <stdio.h>

int main (void)
{
    int counter;//number of grades entered
    int grade;//grades value
    int total;//sum of grades
    float average;//average

    //initialization phase
    total = 0;
    counter = 0;

    //processing phase
        puts( "Please type the grade and press enter. To finish type \"-1\"." );//asks user to type a grade
        scanf( "%d", &grade );//stores the grade typed by the user into the grade variable

    while( grade != -1) {
        total = total + grade;//adds the grade typed by the user to the total
        counter = counter + 1;//adds one to the counter
        puts( "Please type the grade and press enter. To finish type \"-1\"." );//asks user to type a grade
        scanf( "%d", &grade );//stores the grade typed by the user into the grade variable

    }//end while

    //termination phase
    //if counter is not equal to zero, calculate the average and print it, if not print "No grades were entered"
    if( counter != 0){
        average = ( float ) total / counter;
        printf( "Average is %.2f\n", average );
    }//end if
    else{
        puts( "No grades were entered" );
    }//end else
}//end main
Desde ya MUCHAS GRACIAS!

Última edición por Virtualforos; 03/05/2014 a las 22:32
  #2 (permalink)  
Antiguo 04/05/2014, 00:48
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 3 meses
Puntos: 5
Respuesta: Problema con while en C

hola amigo.
bueno tu codigo quedaria asi si lo quiseras hacer mateniendo tu estructura actual de programa.
bueno no te daba el promedio correcto porque te voy a tratar de poner un ejemplo:
la primera vez que que pedias la calificacion se la sumabas a totatal algo asi.
ingresa calificaciones
3
lo que hacias era hacer esta suma
como total vale 0 entonces seria asi.
total = 0 + 3;
entonces total vale tres

buelves a preguntas.
ingresa la calificacion para alir preciona -1
-1

ahora la suma seria asi.
total = 3 -1;
por que menos uno por que fue el valor que se introdujo y se guardo en grade
y la suma es total = total +grade; como grade vale -1 y total 3 entonces da un resultado de 2.

ese es uno de lo problemas.
el otro es cadavez que repites while counter aunmenta uno entonces si agolo siguiente:
introduce el numero preciona -1 para salir.
3
introduce el numero preciona -1 para salir.
-1
entonces aqui cunte ya vale dos por que uno fue por la calificacion y otro por que tube que decirle -1 para poder salir del while.

la divicion seri asi
average = total/counter:
que en realidad serea asi.
average = 2/2;
por eso da resultados erroneas por que las suma y la divicion estban mas echas.

buno y la solucion solo es sumarle uno a total y restarle uno a counter para que los valores ya sean los verdaderos.

con esto creo que ya sabrias por que el otro codigo esta bien.
por que primero pregunta la primera calificacion despues inicia el while y hace la suma e incremeta count en 1 entonces al intoducir la ultima calificacion como se intoduce -1 se sale del while y entonces ya no se ejcuta la suma de nuevo por eso no se le resta -1 y pues como el while se repite solo las veces exactas count queda con su valor corecto y al acer la divicion todo sale bien.

bueno espero que te me haya entendido.
Código C:
Ver original
  1. //3.8 CLASS AVERAGE PROGRAM WITH SENTINEL CONTROLLED REPETITION
  2. #include <stdio.h>
  3.  
  4. int main (void)
  5. {
  6.     int counter;//number of grades entered
  7.     int grade;//grades value
  8.     int total;//sum of grades
  9.     float average;//average
  10.  
  11.     //initialization phase
  12.     total = 0;
  13.     counter = 0;
  14.     grade = 0;
  15.    
  16.     //processing phase
  17.    
  18.    
  19.     while( grade != -1) {
  20.         puts( "Please type the grade and press enter. To finish type \"-1\"." );//asks user to type a grade
  21.         scanf( "%d", &grade );//stores the grade typed by the user into the grade variable
  22.         total = total + grade;//adds the grade typed by the user to the total
  23.         counter = counter +1;//adds one to the counter
  24.        
  25.     }//end while
  26.    
  27.     //termination phase
  28.     //if counter is not equal to zero, calculate the average and print it, if not print "No grades were entered"
  29.     if( counter != 0){
  30.         counter = counter -1;
  31.         total = total +1;
  32.         printf("%d %d\n", counter, total);
  33.        
  34.         average = ( float )total / counter;
  35.         printf( "Average is %.2f\n", average );
  36.     }//end if
  37.     else{
  38.         puts( "No grades were entered" );
  39.     }//end else
  40. }//end main
saludos drewermerc.
  #3 (permalink)  
Antiguo 04/05/2014, 01:29
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema con while en C

hay varios errores ahí no de programación sino de lógica.

si quieres obtener una media pues deberas que dividir algo por algo no o sea el numero entrado dividido por la cantidad que es el contador.

Bien te voy a decir lo que he visto malo y lo arreglas.
cuando pongo el 5 cuatro veces y lo vas sumando tendria que dar 20 pero cuando al seguiente bucle le pongo el -1 para salir es como si le estoy sumando un -1 :S

debes poner algo que haga una comprobacion que si el valor entrado es diferente de -1 solo entonces se incrementa y hace la suma por que ambos funcionan una vez mas para que pulses ese -1.
si pongo 5 5 5 5 y después -1 es como sumar 5+5+5+5+-1 eso es fatal :O
Ademas el contador tambien funciona una vez mas para el -1 si son 4 numeros entrados esta dividiendo por 5 fatalfatal jeje

eso se arregla así:
Código C++:
Ver original
  1. if (grade != -1){
  2.            total = total + grade;//adds the grade typed by the user to the total
  3.            counter = counter + 1;//adds one to the counter
  4.         }


Código C++:
Ver original
  1. //3.8 CLASS AVERAGE PROGRAM WITH SENTINEL CONTROLLED REPETITION
  2. #include <stdio.h>
  3.  
  4. int main (void)
  5. {
  6.     int counter;//number of grades entered
  7.     int grade;//grades value
  8.     int total;//sum of grades
  9.     float average;//average
  10.  
  11.     //initialization phase
  12.     total = 0;
  13.     counter = 0;
  14.     grade = 0;
  15.  
  16.     //processing phase
  17.     while( grade != -1) {
  18.         puts( "Please type the grade and press enter. To finish type \"-1\"." );//asks user to type a grade
  19.         scanf( "%d", &grade );//stores the grade typed by the user into the grade variable
  20.        
  21.         if (grade != -1){ //Mi solucion
  22.             total = total + grade;//adds the grade typed by the user to the total
  23.             counter = counter + 1;//adds one to the counter
  24.         }
  25.        
  26.     }//end while
  27.  
  28.     printf( "total%d, contador%d\n", total, counter ); // con esta linea ves lo que vale ambos valores antes de hacer el (total / counter), hacer comprobaciones sirve para tener un mayor control. prueba añadir esta linea a tu programa anterior y lo veras lo que digo XDD
  29.    
  30.     //termination phase
  31.     //if counter is not equal to zero, calculate the average and print it, if not print "No grades were entered"
  32.     if( counter != 0){
  33.         average = ( float ) (total / counter); // Aemas encerrar (total/counter) para obligar a hacer el calculo antes del cast
  34.         printf( "Average is %.2f\n", average );
  35.     }//end if
  36.     else{
  37.         puts( "No grades were entered" );
  38.     }//end else
  39. }//end main

Ademas he señalado algo que es encerrar (total / counter) para obligar a que haga el calculo antes del cast (float).

El programa parece funcionar ahora.
  #4 (permalink)  
Antiguo 04/05/2014, 11:56
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema con while en C

Como ustedes bien señalaban el primer ingreso a while se hace con el valor de grade = 0, por lo que si yo ingreso -1 se suma (en vez de terminar el while) y se agrega 1 a counter, desvirtuando completamente el programa. Ahora lo veo, muchas gracias por su ayuda, son muy amables compas!!!!!!!!
  #5 (permalink)  
Antiguo 04/05/2014, 14:55
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema con while en C

usa el printf() para controlar esos números cuando no vaya bien.
Si algo no sale como esperas es por que los valores que le llegan no son correctos y eso puedes saber en todo el momento haciendo esas comprobaciones, luego cuando veas que va bien las borras ;)
Suerte.

Etiquetas: funcion, int, 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 12:06.