ループしながら、どのように私は私のDO /から抜け出すことができますか?
質問
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);
}
割り当てを行う、これは私と一緒にクマので、オブジェクトを書き込むための私の最初のプログラムです。 私はちょうどを消すために、このコードの出力を取得することはできません。私が出て取得する方法が必要です ループ、そして私はちょうど動作していない使用していますの。任意の提案、ヒントやヒント?
解決
ゼロ文字にストップを比較してみます。
stop == '0'
また、あなたがこれを行うことによって、あなたのコードを簡素化することができます。
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');
}
他のヒント
このシナリオでは、1つの余分の時間、ユーザーのヒット「0」の後にガスを送り出します。これが望ましくないと仮定すると、あなたはとして知られているものを持っている「off-by-oneエラー。」あなたは次のように機能を再配置することによってこの問題を解決(一時的な変数を排除する)ことができます:
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();
}
}
break文を使用しないようにするには、次のような構成を使用することができます
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年9月27日):
@TonyKただ、言語が機能を提供するため、は1つがそれを使用する必要があることを意味するものではありません。 goto
文は、この古典的な例です。
確かに、このような単純なループで、機能やブレークを使用しての間に違いは本当にありません。両方がクリアされています。余分な機能は、ループの外に破壊するための余分な条件と一緒に(または年)以降の、月を追加取得するときしかし、それは非常に大きいですループ内で複雑なロジックと乗算 - ネストされたif
文を見つけることは非常に簡単です、あなたは、ハードを持っています時間の初め、はるかに少ない出口点を見つけます。コードの膨張のこのタイプを戦うために方法の一つは、短い、シンプルを書くことで、よく名前が付けられていた機能を重視しました。あなたがこれを行う場合は、コード文書そのもの。比較
while (true)
対
while (shouldDispenseGas())
は同様に、STLのfor_each
アルゴリズムにこれを比較します。確かに、std::for_each(v.begin(), v.end(), &foo);
はfor (int i = 0; i < v.size(); ++i) { ...body of foo()... }
よりも少し短いです。しかし、本当の利点は、それが意図が何であるかを確認するために簡単だということです。 for_each
では、あなたはすぐにあなたが各要素に、一度だけ一度に何かをやって、とされていることがわかります。 forループでは、あなたは考えています。ループカウンタi
ループで変更することができます。 break
も同様に内部に隠されていてもよいです。このbreak
文をshirkingとshouldDispenseGas
のロジックを埋め込むことで、あなたはすぐにループを継続する条件、およびエンドを理解します。