【C语言经典100题】第2题(代码可优化,待更新)

举报
holo.yh 发表于 2021/05/19 22:13:43 2021/05/19
【摘要】 第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万元的部...

第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 = 12万,求应发放奖金总数?

【分析】

  1. 这道题需利用分段函数,条件语句if-else;
  2. 计算每段的利润+提成 = 奖金总数。

【代码】

#include<stdio.h> 
int main(){
	float I , J , sum; //I为利润,J为提成=利润*百分比,sum为奖金总数;
					 //单位均为:万 
	scanf("%f",&I); //输入利润 
	if(I <= 10 && I >= 0){
		J = I * 0.1;
		sum = I + J;
	}else if(I <= 20){ //高于10万低于20万 
		J = (I - 10) * 0.075 + 10 * 0.1;
		sum = I + J; 
	}else if(I <= 40){ //高于20万低于40万 
		J = (I - 20) * 0.05 + 10 * 0.075 + 10 * 0.1;
		sum = I + J; 
	}else if(I <= 60){ //高于40万低于60万 
		J = (I - 40) * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;
		sum = I + J; 
	}else if(I <= 100){ //高于60万低于100万 
		J = (I - 60) * 0.015 + 20 * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;
		sum = I + J; 
	}else if(I >= 100){ //高于100万
		J = (I - 100) * 0.01 + 40 * 0.015 + 20 * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;
		sum = I + J; 	
	}else{ //输入错误 
		printf("输入有误!"); 
	}	
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
}

【运行结果】

【代码缺陷】
这个代码理想中应该:当输入>=0的数字才会执行输出:“提成为x万元,奖金总数为x万元”;当输入其他字符,输出“输入错误”。
目前有两个漏洞:
  1. 输入“-10”,它不会输出“输入错误”,而是输出计算结果;
  2. 输入字母'f',理论上应该输出“输入错误”,可是f转换为了0。('f' 的ascll码为102)
  3. 输入不满足题意的数值,执行else分支语句时,除了输出“输入错误”,还会输出一个错误的结算结果。


RX2PZ$0(7KM{P(Q{1__W{2W.png

`8N[2`$V6LAPJRIYK1]4L5B.png



【解决方案】

第一个漏洞的原因是:由于没有考虑周全,省略掉了“高于10万”这个判断条件;输入-10,由于-10<20,所以系统执行了第二个分支“I <= 20”的语句。

所以将省略掉第2-5个的分支里的条件补充完整,即可解决此漏洞。

第二个漏洞的原因:目前猜测是系统将“f”转换为ASCLL码值了。(×

       暂未解决

第三个漏洞是逻辑问题:将print 计算结果的语句放到if-else分支里即可解决。


【代码优化】

#include<stdio.h> 
int main(){
	float I , J , sum; //I为利润,J为提成=利润*百分比,sum为奖金总数;
					 //单位均为:万 
	scanf("%f",&I); //输入利润 
	if(I <= 10 && I >= 0){
		J = I * 0.1;
	}else if(I > 10 && I <= 20){ //高于10万低于20万 
		J = (I - 10) * 0.075 + 10 * 0.1;	
		sum = I + J; 
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
	}else if(I > 20 && I <= 40){ //高于20万低于40万 
		J = (I - 20) * 0.05 + 10 * 0.075 + 10 * 0.1;	
		sum = I + J; 
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
	}else if(I > 40 && I <= 60){ //高于40万低于60万 
		J = (I - 40) * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;	
		sum = I + J; 
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
	}else if(I > 60 && I <= 100){ //高于60万低于100万 
		J = (I - 60) * 0.015 + 20 * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;	
		sum = I + J; 
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
	}else if(I >= 100){ //高于100万
		J = (I - 100) * 0.01 + 40 * 0.015 + 20 * 0.03 + 20 * 0.05 + 10 * 0.075 + 10 * 0.1;		
		sum = I + J; 
		printf("提成为:%f万元\n应发奖金总数为:%f万元\n",J,sum);
	}else{ //输入错误 
		printf("输入有误!"); 
	}
}

优化后的代码运行结果:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。