首页 > 解决方案 > 在预期错误的用户输入的情况下获得数字的平均值

问题描述

#include <iostream>
#include <string>

using namespace std;

int main(void) {

    float sum, counter = 0, num;
    string d;
    bool t = true;

    while (t) {
        cin >> num;
        sum = sum + num;

        counter += 1;

        while (cin.fail())
        {
            cin.clear();
            cin.ignore();
            cin >> d;

            if (d == "done") {
                t = false;
                continue;
            } else {
                cout << "Invalid" << endl;
                continue;
            }
        }
    }
    cout << sum << ' ' << counter << ' ' << (sum / counter);
    return 0;
}
     

**所以我试图通过输入猜测来计算输入数字的平均值,如下所示:

4 5 BadInput 7
-----
Expected output should be:
Enter a number: 4
Enter a number: 5
Enter a number: bad data
Invalid 
Enter a number: 7
Enter a number: done
16 3 5.333333333333333

我的代码有什么问题?

标签: c++

解决方案


主要问题是

cin.ignore();

该程序将读取用户输入并尝试将其解释为数字。当您进入"done"程序时无法解释它并std::cin.fail()会返回true. 但std::cin.ignore()删除第一个字符和

cin >> d;

读取"one"。程序不会离开循环。

消除

cin.ignore();

下一个问题是未初始化的变量sum。线

sum = sum + num;

导致未定义的行为。

我发现的最后一个问题是这个片段

cin >> num;
sum = sum + num;

counter += 1;

该程序尝试将输入读入float num. 然后,即使读取失败,它也会将numto的值相加并递增计数器。sum您应该首先检查读取是否失败。

这是对您的代码的可能修复:

#include <iostream>
#include <string>

int main(void) {

    float sum = 0, counter = 0, num = 0;
    std::string d;
    bool t = true;

    while (t) {
        std::cin >> num;
        if (!std::cin.fail()) {
            sum = sum + num;

            counter += 1;
        }

        while (std::cin.fail()) {
            std::cin.clear();
            std::cin >> d;

            if (d == "done") {
                t = false;
                continue;
            } else {
                std::cout << "Invalid\n";
                continue;
            }
        }
    }
    std::cout << sum << ' ' << counter << ' ' << (sum / counter);
    return 0;
}

推荐阅读