#include <stdio.h>
#include <iostream>
using namespace std;
float cost, total;
bool loop(char item){
switch (toupper(item)) {
case 'A':
cost = 4.25;
return true;
case 'B':
cost = 5.57;
return true;
case 'C':
cost = 5.25;
return true;
case 'D':
cost = 3.75;
return true;
case 'T':
return false;
}
return true;
}
int main(){
char item;
do {
printf("\nEnter Item Ordered [A/B/C/D] or T to calculate total:");
scanf("%c", &item);
total = total + cost;
} while (loop(item));
printf("Total Cost: $%f\n", total);
}
让我输出这个过程:
$ ./Case3.o
Enter Item Ordered [A/B/C/D] or T to calculate total:a
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:b
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:a
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:t
Total Cost: $28.139999
为什么在第一次打印之后它会打印printf
两次,但第一次跳过输入。那怎么计算5.24 + 5.57 + 5.24等于28.14?
答案 0 :(得分:3)
enter
是一次击键 - 你需要考虑它:)
至于你的数学,你永远不会将 total
初始化为0
,因此初始值是不确定的。
没有注意范围 - 数学的真正答案是,当按下enter
时,循环会重新添加先前的成本。这在Mysticial的回答中有所说明。
答案 1 :(得分:2)
正如其他人所说,当你按Enter键时,输入两个字符the character you enter + the newline
,你需要考虑这两个字符。
可能的解决方案是:
方法1:C方式
scanf(" %c", &item);
^^^
在这里添加空格,或更好的方法,
方法2:C ++方式
只需使用C ++方式从用户那里获取输入。
cin >> item;
为什么结果是未定义的?
因为您没有初始化变量 total
,这导致未定义行为给您意想不到的输出。
total
是全局的,因此默认初始化为0.0
未定义结果的真正原因在于@Mystical的答案。
答案 2 :(得分:1)
这很容易解释。当您输入a
并点击ENTER
键时,会在输入缓冲区中放置两个字符,a
和newline
字符。< / p>
这就是为什么,除了第一个之外,你有一个虚假的提示,因为它打印它然后从标准输入获得newline
。
scanf
在C ++中实际上是一个C兼容的东西,你应该使用cin >> something
(或任何与流相关的东西)来进行C ++风格的输入。
这次夸大其辞的同时也解释了错误总数,因为当你 newline
时,你再次添加的成本当前值在你的主循环中。
您的总数由每个值中的两个组成,因为无论输入的值是什么,您都要添加cost
。
当您输入a,b,a
时,4.25 + 5.57 + 4.25 = 14.07
- a
的输入为4.25
,而不是5.24
。 28.14
恰好是14.07
的两倍。
答案 3 :(得分:1)
由于已提到newline
,我将回答为什么28.14
的其他问题。
请注意,在您的交换机中,默认只是返回。永远不会设置cost
。因此,当它读入newline
时,它会跳过开关块并保持成本不变。
结果如下:
total = 0; // It's actually undefined since you didn't initialize, but it probably started as zero.
total += 4.25; // For a
total += 4.25; // For '\n' after the 'a'
total += 5.57; // For b
total += 5.57; // For '\n' after the 'b'
total += 4.25; // For a
total += 4.25; // For '\n' after the 'a'
最终答案:28.14
最后输入的t
不会添加到total
。