上个月已经用if语句做过这道题,今天要用刚学的switch语句实现,中午牺牲午睡的时间跑去图书馆完成了.本以为上次用if语句做出这道题后,这次用switch-case语句也应该没问题,结果却花费了我不少时间才完成.看来军训回来后头脑变钝了好多:P
大致思路和if语句差不多,我认为用switch-case语句做这道题有两个关键也是难点,一是switch后面的整型表达式该如何表达,二是case后面的常量表达式又该如何安排.我再次仔细阅读了原题,根据它的分段标准及规律,才有了上面的安排.我发现有一点要注意,与上次嵌套选择语句不同,在if语句中,Income不必多次赋值,而这次是多分支选择语句,在switch-case语句中,由于每个case都是相对独立的,所以在每个case中的复合语句的Income都要重新赋值.
还有,上次在if语句中我将收入Income定义为浮点型,这次注意到了switch后面只能跟整型表达式,所以我将Income定义为整型,然后,Tax也下意识的定义为整型,问题出来了,结果运行时,得出的答案有些是正确的,有些比正确答案少1,后来才发现是Tax的类型问题,原来它应该被定义为浮点型.
最后改正完调试运行时,输入20000以内数字得出的结果均正确,不过我不明白,根据上面这段代码,当输入40000时,40000-1600=38400>0,而38400/500>76应该列入default范围内,因此应该可以算出结果,为什么显示的结果为No Tax呢?想了大半天,我才猛地想起老师曾经讲过,有符号整常数的范围是-32768~+32767,由于iIncome=iIncome-1600,所以iIncome的最大值应该是32767+1600=34367,据此我初步得出一个结论:当输入大于34367的整数时,也就是输入大于等于34368的整数时,显示的结果就为No Tax,于是我测试了一下,果真如此.但是当我把这段代码去掉getch();这一行后放到VC++下面执行时,并无此问题......
[updated]后来请教sic研发部的戴师兄才知道,编译器不同,int代表的值也不同,在Win-TC下,int的值只有两个字节,而在VC++下,int的值是4个字节,所以范围就更广了.
#include <stdio.h>
void main()
{
int iIncome = 0;
float fTax = 0.0;
scanf("%d",&iIncome);
iIncome = iIncome - 1600;
if (iIncome > 0)
{
switch (iIncome / 500)
{
case 0:
fTax = 0.05 * iIncome;
break;
case 1:
case 2:
case 3:
iIncome = iIncome - 500;
fTax = 0.05 * 500 + 0.10 * iIncome;
break;
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
iIncome = iIncome - 500 - 1500;
fTax = 0.05 * 500 + 0.10 * 1500 + 0.15 * iIncome;
break;
default:
iIncome = iIncome - 500 - 1500 - 3000;
fTax = 0.05 * 500 + 0.10 * 1500 + 0.15 * 3000 + 0.20 * iIncome;
}
printf("Tax is %-4.2f",fTax);
}
else
{
printf("No Tax");
}
getch();
}





