C ++ Проверка ввода пользователя не работает должным образом - PullRequest
0 голосов
/ 08 октября 2019

У меня есть этот код, который запрашивает ввод числа и сохраняет его в переменной. Я пытаюсь выполнить проверку ввода, но он ведет себя странно.

#include <iostream>
using namespace std;

float coursework_mark;
float exam_mark;
float module_mark;

int main() {

    //COURSEWORK INPUT WITH VALIDATION
    cout << "Please enter your coursework mark: ";
    while(!(cin >> coursework_mark)){
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Invalid data type, please enter valid coursework mark: ";
    }
    while (coursework_mark < 0 || coursework_mark > 100) {
        cout << "Out of range, please enter valid coursework mark: ";
        cin >> coursework_mark;
    }

    //EXAM MARK INPUT WITH VALIDATION
    cout << "Please enter your exam mark: ";
    while(!(cin >> exam_mark)) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Invalid data type, please enter valid exam mark: ";
    }
    while (exam_mark < 0 || exam_mark > 100) {
        cout << "Out of range, please enter valid exam mark: ";
        cin >> exam_mark;
    }

    //Coursework capping
    if (coursework_mark > exam_mark * 2) { coursework_mark = exam_mark * 2;}

    //Calculate Module mark
    module_mark = (coursework_mark* 0.4) + (exam_mark* 0.6);

    //Output results
    cout << coursework_mark << endl;
    cout << "Your module mark is " << module_mark << endl;
    if (module_mark >= 50) {
        cout << "Congratulations you have passed!" << endl;
    } else if (module_mark < 50) {
        cout << "Unfortunately, you have not passed" << endl;
    }


}

Если пользователь вводит «45kuefggf», число 45 сохраняется как метка курсовой работы, а код попадает в строку cout << "Outдиапазона, пожалуйста, введите действительную оценку экзамена: ";. Я понятия не имею, почему он это делает, как мне сделать так, чтобы он проверял, вводил ли пользователь допустимый тип данных? </p>

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вместо

while(!(cin >> coursework_mark)){

вы должны использовать std::getline

std::getline(std::cin, coursework_mark);

https://en.cppreference.com/w/cpp/string/basic_string/getline

0 голосов
/ 08 октября 2019
bool has_only_digits(string s){
return s.find_first_not_of( "0123456789" ) == string::npos;}

Этот метод - самый простой способ проверить, содержит ли строка число. Поэтому, если она возвращает true, строка содержит только цифры, иначе она содержит больше, чем просто цифры.

Если утверждение ложно, вы можете очистить cin, как вы делали выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...