Я использую Visual Studio Community 2017 для программирования на C ++. У меня есть следующий код. Здесь цикл do while выполняется несколько раз и не останавливается на запрос ввода, где он должен. Но в последней программе switch case, если я введу 1 вместо n, программа будет отлично работать. ПОЖАЛУЙСТА ПОМОГИ!!!
// Welcome2018.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<bitset>
using namespace std;
int main()
{
string month[] = { "January", "February", "March", "April", "May", "June", "July", "August" "September", "October", "November", "December" };
int m, d, answer;
cout << "Welcome 2018!!!" << endl;
do
{
cout << "Enter the number corresponding to the month you want displayed" << endl;
cin >> m;
switch (m)
{
case 1:
cout << month[0] << endl;
cout << "Enter the date to know the day it is/will be" << endl;
cin >> d;
if (d == 7 || d == 14 || d == 21 || d == 28)
{
cout << "The day on " << d << " January is Sunday!" << endl;
}
else if (d == 1 || d == 8 || d == 15 || d == 22 || d == 29)
{
cout << "The day on " << d << " January is Monday!" << endl;
}
else if (d == 2 || d == 9 || d == 16 || d == 23 || d == 30)
{
cout << "The day on " << d << " January is Tuesday!" << endl;
}
else if (d == 3 || d == 10 || d == 17 || d == 24 || d == 31)
{
cout << "The day on " << d << " January is Wednesday!" << endl;
}
else if (d == 4 || d == 11 || d == 18 || d == 25)
{
cout << "The day on " << d << " January is Thursday!" << endl;
}
else if (d == 5 || d == 12 || d == 19 || d == 26)
{
cout << "The day on " << d << " January is Friday!" << endl;
}
else if (d == 6 || d == 13 || d == 20 || d == 27)
{
cout << "The day on " << d << " January is Saturday!" << endl;
}
}
cout << "Are you sure you want to quit?" << endl;
cout << "Enter Y/N based on your choice:";
cin >> answer;
switch (answer)
{
case 1:
answer = 1;
case 'n':
answer = 1;
default:
answer = 2;
}
} while (answer = 1);
cout << "Thank You and Come Again!!!" << endl;
return 0;
}
2 ответа
Несколько проблем с вашим кодом:
А. в последнем операторе while вы должны использовать оператор '==', который проверяет равенство, вместо оператора '=', который выполняет присваивание.
while (answer == 1)
Б. в последнем случае переключения вы должны добавить команду прерывания в конце каждого случая. В противном случае он также автоматически выполняет блок кода по умолчанию при выборе варианта по умолчанию.
switch (answer)
{
case 1:
answer = 1;
break;
case 'n':
answer = 1;
break;
default:
answer = 2;
break;
}
C. Первый блок switch-case в настоящее время включает только один case. Следовательно, в этом нет особой необходимости.
Причина такого поведения в том, что в буфере клавиатуры всегда будет буква «n». Вот решение для этого!
(кроме уже упомянутого бесконечного цикла ...)
Я цитирую ответ, который я связал:
Причина, по которой программа переходит в бесконечный цикл, заключается в том, что из-за сбоя ввода установлен флаг неправильного ввода std::cin
. Что нужно сделать, - это очистить этот флаг и удалить неверный ввод из входного буфера.
//executes loop if the input fails (e.g., no characters were read)
while (std::cout << "Enter a number" && !(std::cin >> num)) {
std::cin.clear(); //clear bad input flag
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input
std::cout << "Invalid input; please re-enter.\n";
}
См. FAQ по C ++ для этого и другие примеры, в том числе добавление минимума и / или максимума в условие.
Другой способ - получить ввод в виде строки и преобразовать ее в целое число с помощью std::stoi
или другого метода, позволяющего проверить преобразование.
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .