而/ Switch语句奇怪的输出

时间:2011-10-18 04:46:49

标签: c++ switch-statement do-while

#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?

4 个答案:

答案 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键时,会在输入缓冲区中放置两个字符,anewline字符。< / 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.2428.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