【问题标题】:Second while loop is not running, setting value to "nan"第二个while循环未运行,将值设置为“nan”
【发布时间】:2019-10-12 20:02:02
【问题描述】:

如下所示,我正在尝试制作一个简单的程序,该程序将从 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;
}

【问题讨论】:

    标签: c++ average


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        cin.clear();
        std::cin.ignore();
        

        除了clear() 函数之外,还必须有一个ignore() 以忽略先前的“文件结尾”输入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多