Я использую 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;
}
0
Anonymous 3 Янв 2018 в 12:15

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. Следовательно, в этом нет особой необходимости.

2
ibezito 3 Янв 2018 в 09:20

Причина такого поведения в том, что в буфере клавиатуры всегда будет буква «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 или другого метода, позволяющего проверить преобразование.

-1
csabinho 9 Янв 2018 в 14:14