【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万元的部...
第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万,求应发放奖金总数?
【分析】
- 这道题需利用分段函数,条件语句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;
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万元”;当输入其他字符,输出“输入错误”。
目前有两个漏洞:
- 输入“-10”,它不会输出“输入错误”,而是输出计算结果;
- 输入字母'f',理论上应该输出“输入错误”,可是f转换为了0。('f' 的ascll码为102)
- 输入不满足题意的数值,执行else分支语句时,除了输出“输入错误”,还会输出一个错误的结算结果。
【解决方案】
第一个漏洞的原因是:由于没有考虑周全,省略掉了“高于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)