Как проверить, является ли пользовательский ввод 1 или 2 - PullRequest
0 голосов
/ 23 мая 2018

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

То же самое с ответами на вопросы.

Например, когда я запускаю код, и он просит меня ввести сложность, и я ввожу 2 или 1000, он все равно продолжает код.То же самое и с ответами, которые отображаются на экране you got it correct, даже если я введу 1945 год для первого вопроса, который является неправильным.

Любая помощь с благодарностью!

код:

int difficulty;
cout << "Please choose a difficulty: 1 for easy 2 for medium 3 for hard: ";
cin >> difficulty;

if (difficulty = '1')
{
    ifstream file_("questions.txt");
    if (file_.is_open())
    {
        std::getline(file_, ques1);
        cout << ques1 << std::endl;
        int answr1;
        cout << "Enter 1 for: 1945, Enter 2 for: 1914 \n";
        cin >> answr1;
        if (answr1 = '1914')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "Incorrect answer was 1914! \n";
        }

        std::getline(file_, ques2);
        cout << ques2 << std::endl;
        int answr2;
        cout << "Enter 1 for: 1937, Enter 2 for: 1939 \n";
        cin >> answr2;
        if (answr2 = '1939')
        {
            cout << "Well done you got it correct! \n";

        }
        else {
            cout << "The answer was 1939 \n";
        }

        std::getline(file_, ques3);
        cout << ques3 << std::endl;
        int answr3;
        cout << "Enter 1 for: George Bush, Enter 2 for: George Washington \n";
        cin >> answr3;
        if (answr3 = '2')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was George Washington \n";
        }

        std::getline(file_, ques4);
        cout << ques4 << std::endl;
        int answr4;
        cout << "Enter 1 for: 14, Enter 2 for: 11 \n";
        cin >> answr4;
        if (answr3 = '11')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was 11 \n";
        }

        std::getline(file_, ques5);
        cout << ques5 << std::endl;
        int answr5;
        cout << "Enter 1 for: She was born with 6 figners , Enter 2 for: 6 toes \n";
        cin >> answr5;
        if (answr3 =' 2')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was 6 Toes \n";
        }

        file_.close();
    }
    else {
        cout << "File is not open\n";
    }

}

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Чтобы сделать сравнение на равенство, используйте: ==:

if(difficulty==1)
{
    cout << "You selected difficulty 1" << std::endl;
}

Если вы выполните

if(difficulty=1)
{
    cout << "You selected difficulty 1" << std::endl;
}

1, присваивается сложность.Условие if проверяется (в такой ситуации проверяется, что переменная не равна 0) и поэтому всегда выполняется.

0 голосов
/ 23 мая 2018

Сначала (совет!) Вы имеете дело с пользовательским вводом.Вы всегда должны учитывать возможность неправильного ввода данных пользователем!

int n;
std::cin >> n;

Если пользователь набрал, например, 'x', поток переходит в недопустимое состояние, и вы не сможете ничего больше успешно прочитатьбольшеПоэтому после каждого ввода вы должны проверять поток:

if(!std::cin)
{
    // print some error message?

    // reset the error state!
    std::cin::clear();
    // skip whatever yet is buffered in the stream
    std::cin.ignore(std::numeric_limits<std::streamsize>::max())
    // now std::cin is ready to use again...
}

Вы можете сделать это в цикле, проводить дополнительные проверки на входе и выходить только в том случае, если он действителен ... Попробуйте сделать функцию изчтобы избежать дублирования кода.

int difficulty;
std::cin >> difficulty;
if (difficulty = '1')    // << !!!

Две ошибки одновременно: один знак равенства - не сравнение, а присвоение!Таким образом, вы присваиваете значение символа '1' (которое не является числовым 1!) Переменной difficulty - и затем проверяете результат этого присваивания.Поскольку переменная теперь получает значение, отличное от 0 (ноль), блок if будет введен - всегда .Для сравнения необходимо использовать:

if(difficulty == '1')
//            ^^

OK, остается значение: '1' - это символьный литерал, а не числовой.Скорее всего, вы используете набор символов, совместимый с ASCII на первых 128 символах, и если это так, '1' соответствует числовому значению 49. Уверен, что это не то, что вам нужно... Итак:

if(difficulty == 1)
//               ^ integer literal, numerical value!

В качестве альтернативы, вы могли бы прочитать символ:

char difficulty;         // different type!
std::cin >> difficulty;
if (difficulty = '1')

Теперь это будет читать простой символ без каких-либо преобразований вообще, тогда как чтение в intпреобразует один или более (!) символов в числовое значение.Без преобразования ввод символов остается как есть, и вы можете сравнить его со значением символа ...

 int answr1;
 cin >> answr1;
 if (answr1 = '1914')

То же самое, но теперь вы используете недопустимый литерал символа!

Вы можете сравнить со строкой, если вообще:

 std::string answr1;
 cin >> answr1;
 if (answr1 == "1914")

или снова как целое число, как указано выше (if(a == 1914)).С другой стороны, хотя:

std::cout << "Enter 1 for: 1945, Enter 2 for: 1914 \n";

Приведенное выше сравнение потребовало бы от пользователя не вводить 2 для правильного ответа, а 1914!Поэтому вы бы лучше сравнили варианты:

 if(answr1 == 2)

Наконец, еще один совет: вы объединяете вопросы из текстового файла со статически связанными вариантами ответов в коде.Ну, ваш текстовый файл напрасно ...

Вы также можете попытаться перетащить ответы из файла.Дополнительное преимущество: вы можете избежать дублирования кода с помощью цикла, и вы можете организовать свои вопросы для различных трудностей в разных файлах.Тогда ваш код мог бы выглядеть примерно так:

std::ifstream file;
std::cin >> difficulty;
switch(difficulty)
{
case 1:
    file.open("question_1.txt");
    break;
case 2:
case 3:
     // ...
     break;
default:
    // invalid input! -> appropriate handling
    break;
}

std::string text;
for(;;)
{
    std::getline(file, text);
    // the question text:
    std::cout << text << std::endl;
    // the answer options:
    std::getline(file, text);
    std::cout << text << std::endl;
    // read the correct answer:        
    std::getline(file, text);
    int answer; // parse appropriately from text!
    // read the text for output, if users answer was not correct!
    std::getline(file, text);

    // now read in user input and compare against correct answer...
}

Формат файла теперь совершенно очевиден: для каждого вопроса четыре строки, содержимое, как описано выше.Вы можете придумать что-то более сложное или даже использовать XML, но сейчас этого должно быть достаточно ...

Что ж, вам все равно нужно правильно определить конец файла и выйти из цикла, если он достигнут, оставив этов качестве упражнения для вас ...

0 голосов
/ 23 мая 2018

Ваша логика здесь ошибочна с вашими утверждениями if. Вы хотите, чтобы пользователь выбирал один из двух вариантов, поэтому, если он выбирает что-либо, кроме 1 или 2, выдает ему приглашение и ожидает один из этих двух ответов. См. Пример ниже:

 if (answr1 == "1914")
        {
            cout << "Well done you got it correct! \n";
        }
        else if(answr1 == '1945') {
            cout << "Incorrect answer was 1914! \n";
        }
        else {
            cout << "Incorrect Input!Plese input 1 or 2 \n";
        }

PS: в C ++ = оператор для назначения.Используйте == для сравнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...