cin.fail无法捕获无效的十进制输入即4.3.23.64

问题描述

我正在学习C ++,并试图创建一个相对简单的学生成绩单生成器。您输入特定主题的分数,应用程序将输出一个字符串,显示上述分数以及该主题的实际成绩。

错误检查标记输入适用于以下情况:

  • 输入一串字母数字字符(例如,hello,h等)
  • 输入小于0或大于100的标记

但是,当一个人输入一个无效的十进制数(即45.453ab.45a,5.ab.c.a。等)时,它不会捕获无效的输入,而是继续运行该应用程序,就好像什么都没错。根据使用的周期数量,它将在终止程序之前自动填充剩余的输入(如果周期数量等于或大于剩余的输入数量),或者将剩下的任何输入视为已经提高了cin.clear ()标记while循环。

谢谢您的时间!

示例控制台行为1

生成绩单生成

请输入数学标记:45.453ab.45a

请输入英文标记: 无效号码;请重试(英语):

示例控制台行为2

生成绩单生成

请输入数学标记:43.4.34.34.34.34.3

请输入英文标记

请输入科学标记

请输入计算标记

请输入艺术标记

数学:43.40%= E

英语:0.34%= F

科学:0.34%= F

计算:0.34%= F

艺术:0.34%= F

总成绩:8.95%= F

代码

#include <iostream>
#include <string>
#include <limits>
#include <iomanip>

std::string grade(double a)
{
    std::string gradeL = (a >= 90) ? "A*"
           : (a >= 80 && a < 90) ? "A"
           : (a >= 70 && a < 80) ? "B"
           : (a >= 60 && a < 70) ? "C"
           : (a >= 50 && a < 60) ? "D"
           : (a >= 40 && a < 50) ? "E"
           : "F";

    return gradeL;
}

int main()
{   
    double mathGrade,engGrade,sciGrade,compGrade,artGrade;

    std::cout << "Student Report Card Generator\n";

    std::cout << "\nPlease enter the marks for Math: ";
    std::cin >> mathGrade;

    while (std::cin.fail() || mathGrade < 0 || mathGrade > 100)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout << "\nInvalid number; please try again (Math): ";
        std::cin >> mathGrade;
    }

    std::cout << "\nPlease enter the marks for English: ";
    std::cin >> engGrade;

    while (std::cin.fail() || engGrade < 0 || engGrade > 100)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout << "\nInvalid number; please try again (English): ";
        std::cin >> engGrade;
    }

    std::cout << "\nPlease enter the marks for Science: ";
    std::cin >> sciGrade;

    while (std::cin.fail() || sciGrade < 0 || sciGrade > 100)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout << "\nInvalid number; please try again (Science): ";
        std::cin >> sciGrade;
    }

    std::cout << "\nPlease enter the marks for Computing: ";
    std::cin >> compGrade;

    while (std::cin.fail() || compGrade < 0 || compGrade > 100)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout << "\nInvalid number; please try again (Computing): ";
        std::cin >> compGrade;
    
    }

    std::cout << "\nPlease enter the marks for Art: ";
    std::cin >> artGrade;

    while (std::cin.fail() || artGrade < 0 || artGrade > 100)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout << "\nInvalid number; please try again (Art): ";
        std::cin >> artGrade;
    }

    double totalGrade = (mathGrade + engGrade + sciGrade + compGrade + artGrade) / 5;

    std::cout << "\nMath: " << std::setprecision(2) << std::fixed << mathGrade << "% = " << grade(mathGrade);
    std::cout << "\nEnglish: " << std::setprecision(2) << std::fixed << engGrade << "% = " << grade(engGrade);  
    std::cout << "\nScience: " << std::setprecision(2) << std::fixed << sciGrade << "% = " << grade(sciGrade);
    std::cout << "\nComputing: " << std::setprecision(2) << std::fixed << compGrade << "% = " << grade(compGrade);
    std::cout << "\nArt: " << std::setprecision(2) << std::fixed << artGrade << "% = " << grade(artGrade);
    std::cout << "\nTotal Grade: " << std::setprecision(2) << std::fixed << totalGrade << "% = " << grade(totalGrade);

    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)