斯特劳斯特鲁普的P:PP 第4章 钻头:卡住
Stroustrup's P:PP Chapter 4 Drill: Stuck
我被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
,则任何垃圾字符都会破坏数字解析并返回到下一个字符再次尝试。
请注意,如果有一个好数字,然后是一个垃圾字符,那么好数字将被丢弃,并且在跳过任何垃圾字符后,它将开始寻找两个好数字的序列。
相关文章:
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- *++*++ppp,*++pp[1],*++(*(1+ppp)有什么具体的区别吗?(C/C++指针问题)
- C 中的钻头数学操作
- 代码 P 的问题:PP 演练 4
- 钻头以两个数字替换位
- 钻头和转移操作数以清除选定的十六进制数
- 在AVX2中的钻头不/补充
- 从长时间中提取每个单词的钻头操作
- 提前钻头操纵,在任何POS中留下空位
- 铸造钻头数据To和From float
- 第4章 斯特劳斯特鲁普钻头一个具有挑战性的一步(至少对我来说!
- 哪种结构适合钻头
- stroustrup ppp第8章钻头头部
- 移除第一个钻头
- 简单的钻头设置和清洁
- pp标记还剩下哪些字符
- C/pp套接字,recv()/send()只在gdb下工作
- Bjarne Stroustrup的P:PP Chapter 4 Drill
- 采用组合技术,提高了钻头测试作业的速度
- 斯特劳斯特鲁普的P:PP 第4章 钻头:卡住