Pregunta

void GasPump::dispense()
{

        bool cont = true;
        char stop;

    do{
        cout << "Press any key, or enter to dispense.\n"
             << "Or press 0 to stop: \n";
        cin.get(stop);

        gasDispensed = gasDispensed + gasDispensedPerCycle;
        charges = costPerGallon*gasDispensed;
        displayGasNCharges();

        if(stop == 0)
            cont = false;

    } while(cont);

}

Hacer una misión, este es mi primer programa para escribir con objetos así que tengan paciencia conmigo. Yo simplemente no puede obtener la salida de este código a salir bien. Necesito una manera de salir del bucle, y lo que estoy usando no está funcionando. Cualquier sugerencia, sugerencias o consejos?

¿Fue útil?

Solución

Trate de comparar parada para el carbón cero.

stop == '0'

También se puede simplificar el código al hacer esto.

void GasPump::dispense()
{
    char stop;

    do {
        cout << "Press any key, or enter to dispense.\n"
             << "Or press 0 to stop: \n";
        cin.get(stop);

        gasDispensed = gasDispensed + gasDispensedPerCycle;
        charges = costPerGallon*gasDispensed;
        displayGasNCharges();
    } while (stop != '0');
}

Otros consejos

En este escenario, la bomba de gas de un tiempo extra después de los éxitos de los usuarios '0'. Suponiendo que esto no se desea, usted tiene lo que se conoce como un "error off-by-one". Puedes solucionar este problema (y eliminar la variable temporal) de reordenación de su función como sigue:

void GasPump::dispense()
{
    while (true) {
        cout << "Press any key, or enter to dispense.\n"
             << "Or press 0 to stop: \n";

        if (cin.get() == '0')
            break;

        gasDispensed = gasDispensed + gasDispensedPerCycle;
        charges = costPerGallon*gasDispensed;
        displayGasNCharges();
    }
}

Para evitar el uso de una sentencia break, puede utilizar la construcción siguiente:

bool GasPump::shouldDispenseGas()
{
    cout << "Press any key, or enter to dispense.\n"
         << "Or press 0 to stop: \n";
    return (cin.get() != '0');
}

void GasPump::dispense()
{
    while (shouldDispenseGas()) {
        gasDispensed = gasDispensed + gasDispensedPerCycle;
        charges = costPerGallon*gasDispensed;
        displayGasNCharges();
    }
}

Edit (2011 27 de septiembre): @TonyK hecho de que un lenguaje proporciona una característica no significa que uno debe utilizarlo. La declaración goto es un ejemplo clásico de esto.

Por supuesto, con tal de bucle simple, en realidad no hay diferencia entre usar una función y el descanso. Ambos son claras. Sin embargo, cuando las características adicionales se añaden al mes (o años) más tarde, junto con las condiciones adicionales para romper el bucle, es muy fácil de encontrar declaraciones if multiplicar-anidadas con una lógica compleja dentro de un bucle que es tan grande, que tiene un disco tiempo para encontrar su principio, y mucho menos los puntos de salida. Una de las maneras de luchar contra este tipo de hinchazón de código es escribir corto, sencillo y funciones que son bien llamada centrado. Si hace esto, el propio código documentos. Comparar

while (true)

frente

while (shouldDispenseGas())

Del mismo modo, se compara esto con el algoritmo STL for_each. Claro, std::for_each(v.begin(), v.end(), &foo); es un poco más corto que for (int i = 0; i < v.size(); ++i) { ...body of foo()... }. Pero la verdadera ventaja es que es más fácil ver lo que la intención es. En el for_each que ver de inmediato que va a hacer algo una vez, y sólo una vez, a cada elemento. En el bucle, no tiene ni idea. El contador i bucle puede ser cambiado en el bucle. Un break puede estar oculto en el interior también. Por eludir esta declaración break y la incrustación de la lógica en shouldDispenseGas, a entender de inmediato las condiciones en que continuará el bucle y final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top