Мое if-утверждение не работает должным образом - PullRequest
1 голос
/ 29 октября 2019

Независимо от того, что я печатаю в операторе if, код не работает так, как этого хочет мой профессор.

Мой TA сказал, что это синтаксическая ошибка, но не предоставил намного больше справочной информации дляменя.

"Синтаксис, который вы использовали, неверен. Если вы, например, сравниваете инициалы с abc, вы скажете if (initials ==" abc "). Аналогичным образом сделайте то же самое для каждого условия. "

Я не совсем понимаю, что он имеет в виду.

Если я изменю свое выражение if, добавив кавычки, оно всегда запрещает доступ. Если я оставляю все как есть, это всегда дает доступ.

Вот мой код:

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

int main(){

    cout<<"Gain entry with your user information and password." <<endl;
    cout<<"For security purposes, the information will not be echoed to the screen." <<endl;
    cout<<"Please enter your initials: " <<endl;

    string initials;
    cin>>initials;

    cout<<"Please enter your age: " <<endl;

    int age;
    cin>>age;

    cout<<"Please enter your password: " <<endl;

    string password;

    if ( password == initials,age) {
      cout<<"Access granted!" <<endl;
    }

    else {
      cout<<"Access denied!" <<endl;
    }


     return 0;  
}

Вот что он говорит:

==================== YOUR OUTPUT =====================                                                                                                                                                                            
0001: Gain~entry~with~your~user~information~and~password.                                                                                                                                                                         
0002: For~security~purposes,~the~information~will~not~be~echoed~to~the~screen.                                                                                                                                                    
0003: Please~enter~your~initials:                                                                                                                                                                                                 
0004: Please~enter~your~age:                                                                                                                                                                                                      
0005: Please~enter~your~password:                                                                                                                                                                                                 
0006: Access~granted!                                                                                                                                                                                                             

=================== MISMATCH FOUND ON LINE 0006: ===================                                                                                                                                                              
ACTUAL  : Access~granted!                                                                                                                                                                                                         
EXPECTED: Access~denied!                                                                                                                                                                                                          
======================================================                                                                                                                                                                            

Adjust your program and re-run to test.                                                                                                                                                                                           

Test 2 failed                                                                                                                                                                                                                     
ccc_0bc38e1b3b_10207@runweb5:~$ ^C                                                                                                                                                                                                
ccc_0bc38e1b3b_10207@runweb5:~$

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Что касается вашего вопроса, почему ваш код всегда возвращает доступ, то это поведение оператора запятой (,) в C / C ++ внутри оператора if. По сути, как вы написали, это две части: 1. Строковое сравнение пароля со значением инициалов 2. Оценка переменной age

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

Поскольку вы, вероятно, всегда вводите «возраст», отличный от нуля, вычисленное выражение всегда истинно и «доступпредоставляется". Просто для удовольствия, попробуйте свой оригинальный код и введите «возраст» как ноль, и он должен перейти к «доступ запрещен».

2 голосов
/ 30 октября 2019
int main(){

   cout<<"Gain entry with your user information and password." <<endl;
   cout<<"For security purposes, the information will not be echoed to the screen." <<endl;
   cout<<"Please enter your initials: " <<endl;

   string initials;
   cin>>initials;

   cout<<"Please enter your age: " <<endl;

   int age;
   cin>>age;

   cout<<"Please enter your password: " <<endl;

   string password;
   cin>>password;


   if ((initials == "abc") && (age == 21) && (password == "qwerty")) {
      cout<<"Access granted!" <<endl;
   }

   else {
      cout<<"Access denied!" <<endl;
   }


 return 0;  
}

Это то, что сработало. Я не осознавал, что они хотели буквально «abc» быть инициалами, я думал, что это был пример. Как только мой TA уточнил (и меня учили, что я не могу использовать запятую), это код, который заработал.

2 голосов
/ 29 октября 2019

Переменная пароля никогда не инициализировалась, поэтому фактически является пустой строкой с момента ее создания по умолчанию. (Вы сравнивали инициалы с пустой строкой)Измените эти строки:

cout<<"Please enter your password: " <<endl;
string password;

так, чтобы он инициализировал переменную пароля.

cout<<"Please enter your password: " <<endl;
string password; 
cin >> password;

Редактировать: Вы также упомянули, что хотите сравнить пароль с инициалами + возраст

// to_string will convert the integer (age) to a string so we can concatenate it with initials
string correct_pass = initials + std::to_string(age); 
if ( password == correct_pass) {
  cout<<"Access granted!" <<endl;
}else {
  cout<<"Access denied!" <<endl;
}
...