Проверка пользовательского ввода перед вставкой в ​​вектор C ++ - PullRequest
1 голос
/ 25 апреля 2020

Я пишу простую программу как упражнение, в котором пользователь вводит оценки (тип символа), и система проверяет вводимые данные, сравнивая введенные пользователем данные с вектором, содержащим оценки.

У меня проблемы с записью логики c, которая проверяет, является ли ввод действительным или нет, преобразует ввод в верхний регистр, а затем вставляет ввод в вектор. Я хочу, чтобы программа go вернулась к началу l oop, если пользователь не введет допустимый символ и снова запросит допустимый ввод. Прямо сейчас программа проверяет ввод и отправляет сообщение «Пожалуйста, введите правильную оценку», но вставьте ввод в вектор независимо от того, верный он или нет. Это не желаемый результат.

Я только начал изучать c ++, извините за грязный код.

Это функция, которая получает пользовательский ввод, преобразует его в верхний регистр и проверяет по вектору.

void gradesInput() {
    char upperGrade;
    bool result = true;

    for (size_t i = 0; i < dGrades.size() && result == true; i++)
    {

            cout << "Please enter your student grades...\n";
            cin >> dGrades[i];
            upperGrade = toupper(dGrades[i]);
            result = validateInput(upperGrade);
            if (result == true){
                cout << "That's a valid grade.";
            }
            else {
                cout << "Please enter a valid grade.";
            }
    }
}

Эта функция запускает проверку:

bool validateInput(char uInput) {
    vector <char> grades(arr, arr + sizeof(arr) / sizeof(arr[0]));
    bool result = binary_search(grades.begin(), grades.end(), uInput);

    return result;
}

И это объявление вектора и массива, которое я использую:

std::vector <char> dGrades(10);
static const char arr[] = { 'A', 'B', 'C', 'D', 'F' };

Я вставка пользовательского ввода в вектор dGrades после сравнения ввода с массивом и преобразования в верхний регистр.

Буду признателен за помощь или любое руководство.

1 Ответ

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

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

char getValidGrade() {
    char result;
    while (true) {
        cout << "Please enter your student grades...\n";
        cin >> result;
        result = toupper(result);
        if (validateInput(result)) {
            cout << "That's a valid grade.";
            return result;
        }
        else {
            cout << "Please enter a valid grade.";
        }
    }
}

Назовите его в gradesInput() следующим образом:

void gradesInput() {
    for (auto &grade : dGrades) {
        grade = getValidGrade();
    }
}
...