2

2 つの別々の入力に依存する while ループがあるとします。状況 1 では、while ループは値 1 を取り、状況 2 では、!cin.eof() を取る必要があります。これを効率的に行う方法はありますか?より簡潔にするには:

string hello;
cin >> hello;

if(hello == "one")
{
    //make the while loop depend on value 1
}
else if(hello == "two")
{
    //make the while loop depend on value !cin.eof()
}

while(/*depends on above conditional*/)
{}

私は次のようなことをしたくありません:

if(hello == "one)
{
     while(1){}
}
else if(hello == "two")
{
     while(!cin.eof){}
}

while ループは基本的に、それぞれの状況で同じことを行うためです。

4

6 に答える 6

3

読みやすさと結束のために、ループの内容を別の関数に移動する必要があると思います。

void DoSomething() { /* ... */ }

// ...
if(hello == "one)
{
    while(1){ DoSomething(); }
}
else if(hello == "two")
{
    while(!cin.eof){ DoSomething(); }
}

while異なるループが同じことを行っていることを簡単に確認できますが、それらの条件は異なります。

于 2013-03-27T21:15:36.320 に答える
2

or ( ||) を while ループの条件として使用するだけです。最初の条件を設定しますif(hello == "one")。これで、条件の 1 つが の場合にループする while ループができましたtrue

bool value = hello == "one";
while (value || !cin.eof) {}
于 2013-03-27T20:38:51.457 に答える
2

私はあなたがこのようなものを探していると信じています:

while((hello == "one") || (hello == "two" && !cin.eof)) {
}

このコードは、「変数が「1」かどうか」をチェックするため、あなたが望むことを行います。その場合は、実行を続けてください。そうでない場合は、変数が「2」かどうかをチェックします。もしそうなら、それはチェックしcin.eofます。

どちらでもない場合、ループは実行されません。(&& 1最初の条件の は省略されました。これは、常に「true」であり、等しく、無限ループであるためです)

編集:

物事を単純化するために、このコードを検討することをお勧めします (コメントで提案されているように)。

bool HelloIsOne = (strcmp(hello, "one") == 0);
bool HelloIsTwo = (strcmp(hello, "two") == 0);

while(HelloIsOne || HelloIsTwo && !cin.eof) {
}

前の例で配置した括弧は、&&バインドが よりも強力であるため、実際には不要||ですが、コードの一般的な明確化に役立ちます。

于 2013-03-27T20:38:57.520 に答える
0

これはどう:

    switch(hello)
    {
        case 'one':
        {
            for(; 1; );
            {
            // your loop here
            }
            break;
        }
        case 'two':
        {
            for(;!cin.eof; )
            {
            // your other loop here
            }
            break;
        }
        default:
        {
            cout << " shouldnt get here unless bad user input" << endl;
            break;
        }
    }
于 2013-03-27T22:44:52.873 に答える
0

C++11 を使用している場合:

#include <functional>

auto check = (hello == "one") ? []() bool -> { return 1; } :
                                []() bool -> { return !cin.eof(); };
while(check) {
};
于 2013-03-27T21:10:10.237 に答える
-1

次のようなことができます。

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string hello;
    cin >> hello;
    while(hello=="one"?1:(!cin.eof()))
    {
        //do stuff
    }
    return 0;
}

hello文字列が「1」であるかどうかをチェックし、それが true の場合、の条件はwhileisであり1、そうでない場合は!cin.eof()希望どおりです。

于 2013-03-27T20:42:08.303 に答える