• Miércoles 17 de Abril de 2024, 00:27

Autor Tema:  consulta sobre un problema en C++  (Leído 13502 veces)

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
consulta sobre un problema en C++
« en: Lunes 10 de Marzo de 2014, 22:37 »
0
En un problema de programación se proporciona el siguiente enunciado y un ejemplo de la ejecución del mismo.

--- enunciado del problema ---

2.16

Los conductores están preocupados por el kilometraje recorrido por sus automóviles. Un conductor ha dado seguimiento a varios tanques de gasolina, registrando los kilómetros recorridos y los litros utilizados en ese recorrido. Desarrolle un programa en C++ que utilice una estructura while, para introducir los kilómetros recorridos y los litros utilizados de cada tanque. El programa debe calcular y desplegar los kilómetros por litro, obtenidos de cada tanque. Después de procesar toda la información de entrada, el programa debe calcular y desplegar la combinación de kilómetros por litro obtenidos por todos los tanques.

--- resultado de ejecución ---

Introduzca los litros utilizados (-1 en adelante): 12.8
Introduzca los kilometros recorridos: 287
Los kilometros / litro para este tanque fueron 22.421875

Introduzca los litros utilizados (-1 en adelante): 10.3
Introduzca los kilometros recorridos: 200
Los kilometros / litro para este tanque fueron 19.417476

Introduzca los litros utilizados (-1 en adelante): 5
Introduzca los kilometros recorridos: 120
Los kilometros / litro para este tanque fueron 24.000000

Introduzca los litros utilizados (-1 en adelante): -1

El promedio total de kilometros/litro fue de 21.601423


He desarrollado este código para resolver el problema...

Código: [Seleccionar]
// Ej. 2.16: ej02_16.cpp
// Calcular los kilometros recorridos por litro y el promedio
#include <iostream>

using std::cout;
using std::cin;
using std::endl;
using std::fixed;

#include <iomanip>

using std::setprecision;

// la función main comienza la ejecución del programa
int main()
{
double distancia;     // declara distancia
double litros;        // declara litros
double resultado;     // declara resultado
double totalkms = 0;  // declara kilometros totales
double totLitros = 0; // inicializa total litros

while ( litros != -1 ) {
// indica la entrada y obtiene el valor a partir del usuario (litros)
// -1 para terminar el ciclo while
cout << "Introduzca los litros utilizados (-1 en adelante): ";
cin >> litros;

if ( litros == -1 ) // comprueba si la entrada es -1
    break; // se salta el bloque "else" si la entrada fue -1
   
else { // si la entrada no fue -1 continua con este bloque
// indica entrada y obtiene valor del usuario (kilometros recorridos)
    cout << "Introduzca los kilometros recorridos: ";
    cin >> distancia;

    resultado = distancia / litros; // calcula los kilometros por litro
    totLitros += litros;            // calcula el total de litros consumido
    totalkms += distancia;          // calcula el total de distancia recorrida
   
    // despliega resultados por tanque
    cout << fixed << setprecision ( 6 );
    cout << "Los kilometros / litro para este tanque fueron " << resultado
         << "\n" << endl;
}

} // fin de while

// despliega el promedio a partir de las variables "totLitros" y "totalkms"
cout << "\nEl promedio total de kilometros/litro fue de "
     << totalkms / totLitros << endl;

return 0; // indica terminación exitosa

} // fin de la función main

Al crear el programa me han surgido unas dudas respecto a la estructura "if", ya que comprueba por segunda vez si el valor centinela se ha introducido, para evitar el bloque despues de "else".

Se comprueba como condición en la estructura "while" para terminar la ejecución del programa y también en "if" para evitar que sume el valor -1 a los litros e introduzca errores en el calculo del promedio, y la pregunta es, ¿si esto es necesario o existe una forma mejor de hacerlo?

Un saludo,
Nacho

chenech

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re:consulta sobre un problema en C++
« Respuesta #1 en: Martes 11 de Marzo de 2014, 00:30 »
0
Hola Nachete, yo usaría un do while ya que la compraración del while que tu haces nunca se cumplirá, ya que rompes el bucle con el break, entonces esta de mas esa comparación en el while, mira a ver que te parece asi:

Código: [Seleccionar]

// Ej. 2.16: ej02_16.cpp
// Calcular los kilometros recorridos por litro y el promedio
#include <iostream>

using std::cout;
using std::cin;
using std::endl;
using std::fixed;

#include <iomanip>

using std::setprecision;

// la función main comienza la ejecución del programa
int main()
{
double distancia;     // declara distancia
double litros;        // declara litros
double resultado;     // declara resultado
double totalkms = 0;  // declara kilometros totales
double totLitros = 0; // inicializa total litros

do
{
// indica la entrada y obtiene el valor a partir del usuario (litros)
// -1 para terminar el ciclo while
cout << "Introduzca los litros utilizados (-1 en adelante): ";
cin >> litros;

if ( litros != -1 ) // comprueba si la entrada es -1
{ // si la entrada no fue -1 continua con este bloque
// indica entrada y obtiene valor del usuario (kilometros recorridos)
cout << "Introduzca los kilometros recorridos: ";
cin >> distancia;

resultado = distancia / litros; // calcula los kilometros por litro
totLitros += litros;            // calcula el total de litros consumido
totalkms += distancia;          // calcula el total de distancia recorrida

// despliega resultados por tanque
cout << fixed << setprecision ( 6 );
cout << "Los kilometros / litro para este tanque fueron " << resultado
<< "\n" << endl;
}

} while ( litros != -1 );

// despliega el promedio a partir de las variables "totLitros" y "totalkms"
cout << "\nEl promedio total de kilometros/litro fue de "
<< totalkms / totLitros << endl;

return 0; // indica terminación exitosa

} // fin de la función main

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:consulta sobre un problema en C++
« Respuesta #2 en: Martes 11 de Marzo de 2014, 01:11 »
0
Bueno, primero de todo decir que lo he hecho así para respetar el enunciado del problema, que especifica que debe ser una estructura "while". El programa funciona y da un resultado correcto.

Efectivamente, como tu bien apuntas el "break" no solo salta la ejecución de "else", sino que sale del bucle directamente. (lo he comprobado con el debugger). Con lo cual, básicamente solo comprueba que la entrada es distinta de -1 y continua, pero cuando es igual a -1 se encarga el break de salir del bucle y no se utiliza la comparación del while. Sigue siendo necesario para los casos en que se introducen valores validos para los cálculos.

Ya me parecía a mi que la doble comparación no era una "lógica de programación" demasiado elegante, pero la verdad es que, respetando el enunciado, no se me ocurría mejor forma de hacerlo,  ya había pensado en el "do... while" pero no quise utilizarlo por lo que comento de respetar el enunciado, ya que es un ejercicio y hay que ceñirse a lo que indica.

en cualquier caso con do while me parece mas elegante y mejor planteado, pero me gustaría saber si hay mas sugerencias utilizando únicamente while

Un saludo,
Nacho

chenech

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re:consulta sobre un problema en C++
« Respuesta #3 en: Martes 11 de Marzo de 2014, 01:39 »
0
OK, que te parece entonces si lo dejas con el while y quitas el if else como tu lo tenias y dejas solo el:
if (litros != 0)

Así se saldría por el while cuando sea -1.

Un saludo.

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:consulta sobre un problema en C++
« Respuesta #4 en: Martes 11 de Marzo de 2014, 16:22 »
0
De momento, si no aparece solución creativa, lo he dejado usando un truco muy popular en el mundo de la programación de juegos...

Código: [Seleccionar]
while ( true ) { 
   entrada

   if ( condicion de guardia )
      break;

   else {
      .... resto de codigo
   }
}

esto crea un ciclo infinito, con la condición de salida del ciclo en la instrucción if. Esto se usa mucho para el loop principal de los videojuegos, donde la condición de salida suele ser la pulsacion de la tecla <ESCAPE> que suele enviar a una rutina de terminación del juego.

Con esta solución el ciclo while cumple su función y solo se evalua la condición de guardia una vez. Pero no se si a nivel academico esto será una solución muy decente. El programa queda exactamente igual al primero que puse. Solo se cambia while ( litros != -1 ) por while ( true ), el resto del programa es exactamente lo mismo, lo cual demuestra que la condicion del while original no sacaba el programa del ciclo.

El problema aquí es que hay que evaluar primero si se introduce una cantidad válida para los litros, y como esto aparece primero que la distancia, si se introduce el valor de salida, necesito un mecanismo para saltar el resto del codigo, por eso tengo el "if... else". En fin, de momento no se me ocurre nada mejor...

Un Saludo
Nacho

chenech

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re:consulta sobre un problema en C++
« Respuesta #5 en: Martes 11 de Marzo de 2014, 17:27 »
0
Si quieres que salte en el primer bucle si se cumple la condición tendrías que aceptar el dato antes de entrar al while.
Sería poner el código de aceptar los datos en una función aparte y llamarla antes del while y luego dentro de el para no repetir código.
Un saludo.