3

条件が true または false の場合、条件を元に戻して再度質問し、ユーザーに値を再入力させるにはどうすればよいですか? ここに私が実装したいものがあります:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    int n;
    cout<<"Enter numbers. Press 5 to stop: ";
    cin>>n;
    bool tr=true;
    while(tr)
    {
        if(n!=5)
            cout<<"You entered "<<n; //How to make it return again, since its false? I keep getting infinite loops :( ;
        else 
            tr=false;
    }
    return 0;
}
4

4 に答える 4

3

各反復で発生するように、while ループでユーザープロンプ​​トを表示する必要があります。

int n;
bool tr = true;
while(tr)
{
  cout << "Enter numbers. Press 5 to stop: ";
  cin >> n;
  if(n!=5) {
    cout << "You entered " << n;
  } else {
    tr = false;
  }
}
于 2013-03-02T15:08:17.830 に答える
2

他の答えはすべて機能し、それらからプログラムフローを改善することについて学ぶべきことがありますが、あなたが求めているトリックは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ループのより伝統的な使用法だと思います。

于 2013-03-02T15:18:59.030 に答える
2

次のように、すべてのコード (「n」と「tr」の定義を除く) を while ループに入れるだけです。

int main()
{
int n;
bool tr=true;
while(tr)
{
cout<<"Enter numbers. Press 5 to stop: ";
cin>>n;
    if(n!=5)
        cout<<"You entered "<<n;

    else 
        tr=false;
}
return 0;

}
于 2013-03-02T15:13:01.633 に答える
0

exrabool変数は必要ありません。

ユーザーが入力するまで無限ループ5:

for(;;) {  // Loops infinitely
  cout << "Enter numbers. Press 5 to stop: ";
  cin >> n;
  if(n == 5)
    break;  // Exits the loop
  cout << "You entered " << n;  // Before the if if you want to print 5 as well
}
于 2013-03-02T15:43:01.737 に答える