经典C程序100例(2)

题目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;	
}

标签: , ,

留下回复