斯特劳斯特鲁普的P:PP 第4章 钻头:卡住

Stroustrup's P:PP Chapter 4 Drill: Stuck

本文关键字:PP 钻头 卡住 4章 斯特劳斯      更新时间:2023-10-16

我被Stroustrup的p:PP第4章练习,第5部分卡住了。这个问题要求我写一个程序,该程序由一个while循环组成,该循环读取2个双精度,并在输入字符|时终止程序。程序应该输出两个双精度数,告诉你哪个更小哪个更大,以及它们是否相等或几乎相等。我对"几乎相等"的定义是当两个数相差小于0.1时。我还编写了程序,使它在输入任何非双输入时终止,而不是只输入|。

当我输入15.0和19.0时,我仍然被告知"这些值几乎相等",而不是15.0更小,19.0更大。奇怪的是,如果我输入19.0和15.0,它会告诉我较小的值是15,较大的值是19。如果我输入15.0和15.0,它确实告诉我这两个值现在相等了。

基本上,if x

有什么建议吗?

#include "../../../std_lib_facilities.h"
int main()
{
    double val1 = 0;
    double val2 = 0;
    cout << "Enter 2 values: n";
    while (cin >> val1 >> val2) {
        if (val1 < val2) {
            cout << "The smaller value is " << val1 << " and the bigger value is " << val2 << 'n';
        }
        else if (val1 == val2) {
            cout << "Both values are equal.n";
        }
        else if (val1 > val2) {
            cout << "The smaller value is " << val2 << " and the bigger value is " << val1 << 'n';
        }
        else (val1 - val2 <= 0.01 && val1 != val2 || val2 - val1 <= 0.01 && val1 != val2) {
            cout << "The values are almost equal.n";
        }
    }
}

问题在于"if-else"条件的顺序:这很重要,因为一旦满足了其中一个条件,其他条件将不再被检查。

这个…

else (val1 - val2 <= 0.01 && val1 != val2 || val2 - val1 <= 0.01 && val1 != val2) {
  • 应该将else替换为if,以便-无论先前的输出如何,它都可以测试此特定条件并可能打印"几乎等于"消息

  • 需要条件固定:如果您将val1 - val2绝对值0.01阈值进行比较,您的逻辑将起作用(但现在,它总是true);提示

让程序只在输入'|'时终止有点棘手-您可以将当前的while循环包装成这样:

do
{
    while (cin >> val1 >> val2) etc. as you have now...
} while (!cin.eof() && cin.clear() && cin.peek() != '|' && cin.ignore(1);

如果您在输入的末尾,则退出,否则clear为流错误状态,检查下一个字符不是'|',如果不是ignore,则任何垃圾字符都会破坏数字解析并返回到下一个字符再次尝试。

请注意,如果有一个好数字,然后是一个垃圾字符,那么好数字将被丢弃,并且在跳过任何垃圾字符后,它将开始寻找两个好数字的序列。