Foros - Stratos

Stratos => Principiantes => Mensaje iniciado por: player en 29 de Junio de 2009, 09:39:42 PM

Título: Duda con while
Publicado por: player en 29 de Junio de 2009, 09:39:42 PM
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.
Título: Re: Duda con while
Publicado por: Zaelsius en 29 de Junio de 2009, 11:44:02 PM
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.
Título: Re: Duda con while
Publicado por: player en 30 de Junio de 2009, 12:06:09 AM
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.
Título: Re: Duda con while
Publicado por: player en 30 de Junio de 2009, 12:23:53 AM
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ítulo: Re: Duda con while
Publicado por: t-spy en 30 de Junio de 2009, 09:32:48 AM
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.

Título: Re: Duda con while
Publicado por: player en 30 de Junio de 2009, 10:10:57 AM
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.
Título: Re: Duda con while
Publicado por: player en 30 de Junio de 2009, 10:52:33 AM
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ítulo: Re: Duda con while
Publicado por: t-spy en 30 de Junio de 2009, 09:33:44 PM
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.
Título: Re: Duda con while
Publicado por: player en 30 de Junio de 2009, 10:35:26 PM
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.
Título: Re: Duda con while
Publicado por: Buffon en 01 de Julio de 2009, 09:17:55 AM
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.
Título: Re: Duda con while
Publicado por: player en 01 de Julio de 2009, 09:39:52 AM
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.
Título: Re: Duda con while
Publicado por: Buffon en 01 de Julio de 2009, 11:31:50 AM
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
}

Título: Re: Duda con while
Publicado por: Buffon en 01 de Julio de 2009, 11:33:02 AM
perdón, más que estructura lógica, se sigue una estructura más legible :P
Título: Re: Duda con while
Publicado por: player en 01 de Julio de 2009, 11:47:02 AM
Entendido Buffon, gracias, estoy aprendiendo bastante en este foro!!!
Título: Re: Duda con while
Publicado por: Mars Attacks en 11 de Julio de 2009, 12:42:04 PM
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.
Título: Re: Duda con while
Publicado por: player en 11 de Julio de 2009, 05:23:20 PM
Cita de: Mars Attacks en 11 de Julio de 2009, 12:42:04 PM
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.
Gracias por el apunte, lo tengo en cuenta desde entonces.
Título: Re: Duda con while
Publicado por: Buffon en 12 de Julio de 2009, 12:14:35 PM
putos compiladores tontos !!! :)

instalate cygwin y compila con él xD