Сначала (совет!) Вы имеете дело с пользовательским вводом.Вы всегда должны учитывать возможность неправильного ввода данных пользователем!
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, но сейчас этого должно быть достаточно ...
Что ж, вам все равно нужно правильно определить конец файла и выйти из цикла, если он достигнут, оставив этов качестве упражнения для вас ...