Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda con while

Iniciado por player, 29 de Junio de 2009, 09:39:42 PM

« anterior - próximo »

player

Hola a todos. Esta vez tengo una duda con el while. Estoy intentado hacer un programa en el que yo introduzco la gasolina y los km que recorro con el coche en distintos viajes y en el momento que introduzca que el valor de la gasolina sea -1 debe salir del while y calcularme la media total de todos los viajes. El código es el siguiente:

#include <stdio.h>
#include <conio.h>

main()
{
     
     /*inicializacion de las variables*/
   
     int total, contador, gasolina, km, resultadoViaje, resultadoTotal;
     
     total=0;
     contador=0;
     
     /* fase de proceso*/
     
     printf("Introduce la gasolina consumida, (-1 para terminar):");
     scanf("%d", &gasolina);
     
     printf("\nIntroduce los km recorridos, (-1 para terminar):");
     scanf("%d", &km);
             
     resultadoViaje = (km + gasolina)/2;     
     printf("\nLa media de este viaje fue: %d\n", resultadoViaje);
     
                     
     while ( gasolina != -1){
           
           total = total + resultadoViaje;
           contador = contador + 1;
           
                   
     printf("\nIntroduce la gasolina consumida, (-1 para terminar):");
     scanf("%d", &gasolina);
                 
     
     printf("\nIntroduce los km recorridos, (-1 para terminar):");
     scanf("%d", &km);
             
     resultadoViaje= (km + gasolina)/2;     
     printf("\nLa media de este viaje fue: %d\n", resultadoViaje);
     }
   

/* fase final */
 
  if (contador !=0){
    resultadoTotal = total / contador;
    printf("El resultado total es: %d", resultadoTotal);
    }
     
    getch();
    return 0;
}

El problema es que al meter la gasolina como -1 me vuelve a hacer todo el while teniendo que meter de nuevo los km como -1, me dice que la media del viaje es -1 y a continuación me da el total de todos los viajes. Cómo puedo hacer para que sólo metiendo el -1 en gasolina me saque del while y me de el resultado total? Llevo varias horas dándole vueltas y no consigo verlo. Gracias.

Zaelsius

Así?


   while ( gasolina != -1){
           
           total = total + resultadoViaje;
           contador = contador + 1;
           
                   
     printf("\nIntroduce la gasolina consumida, (-1 para terminar):");
     scanf("%d", &gasolina);
     
     if ( gasolina != -1 )
     {
     
        printf("\nIntroduce los km recorridos, (-1 para terminar):");
        scanf("%d", &km);
             
        resultadoViaje= (km + gasolina)/2;     
        printf("\nLa media de este viaje fue: %d\n", resultadoViaje);
     }

     }


Una solución de entre muchas,espero que te sirva.

player

#2
Sí, más o menos así pero necesito que cuando me pida que introduzca la gasolina, si le meto el valor -1 me saque del while y me de la media total de todos los valores que he metido. Si el total de los valores es 1140 y he metido los datos 6 veces, me hará

resultadoTotal = total / contador;

El código que me has puesto me funciona pero al meter el valor -1 me saca del programa y no me da el resultado total. Estoy intentando arreglarlo para que me de el resultado pero me pasa lo mismo de antes, que me hace meter el -1 dos veces, me da el resultado y sale del programa. Seguiré intentándolo media hora más por mi cuenta y si no lo consigo me paso por aquí a ver si me habéis puesto alguna solución.

ZaelSiuS muchas gracias por tu ayuda!!!, por cierto aunque esto ya no entra en el tema, vi un vídeo tuyo en el que salías en canal9 y te entrevistaban, jeje. Saludos.

player

Bueno he intentado arreglarlo con un else y ya me saca del while y me da el resultado, lo que pasa que siempre me da un resultado que no es meta los datos que meta (7776611) y creo que es porque no pongo la línea de   resultadoTotal= total / contador;   donde debo, dejo el código de nuevo a ver si me podéis explicar por qué pasa esto al ponerla después del else y cuál es su solución. Gracias!!!

#include <stdio.h>
#include <conio.h>

main()
{
     
     int total, contador, gasolina, km, resultadoViaje, resultadoTotal;
     
     total=0;
     contador=0;
         
     while ( gasolina != -1){
           
           total = total + resultadoViaje;
           contador = contador + 1;
           
                   
     printf("\nIntroduce la gasolina consumida, (-1 para terminar):");
     scanf("%d", &gasolina);
     
     if ( gasolina != -1 )
     {
     
        printf("\nIntroduce los km recorridos, (-1 para terminar):");
        scanf("%d", &km);
             
        resultadoViaje= (km + gasolina)/2;     
        printf("\nLa media de este viaje fue: %d\n", resultadoViaje);
     }
      else {
          resultadoTotal= total / contador;
          printf("La media total es: %d", resultadoTotal);
         
           }
     }
     getch();
     
     return 0;
     
}

t-spy

Tienes algunos errores:

- El contador y el total se deben incrementar después de haber calculado la ruta. Al ponerlo donde lo tienes el contador se incrementa cada vez que entras en el bucle, tanto si introduces un -1 a gasolina como si no.

- Por lo que parece buscas obtener la media de consumo del coche. Si es así, la fórmula (km + gasolina ) / 2 es erronea.

- Tienes que controlar que se haya dado al menos un valor o te dará un error de división por 0 al obtener el resultado total.


player

#5
Cita de: t-spy
Tienes algunos errores:

- El contador y el total se deben incrementar después de haber calculado la ruta. Al ponerlo donde lo tienes el contador se incrementa cada vez que entras en el bucle, tanto si introduces un -1 a gasolina como si no.

Entonces debería ir al final no? Pero si lo pongo al final del else, cuando meta -1 y me saque del while lo almacenará en total y volverá a sumar el contador no? Y si lo pongo al final del if como he hecho ahora, ya almacenará el valor en total y sumará al contador 1 y cuando meta -1 lo pasará por alto y me calculará el resultadoTotal. Es así?

if ( gasolina != -1 )
     {
     
        printf("\nIntroduce los km recorridos, (-1 para terminar):");
        scanf("%d", &km);
             
        resultadoViaje= (km + gasolina)/2;     
        printf("\nLa media de este viaje fue: %d\n", resultadoViaje);


           total = total + resultadoViaje;
           contador = contador + 1;
     

}
      else {
          resultadoTotal= total / contador;
          printf("La media total es: %d", resultadoTotal);
         
           }
         

Cuando realiza los cálculos almacena el valor del viaje en total y suma 1 al contador, es correcto?

Cita de: t-spy
- Por lo que parece buscas obtener la media de consumo del coche. Si es así, la fórmula (km + gasolina ) / 2 es erronea.
Sí. cuál sería la fórmula, km / gasolina consumida?

Cita de: t-spy
- Tienes que controlar que se haya dado al menos un valor o te dará un error de división por 0 al obtener el resultado total.
Cómo hago eso?

Muchas gracias por la ayuda.

player

Ya he conseguido que me haga bien los cálculos y me calcule el total al poner -1. Ha quedado así:



#include <stdio.h>
#include <conio.h>

main()
{
     
     float total, contador, gasolina, km, resultadoViaje, resultadoTotal;
     
     total=0;
     contador=0;
       
     while ( gasolina != -1){
           
                 
                   
     printf("\nIntroduce la gasolina consumida, (-1 para terminar):");
     scanf("%f", &gasolina);
     
     if ( gasolina != -1 )
     {
     
        printf("\nIntroduce los km recorridos, (-1 para terminar):");
        scanf("%f", &km);
             
        resultadoViaje= (km + gasolina)/2;     
        printf("\nLa media de este viaje fue: %f\n", resultadoViaje);
   
           total = total + resultadoViaje;
           contador = contador + 1;
     
     }
      else {
          resultadoTotal= (total / contador);
          printf("La media total es: %f", resultadoTotal);
         
           }
     }
     getch();
     
     return 0;
     
}


He cambiando los int por float para poder calcularlo en decimales. Falta ver lo de la fórmula del consumo medio y lo de controlar que se haya dado al menos un valor, que no sé hacerlo.

t-spy

CitarFalta ver lo de la fórmula del consumo medio y lo de controlar que se haya dado al menos un valor, que no sé hacerlo.

La fórmula es gasolina/km. Puedes multiplicar el resultado por 100 para conseguir el consumo que te dan como referencia en todas partes (consumo por 100 Km).

Lo de la división es facil: comprueba que contador sea mayor de 0 antes de la división final.

player

Bueno ya he hecho unas cuantas modificaciones, a ver qué tal:


#include <stdio.h>
#include <conio.h>

main()
{
   
     /*inicializacion de las variables*/
   
     float total = 0, contador = 0, gasolina, km, resultadoViaje, resultadoTotal;
   
     /* fase de proceso*/
   
     while ( gasolina != -1)
     {
         printf("\nIntroduce la gasolina consumida, (-1 para terminar): ");
         scanf("%f", &gasolina);
         if(gasolina != -1)
         {
            printf("\nIntroduce los km recorridos: ");
            scanf("%f", &km);
            resultadoViaje= (gasolina/km)*100;
            printf("\nEl consumo por 100km de este viaje es: %f\n", resultadoViaje);
            total += resultadoViaje;
            contador++;
         }
     }
   

/* fase final */

   if (contador > 0)
   {
     resultadoTotal = total / contador;
     printf("El resultado total es: %f", resultadoTotal);
   }
   else
       printf("No se ha introducido ningun dato");
     getch();
     return 0;
}


Bueno creo que ahora ya esta todo, gracias a los 2, he aprendido bastante con vuestra ayuda aunque aun queda mucho camino y me veréis más veces por aquí, jeje. Si tenéis alguna observación o corrección más no dudéis en decírmelo.

Buffon

poner un while ( X != -1) y dentro un if ( X != -1) es muy feo.

te recomiendo que lo cambies a como sigue:


     /* fase de proceso*/
     printf("\nIntroduce la gasolina consumida, (-1 para terminar): ");
     scanf("%f", &gasolina);

     while ( gasolina != -1)
     {
            printf("\nIntroduce los km recorridos: ");
            scanf("%f", &km);
            resultadoViaje= (gasolina/km)*100;
            printf("\nEl consumo por 100km de este viaje es: %f\n", resultadoViaje);
            total += resultadoViaje;
            contador++;

            printf("\nIntroduce la gasolina consumida, (-1 para terminar): ");
            scanf("%f", &gasolina);
     }


Si te fijas, perdemos el if y realizamos la llamada a recoger otra vez gasolina al final del código, así, si introduce un -1, sale directamente del bucle.

player

Entonces, por norma general, poner un if dentro de un while es una solución no muy recomendable o sólo en este caso en el que if y while están realizando la misma condición?

Muchas gracias por tu corrección Buffon.

Buffon

dentro de un while puedes tener if perfectamente, pero como acabas de responderte a ti mismo, no es recomendable utilizar la misma condición, no políticamente recomendable.

Si te encontraras en un caso que no tienes otra forma de resolverlo, piensa en las funciones matemáticas.

x < 0 -> f(x) = x*3
x >= 0 -> f(x) = x

si tubieras que hacer un estudio sobre esa función, con un for, si tendrías que tener un if dentro.


for(int i = -infinito; i < infinito; i++)
{
     if(i < 0)
     {
          //trabajamos con la funcion f(x) = x*3
     }
     else  //if(i >= 0)
     {
          //trabajamos con la funcion f(x) = x
     }
}


Pero para tu caso, se mantiene siempre una estructura lógica.

while( (r = leerEntrada) != VALOR_SALIDA)
{
         hago cosas
}


Buffon

perdón, más que estructura lógica, se sigue una estructura más legible :P

player

Entendido Buffon, gracias, estoy aprendiendo bastante en este foro!!!

Mars Attacks

Sólo por añadir alguna cosa a las soluciones iniciales de player: acostúmbrate a inicializar las variables al comienzo. Gasolina podría valer perfectamente -1 si estuvieras compilando en release.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.