2013-03-27 2 views
2

Предположим, у меня есть цикл while, который зависит от двух отдельных входов. В ситуации 1 цикл while примет значение 1, а в ситуации два - Cin.eof(). Есть ли способ, которым я могу сделать это эффективно? Чтобы быть более кратким:Изменение цикла while для размещения двух ситуаций

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){} 
} 

, поскольку цикл в то время как по существу делает то же самое в каждой ситуации.

+0

К «эффективно», я полагаю, вы имеете в виду, «с как меньше дублирования кода, насколько это возможно»? – Mysticial

+0

Вы считали двоичную арифметику? Ands and Ors и прочее? –

+0

Вы рассматривали strcmp вместо ==? –

ответ

3

Для удобства чтения и в интересах cohesion, я думаю, вы должны переместить содержимое цикла в отдельную функцию:

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

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

Легче видеть, что разные петли while делают то же самое, но их условия разные.

2

Просто используйте или (||) как условие в цикле while. Установите первое условие if(hello == "one"). Теперь у вас есть цикл while, который будет зацикливаться, если одно из условий: true.

bool value = hello == "one"; 
while (value || !cin.eof) {} 
+0

@BrendanLong обновлен. Спасибо за совет. – andre

2

Я считаю, что вы ищете что-то вроде этого:

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

Этот код будет делать то, что вы хотите, потому что он проверяет «переменная„один“? Если да, продолжайте выполнение. Если это не так, он проверяет: есть ли переменная «два»? Если это так, он проверяет наличие cin.eof.

Если это не так, цикл не будет выполняться. (&& 1 в первом состоянии было опущено, потому что это всегда «истина», сравнявшись и бесконечный цикл)

Edit:

Чтобы упростить вещи, вы можете рассмотреть этот код (как это было предложено в комментариях) :

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

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

кронштейны, которые я размещены в предыдущем примере, на самом деле не нужны, потому что && связывает сильнее, чем ||, но они помогают общую ясность кода.

+0

Если вы собираетесь добавить это в цикл, вы можете также провести сравнение строк вверх и сохранить значение в 'bool', чтобы избежать затрат на тестирование всех символов в цепочках несколько раз, чтобы создать тот же результат. –

-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 это «один», и если это правда, условие while является 1, иначе это !cin.eof() как вы хотели.

+0

@BobJohn Это не использует ничего из C++ 11, он просто делает «или» излишне тайным способом. –

+0

Что это такое? : D –

0

Если вы используете C++ 11:

#include <functional> 

auto check = (hello == "one") ? []() bool -> { return 1; } : 
           []() bool -> { return !cin.eof(); }; 
while(check) { 
}; 
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; 
     } 
    } 
Смежные вопросы