私は独学のプログラマーです。私は約1.5年前にプログラミングを始めました。今、私は学校でプログラミングクラスを始めました。プログラミングクラスは1/2年間ありましたが、今はもう半分あります。
クラスでは、C ++でプログラミングする方法を学びます(これは、始める前に、私がすでにかなりよく使用することを知っていた言語です)。
このクラスでは何の問題もありませんでしたが、明確な解決策を見つけることができなかった問題が繰り返し発生しています。
問題は次のようになります(疑似コード):
do something
if something failed:
handle the error
try something (line 1) again
else:
we are done!
これはC ++の例です
このコードはユーザーに数値の入力を求め、入力が有効になるまで入力を続けます。cin.fail()入力が無効かどうかを確認するために使用します。ときcin.fail()であるtrue私が呼び出す必要がありますcin.clear()し、cin.ignore()ストリームからの入力を取得し続けることができるように。
このコードはをチェックしないことを知っています
EOF。私たちが書いたプログラムは、そうすることを期待されていません。
これが私が学校での課題の1つでコードを書いた方法です。
for (;;) {
cout << ": ";
cin >> input;
if (cin.fail()) {
cin.clear();
cin.ignore(512, '\n');
continue;
}
break;
}
私の先生は、私はこれを使うべきではないbreakとcontinue言っていました。彼は代わりにレギュラーwhileかdo ... whileループを使うべきだと提案しました。
このようなループを表す最も簡単な方法は、breakとを使用しているように思えcontinueます。私は実際にそれについてかなり長い間考えましたが、より明確な解決策を実際には思い付きませんでした。
彼は私に次のようなことをして欲しかったと思います:
do {
cout << ": ";
cin >> input;
bool fail = cin.fail();
if (fail) {
cin.clear();
cin.ignore(512, '\n');
}
} while (fail);
私にfailは、追跡するために呼び出される変数もあり、入力失敗のチェックが1 回ではなく2回行われるため、このバージョンはかなり複雑に見えます。
また、次のようなコードを記述できることもわかりました(短絡評価を悪用しています)。
do {
cout << ": ";
cin >> input;
if (fail) {
cin.clear();
cin.ignore(512, '\n');
}
} while (cin.fail() && (cin.clear(), cin.ignore(512, '\n', true);
このバージョンは、他のバージョンとまったく同じように機能します。breakまたは使用せずcontinue、cin.fail()テストは1回だけ実行されます。しかし、私がこのような「短絡評価ルール」を悪用することは、私には正しくないと思われます。私の先生もそれを望んでいないと思います。
この問題はcin.fail()チェックだけに当てはまるわけではありません。私はこれを、他の多くの場合に使用breakしcontinue、条件が満たされるまでコードのセットを繰り返すことを含み、条件が満たされない場合は何かを実行する必要があります(呼び出しcin.clear()や例cin.ignore(...)からcin.fail())。
私はコースをずっと使用breakし続けcontinueましたが、今では私の先生はそれについて不平を言うのをやめました。
これについてのあなたの意見は何ですか?
私の先生は正しいと思いますか?
この種の問題を表すより良い方法を知っていますか?
while (true)とすぐにありますと仮定しbreak、returnまたはthrowそこにどこかで。ちょうどかわすのトラックに保持する必要があり、余分な変数の紹介breakやcontinue逆効果であるが。最初のコードの問題は、ループが正常に反復を終了しないことと、continue内部にあるifことを知って、breakウィークが取得されないことを知る必要があることです。
dataIsValiddo { ... if (!expr) { break; } ... } while (true);exprfalse