Pergunta

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);

}

Fazendo uma tarefa, este é o meu primeiro programa a escrever com objetos, então tenha paciência comigo. Eu simplesmente não consigo obter a saída deste código para sair corretamente. Preciso de uma maneira de sair do loop, e o que estou usando simplesmente não está funcionando. Alguma sugestão, dicas ou dicas?

Foi útil?

Solução

Tente comparar a parada com o char zero.

stop == '0'

Além disso, você pode simplificar seu código fazendo isso.

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');
}

Outras dicas

Nesse cenário, você bombeia o gás mais uma vez depois que o usuário atinge '0'. Supondo que isso não seja desejado, você tem o que é conhecido como um "erro fora por um". Você pode corrigir isso (e eliminar a variável temporária) reorganizando sua função da seguinte forma:

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 o uso de uma declaração de quebra, você pode usar a seguinte construção:

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 (27 de setembro de 2011): @tonyk só porque um idioma fornece um recurso não significa que se deve usá -lo. o goto A declaração é um exemplo clássico disso.

É verdade que, com um loop tão simples, não há realmente diferença entre usar uma função e o intervalo. Ambos são claros. No entanto, quando recursos extras são adicionados um mês (ou anos) depois, juntamente com condições extras para sair do loop, é muito fácil encontrar multiplicar aninhado if Declarações com lógica complexa dentro de um loop tão grande que você tem dificuldade em encontrar seu começo, muito menos os pontos de saída. Uma das maneiras de combater esse tipo de bloat de código é escrever funções curtas, simples e focadas que são bem nomeadas. Se você fizer isso, o código se documenta. Comparar

while (true)

contra

while (shouldDispenseGas())

Da mesma forma, compare isso com o STL for_each algoritmo. Claro, std::for_each(v.begin(), v.end(), &foo); é um pouco mais curto que for (int i = 0; i < v.size(); ++i) { ...body of foo()... }. Mas a verdadeira vantagem é que é mais fácil ver qual é a intenção. No for_each Você vê imediatamente que fará algo uma vez e apenas uma vez, para cada elemento. No loop for, você não tem ideia. O contador de loop i pode ser alterado no loop. UMA break pode estar escondido por dentro também. Enreando isso break declaração e incorporando a lógica em shouldDispenseGas, você entende imediatamente as condições sob as quais o loop continuará e terminará.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top