0
#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 之后打印printf两次但第一次跳过我的输入。那么如何计算 5.24+5.57+5.24 等于 28.14?

4

4 回答 4

3

enter是击键 - 你需要考虑它:)

至于你的数学,你永远不会初始化total0因此初始值是不确定的。

没有注意范围 - 数学的真正答案是循环在enter按下时重新添加先前的成本。Mysscial 的回答中指出了这一点。

于 2011-10-18T04:49:55.843 回答
2

正如其他人提到的,当您按 Enter 时,会输入两个字符the character you enter + the newline,您需要同时考虑这两个字符。

可能的解决方案是:

方法 1:C 方式

 scanf(" %c", &item);
       ^^^

在这里加个空格,或者更好的方法,

方法 2:C++ 方式

只需使用 C++ 方式从用户获取输入。

cin >> item;

为什么结果是未定义的?
因为您没有初始化变量total,这会导致未定义的行为给您意外的输出。
total是一个全局变量,因此默认初始化为 0.0。
未定义结果的真正原因在@Mystical 的回答中。

于 2011-10-18T04:54:12.163 回答
1

这很容易解释。当您输入a并按下ENTER键时,这会在输入缓冲区中放置两个a字符,即字符和newline字符。

这就是为什么,除了第一个,你有一个虚假的提示,因为它会打印它然后newline从标准输入中获取。

scanf在 C++ 中确实是 C 兼容性的东西,你应该使用cin >> something(或任何与流相关的东西)用于 C++ 风格的输入。

这种双重命中的字符也解释了错误的总数,因为当您输入它时,您在主循环中再次newline添加当前的成本值。

您的总数由每个值中的两个组成,因为cost无论输入的值如何,您都在添加。

随着您的输入a,b,a,那将是4.25 + 5.57 + 4.25 = 14.07-a4.25,不是5.24。而且28.14正好是两倍14.07

于 2011-10-18T04:50:02.597 回答
1

既然newline已经提到了,我将回答另一个为什么28.14

请注意,在您的开关中,默认值只是返回。cost永远不会设置。因此,当它读入时,newline它会跳过 switch 块并保持 cost 不变。

所以结果是这样的:

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.

于 2011-10-18T04:54:00.743 回答