题目2:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
分析:题目出的有歧义,比如“20万到40万之间时,高于20万元的部分,可提成5%”,可是并没有提到这种情况下低于20万的部分如何处理,暂时理解成低于20万的部分,是按照“利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%”来处理的。同样,利润每升一个台阶,都存在同样的问题。如果直接写if…else if的判断,那么20万之内的利润,还好判断,如果利润在20万到40万之间的话,20万以上的利润可以直接乘以5%,20万以下的利润,还要再判断一次是低于10万还是在10万到20万之间,利润每上一个台阶,就得多一个判断,这个思路写出来的程序可读性和可维护性都不高。所以要还另外一种思路。另外,因为要乘以小数,所以数据类型不要使用int,应使用double。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <stdio.h> int main(void) { double I=0; //利润 double prizeA,prizeB,prizeC,prizeD,prizeE; //各阶段奖金的分频金额 double prize; //奖金总数 prizeA = 100000*0.1; //十万~二十万之间时,低于十万部分的分配方式 prizeB = prizeA+100000*0.075; //二十万~四十万之间时,低于二十万的部分的分配方式 prizeC = prizeB+200000*0.05; //四十万~六十万之间时,低于四十万的部分的分配方式 prizeD = prizeC+200000*0.03; //六十万~一百万之间时,低于六十万的部分的分配方式 prizeE = prizeD+400000*0.015; //一百万以上时,一百万以下的部分的分配方式 printf("当月的利润是?"); scanf("%lf",&I); //键盘录入利润 //根据利润的范围计算奖金金额 if(I<=100000) { prize=I*0.1; } else if(I<=200000) { prize=prizeA+(I-100000)*0.075; } else if(I<=400000) { prize=prizeB+(I-200000)*0.05; } else if(I<=600000) { prize=prizeC+(I-400000)*0.03; } else if(I<=1000000) { prize=prizeD+(I-600000)*0.015; } else if(I>1000000) { prize=prizeE+(I-1000000)*0.01; } printf("奖金总数是:%.2f",prize); //打印奖金金额 return 0; } |
