第二个while循环未运行,将值设置为“ nan”

时间:2019-10-12 20:02:02

标签: c++ average

如下所示,我正在尝试制作一个简单的程序,该程序将从3个不同的数字组中找到3个平均值。第一学期,第二学期以及这两者的平均值。但是,在执行时,程序会打印出正确的第一个平均值,但绝不会经过第二个while循环,而最终以“ nan”作为第二个平均值的值结束。

#include <iostream>
#include <ios>
#include <iomanip>

using namespace std;

int main() {
    // First semester
    cout << "Enter your first semester grades (Press enter for each new grade and write \"End\" to stop): ";

    streamsize prec = cout.precision();
    double grades1;
    double sum1 = 0;
    int count1 = 0;

    while (cin >> grades1) {
        count1++;
        sum1 += grades1;
    }

    cout << "Your first semester average is: " << setprecision(3) << sum1 / count1 << setprecision(prec) << endl << endl;

    // Second semester
    cout << "Enter your second semester grades (Press enter for each new grade and write \"End\" to stop): ";

    double grades2;
    double sum2 = 0;
    int count2 = 0;

    while (cin >> grades2) {
        count2++;
        sum2 += grades2;
    }

    cout << "Your second semester average is: " << setprecision(3) << sum2 / count2 << setprecision(prec) << endl;
    cout << "Your two semester average is: " << setprecision(3) << (sum1 / count1 + sum2 / count2) / 2 << setprecision(prec) << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:2)

我认为这是std :: cin的问题。我在第一个while循环之后在您的代码中添加了新的检查:

if (cin.fail()) {
    cout << "Cin in failed state" << endl;
}

上面的if条件起作用,这意味着cin处于失败状态,并导致第二个while循环无法启动。我尝试使用cin.clear(),但没有用,我不确定如何清除cin上的故障位。

另一种解决方案是编写一个适当的函数,该函数从用户处获取一个双精度值。

答案 1 :(得分:1)

仅当从std::cin中读取错误时,或者按文件结尾序列时,第一个循环才会结束。这两个事件都将在流对象中设置state,使从该流的所有进一步读取都失败。

您需要使用clear函数清除此状态。

答案 2 :(得分:0)

cin.clear();
std::cin.ignore();

clear()函数一起,必须有一个ignore()才能忽略之前的“文件结束”输入。