如何重构逻辑以更好地处理错误?

How to refactor logic for better error handling?

我为我的入门级 C++ class 编写了这个简短的控制台程序,从技术上讲,它运行正常,并且我满足了所有标准。但是,我不喜欢控制台 window 在输入失败后关闭,我想了解如何重构这个程序,以便失败的输入提示新的、正确的输入,从用户停止的地方继续。我觉得也许有办法用数组和 do...while 循环来做到这一点,但我的实验失败了。如果我不是很清楚,我很抱歉,我是一个初学者。

#include <iostream>
using namespace std;

float first;
float second;
float third;
float fourth;
float fifth;
float total;

int main(){

    // Promt the user to enter 5 decimal values
    cout << "Enter 5 decimal values: ";
    cin >> first >> second >> third >> fourth >> fifth;

    // Clear and discard input errors
    if (cin.fail()) {
        cout << "Invalid entry; Please enter numbers only." << endl;
        cin.clear();
        cin.ignore(10000, '\n');
    }
    else {
        // Add the values together
        total = first + second + third + fourth + fifth;

        // Convert to the nearest integer and print the result
        cout << fixed << setprecision(0) << "The total is: " << total << endl;
    }

    system("pause");
    return 0;
}

顺便说一下,我知道 using std 被认为是不好的做法;但是,这是作业要求的一部分,所以我把它留了下来。

您的评论已经在正确的轨道上:

I feel like maybe there's a way to do this with an array and a do...while loop

您可以通过在输入 周围使用循环来做到这一点。这意味着您 一直要求输入,直到他们给您输入有效的

为此,我在用户输入周围放置了一个循环,然后添加了一些在开始输入后进行清理的代码。这意味着在请求输入之前,它会先清除所有内容,并在每次循环时都执行相同的操作。

一个可能的解决方案是:

#include <iostream>
using namespace std;

float first;
float second;
float third;
float fourth;
float fifth;
float total;

int main(){

    do {
        // Clear and discard input errors
        cin.clear();
        cin.ignore(10000, '\n');

        // Prompt the user to enter 5 decimal values
        cout << "Enter 5 decimal values: ";
        cin >> first >> second >> third >> fourth >> fifth;
    } while (cin.fail());

    // Add the values together
    total = first + second + third + fourth + fifth;

    // Convert to the nearest integer and print the result
    cout << fixed << setprecision(0) << "The total is: " << total << endl;

    system("pause");
    return 0;
}

您服用的 class 似乎跟在 Google Code University's C++ tutorial as mentioned in this Stack Overflow post 之后。查看这些资源以进一步改进您的代码。

有了 while 循环,您甚至不需要像这样使用五个变量:

#include <iostream>
#include <iomanip>

using namespace std;

float input;
float total;


int main(){

// Promt the user to enter 5 decimal values
int valuesEntered = 0;
while (valuesEntered < 5)
{
    cout << "please enter " << (5 - (valuesEntered)) << " numbers: ";
    cin >> input;
    if (cin.fail()) {
        cout << "Invalid entry; Please enter numbers only." << endl;
        cin.clear();
        cin.ignore(10000, '\n');
    }
    else
    {
        total += input;
        valuesEntered++;
    }
}
cout << fixed << setprecision(0) << "The total is: " << total << endl;

system("pause");
return 0;

}