2014-01-09 2 views
1

Вот что должно произойти: после запроса пользователя: «Вы хотите ввести другое имя?» если пользователь вводит «Y», им должно быть предложено добавить другое имя. Вместо этого программа запускает цикл, который начинается после cin < < Ответ, который, как я думал, я установил условие только для запуска, если пользователь не вводит «Y», «y», «N» или «n». На самом деле программа, похоже, делает противоположное тому, что я хочу, независимо от того, как пользователь отвечает на этот вопрос.Почему моя петля действует противоположно тому, как она должна быть основана на пользовательском вводе?

#include <iostream> 
#include <cstring> 
using namespace std; 

int main(){ 

    const int MAX_NUM = 101; 
    char name[MAX_NUM]; 
    char response; 
    char nameCorrect = 'n'; 
    double total = 0; 

    do{ 

     do{ 
      cout << "Please enter name: "; 
      cin >> name; 
      cin.ignore(100, '\n'); 
      cout << "It looks like you entered " << name 
       << ". Is this correct? (Y/N) " << endl; 
      cin >> nameCorrect; 
      while (nameCorrect != 'y' & nameCorrect != 'Y' & nameCorrect != 'n' & nameCorrect != 'N') 
      { 
       cin.clear(); 
       cin.ignore(200, '\n'); 
       cout << '\n' << "If " << name << 
        " is what you are trying to enter, " 
        << "please enter Y." << '\n' 
        << "If " << name << " is not correct, plese enter N." 
        << '\n' << "(Y/N): "; 
       cin >> nameCorrect; 

      } 

     } while (nameCorrect == 'n' || nameCorrect == 'N'); 


     cout << "Would you like to enter another name? (Y/N) "; 
     cin >> response; 

     if (response != 'y' & response != 'Y' & response != 'n' & response != 'N'); 
     { 
      cin.clear(); 
      cin.ignore(200, '\n'); 
      cout << '\n' << "If you would like to enter another name Y." 
       << '\n' << "If you are finished, please enter N. " << '\n' << "(Y/N): "; 
      cin >> response; 

     } 


    } while (response == 'y' || response == 'Y'); 

    return 0; 
} 
+0

Используйте && вместо этого в своем цикле while. –

+0

, в то время как '&&' является более четким и позволяет короткое замыкание - он должен работать по желанию, так как bools преобразуются в 1 или 0. –

ответ

5

Для этого кода:

if (response != 'y' & response != 'Y' & response != 'n' & response != 'N'); 

Снимите ; в конце

в ; является то, что if условно выполнения и блок ниже всегда будет работать.

+0

Вы также должны обернуть каждое условие в пару скобок: 'if ((response! = 'Y') & (response! = 'Y') & (response! = 'n') & (response! = 'N')) ' –

+1

и использовать логики, && - но это не изменит поведение –

1
if (response != 'y' & response != 'Y' & response != 'n' & response != 'N'); 

& является оператором побитового в C/C++, использовать && для логических сравнений. Кроме того, точка с запятой в конце означает, что вы хотите, чтобы if не имел точно никакого эффекта и всегда выполнял следующий блок кода независимо от результата этой строки.

+2

Я, наконец, набрал быстрее чем кто-либо другой :) –

Смежные вопросы