他の答えはすべて機能し、それらからプログラムフローを改善することについて学ぶべきことがありますが、あなたが求めているトリックはcontinue
、ループのこの反復の残りをスキップするキーワードであると思います。
bool tr = true;
int n;
while (tr)
{
cout << "Enter numbers...";
cin >> n;
if (n != 5)
continue;
else
tr = false;
}
編集パート1:continue
キーワードについて。
コードをできるだけ読みやすくしたいと考えています。この例では、その使用は不要です(他のポスターが示しているように)。しかし、これは「ループのこの反復で残りの処理をスキップして、次の反復に進むにはどうすればよいですか?」という質問に対する答えです。通常、このようなフローを壊すディレクティブは、実際にはコードを読みにくくします。しかし、時にはその逆が当てはまります。continue
またはで達成できるもの(または少なくともほとんどすべて)は、break
それらなしで達成できるため、それらを使用する場合は、そうする明確な理由が必要です。通常、を使用する場合continue
、入力のコレクションをループしているため、入力が期待する形式でない場合は常にループの処理をスキップしたいためです。このようなもの(擬似コード)...
foreach (Input i in ReceivedInputs)
{
if (i.isBad())
{
cout << "Bad input";
continue;
}
// Do massive block of calculating here.
}
これより読みやすいです...
foreach (Input i in ReceivedInputs)
{
if (i.isBad())
cout << "Bad input";
else
{
// Do massive block of calculating here.
}
}
2番目のバージョンでは、計算の大規模なブロックの終わりに向かっている場合、現在のスコープを追跡するのが難しくなるためです。この場合、によってコードが読みやすくcontinue
なるので、それを使用します。しかし、単純なコードではおそらくそれを使用すべきではありません。キーワードは似ていますが、有益なbreak
例を考え出す方がはるかに簡単です。break
編集パート2:複数の反復について
これは、ループの設定の問題にすぎません。ここには魔法のキーワードはありません。私が思いつくことができる最短の方法は、おそらく次のようなものです:
int n = 0;
int numberToTake = 10;
for ( int numbersTaken = 0; numbersTaken < numberToTake; ++numbersTaken)
{
cout << "Enter numbers...";
int n = 0;
for (cin >> n; n != 5; cin >> n)
cout << "Try again.";
// Do whatever processing on n you want to do here.
}
このようにすると、ユーザーから取得できる値は5のみになり、整数に収まらないものを入力すると、予期しない動作が発生することを指摘しておく必要があります。
編集3:コメントをより完全に読んだ後、あなたが探しているのは、for
ループのより伝統的な使用法だと思います。