Как я могу получить оператор if, который принимает несколько входов cin для распознавания ошибки, если только первый вход cin неверен? - PullRequest
0 голосов
/ 06 апреля 2020

Я строю программу, которая предназначена для хранения значений из пар день недели / значение в вектор, а затем для отображения и суммирования значений для каждого дня недели. Поэтому я прошу пользователя ввести как строку (день недели, которая может быть в 4 разных формах для каждого дня недели), так и целое число (соответствующее значение) для каждого ввода cin. (Программа пока показывает только понедельник и условие выхода; позже я добавлю его также со вторника по воскресенье.)

Программа также предназначена для определения неверного ввода (и позволяет пользователю повторить попытку их вклад). Однако у меня возникают проблемы с тем, чтобы программа распознала ошибочные данные, если только день недели введен неправильно. Например, программа успешно объявит «Обнаружен неправильный день недели», если я введу «тестовый тест» в качестве ввода. Он также объявит об этом сообщении (хотя формулировку необходимо изменить), если я введу «Понедельник х». Однако, если я введу «Тест 5», программа примет это без отображения сообщения «Неверный день недели».

Как можно изменить мою программу так, чтобы при использовании ранее существующего оператора else отображалось «Неверный день недели», когда я вводил что-то вроде «Тест 5»?

Одним из решений было бы создание очень длинного оператора if, который отображает это сообщение, если введенный день недели не соответствует ни одной из 29 допустимых записей дня недели (например, «Monday», «monday, «Понедельник», «понедельник», «вторник», «вторник» ...). Тем не менее, я хотел бы найти более простой подход.

Спасибо за вашу помощь!

#include "../std_lib_facilities.h"
#include <iostream>
//Program in progress. Completing as part of my independent study of Programming: Principles and Practice by Bjarne Stroustrup.

int main()  
{
    string dayofweek;
    int value;

    vector<int> mondayvalues;
    vector<int> tuesdayvalues;
    vector<int> wednesdayvalues;
    vector<int> thursdayvalues;
    vector<int> fridayvalues;
    vector<int> saturdayvalues;
    vector<int> sundayvalues;
    int incorrectentrycounter = 0;
    int mondaysum = 0;
    cout << "Please enter days of the week followed by values in integer form. When you are finished, please enter Done 0.\n";
    string incorrectnumdump;

    while (cin) {
        if (cin >> dayofweek >> value) {
            if (dayofweek == "Monday" || dayofweek == "monday" || dayofweek == "Mon" || dayofweek == "mon") {
                mondayvalues.push_back(value);
            }

            if ((dayofweek == "Done") && (value == 0)) {
                break;
            }
        }

        else {
            cin.clear();
            cin >> incorrectnumdump;
            cout << "Incorrect day of week detected; please try again.\n";
            incorrectentrycounter++;
            continue;
        }
    }

    cout << "Here are the values you entered for each day of the week, along with their sums:\n";
    cout << "Monday: ";
    for (int x : mondayvalues)
        cout << x << " ";
    for (int i = 0; i < mondayvalues.size(); i++) {
        mondaysum += mondayvalues[i];
    }
    cout << "\nSum of Monday values: " << mondaysum;
    cout << "\nThere were " << incorrectentrycounter << "entries that displayed non-valid days of the week.";
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Хмм .. Может быть, вы можете использовать технику ASCII, чтобы внутренне перевернуть все входные данные либо на все заглавные буквы, либо на все строчные буквы, чтобы вам не пришлось искать оба случая в выражениях if, если заглавные или строчные буквы не используются. не имеет значения. Сделайте функцию, которая принимает входные данные и преобразовывает их во все заглавные буквы или все маленькие. Используйте эту функцию перед назначением входных данных для ваших переменных. Это облегчит их проверку. После этого вы можете создать константный массив [7] из std :: string, который будет включать все дни. Вы можете проверить свои входные данные методом исключения. Позже вы будете сравнивать входные и массивные дни и исключать те дни, которые не совпадают каждый раз. Если все дни исключены, то ввод неправильный. Если осталось 2 или более дней - ввод недостаточен. Если останется 1 день, это верный ввод! Дай знать, если тебе нужна помощь

0 голосов
/ 06 апреля 2020

Поработав с кодом, я остановился на этом решении, которое, я думаю, удовлетворит мои потребности. В коде теперь есть два недопустимых блока оператора ввода вместо одного. Первый («Обнаружен неправильный день недели») находится в условии if (cin >> dayofweek >> value) и будет определять записи в дневную неделю, которые не соответствуют ни одной из строк понедельника или «Готово».

Второй («Неверная запись») находится вне условия if (cin >> dayofweek >> value), но в состоянии while (cin). Я добавил этот второй, чтобы, если кто-то вводит что-то вроде «тестового теста», он будет уведомлен об ошибке, но пока l oop все равно будет продолжаться.

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

Это решение все еще немного неуклюже, но позволяет мне фиксировать неверную запись с помощью просто «else» {}, а не «else», за которым следует длинный набор условий.

#include "../std_lib_facilities.h"
#include <iostream>
//Program in progress. Completing as part of my independent study of Programming: Principles and Practice by Bjarne Stroustrup.

int main()
{
    string dayofweek;
    int value;

    vector<int> mondayvalues;
    vector<int> tuesdayvalues;
    vector<int> wednesdayvalues;
    vector<int> thursdayvalues;
    vector<int> fridayvalues;
    vector<int> saturdayvalues;
    vector<int> sundayvalues;
    int incorrectentrycounter = 0;
    int mondaysum = 0;
    cout << "Please enter days of the week followed by values in integer form. When you are finished, please enter Done 0.\n";
    string incorrectnumdump;

    while (cin)
    {
        if (cin >> dayofweek >> value)
        {
            if (dayofweek == "Monday" || dayofweek == "monday" || dayofweek == "Mon" || dayofweek == "mon")
            {
                mondayvalues.push_back(value);
            }

            else if ((dayofweek == "Done") && (value == 0))
            {
                break;
            }

            else
            {
                cin.clear();
                cin.ignore(10000, '\n');
                cout << "Incorrect day of week detected; please try again.\n";
                incorrectentrycounter++;
                continue;
            }
        }
        else
        {
            cin.clear();
            cin.ignore(10000, '\n');
            cout << "Invalid entry; please try again.\n";
            incorrectentrycounter++;
            continue;
        }
    }

    cout << "Here are the values you entered for each day of the week, along with their sums:\n";
    cout << "Monday: ";
    for (int x : mondayvalues)
        cout << x << " ";
    for (int i = 0; i < mondayvalues.size(); i++)
    {
        mondaysum += mondayvalues[i];
    }
    cout << "\nSum of Monday values: " << mondaysum << "\n";

    cout << "\nThere were " << incorrectentrycounter << " invalid entries.";
}
...