这个题目相信大家多多少少见过,这个题目也是今天我好朋友(美女哦兄弟们)过来问我才记起来的,感觉还可以,所以分享给大家
【狡辩一下 最近课程比较多 没时间给大家整理c的学习内容 这几天应该会多更新题目 我会尽量更新宁外一个系列的。】
先看题目 先看题目
企业发放的奖金根据利润提成。
利润(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,求应发放奖金总数?
这个题目之所以推给大家呢,主要是他可以用两种方法解决,两种方法:
一种方法是 if-else 另一种是 switch-case-default
相信大家相对于用 if 用的多一些,所以这个题目可以用来练手switch的使用,再者这个题目用switch也需要点小技巧。
解题思路为
设置利润变量------判断利润区间------进行相应的计算
设置变量和输入就用int 和scanf 解决
判断利润区间就是用 if 或者 switch
我们先看用 if-else
这个题目首先就是要把分段关系弄清楚,分别求出每一段的价位情况,容易混淆,但是大伙儿慢慢来,还是比较简单的。
像我这个过程,先是用变量记录每个阶段的固定数值,然后进行判断计算
#include<stdio.h>
int main()
{
double l=0;//单位 万元
double p;//奖金最终值
printf("输入当月利润") ;
scanf("%d",&l);
double a=10*0.1;
double b=a+10*0.075;
double c=b+20*0.05;
double d=c+20*0.03;
double e=d+40*0.015;
if(l>100){
p=e+(l-100)*0.01;
printf("当月奖金为%lf",p);
} else if(l>60){
p=d+(l-60)*0.015;
printf("当月奖金为%lf",p);
}else if(){
p=c+(l-40)*0.03;
printf("当月奖金为%lf",p);
}else if(){
p=b+(l-20)*0.05;
printf("当月奖金为%lf",p);
}else if(){
p=a+(l-10)*0.075;
printf("当月奖金为%lf",p);
}else if(){
p=l*0.1;
printf("当月奖金为%lf",p);
}
}
对于我们这个代码呢,是存在不足的,不符合我们的单一出口的原则。
什么是单一出口原则呢,这是我们代码优化的一个标准,对于我们的代码,我们要尽量的保证只有一个出口。可能很多人第一次听说这个,我们用这个题目来举个例子。
假设我们这个题目用这串代码
#include<stdio.h>
int main()
{
double l=0;//单位 万元
double p;//奖金最终值
printf("输入当月利润") ;
scanf("%d",&l);
double a=10*0.1;
double b=a+10*0.075;
double c=b+20*0.05;
double d=c+20*0.03;
double e=d+40*0.015;
if(l>100){
p=e+(l-100)*0.01;
} else if(l>60){
p=d+(l-60)*0.015;
}else if(){
p=c+(l-40)*0.03;
}else if(){
p=b+(l-20)*0.05;
}else if(){
p=a+(l-10)*0.075;
}else if(){
p=l*0.1;
}
printf("当月奖金为%lf",p);
}
我们可以看到,这样子写,答案和效果都没有变,但是我们只有一个printf了,这相对于原本那个,更加简洁,也更加高效,这就是我们说的单一出口原则 所以,以后我们如果遇到这种多出口的情况,可以考虑一下如何让他出口更加少。这个虽然不影响我们做题目,但是我们之前说过,这是区分码农和程序员的一个指标,对于我们的编程素养有提高的。
现在让我们来看看第二种 switch-case的解法
这个的话 我们知道switch-case的用法为
switch (表达式)
{
case 常量表达式1: 语句1
case 常量表达式2: 语句2
┇
case 常量表达式n: 语句n
default: 语句n+1
}
那么问题就来了,我们的输入利润数值肯定是个不确定的变量,那么我们总不可能一个数字一个数字的写,这个时候,我们就需要找寻共性,找到常量来作为判断条件。
所以,在常量这个方面,我们来想一想,随便举几个例子。123000,230000,740000,134500
这些数字,或者我们来的跟大一些,100000~200000这一串的数字,都有什么共性?没错,他们的最高位的数字都是1
这么想的话,一下子就明朗了,我们可以用最高位,来代替相对应范围内的数字了,不就找到我们所需要的常量了吗?
那么我们来操作一下。
#inlcude<stdio.h>
int main(){
int t=100000,x,c; //创建相关变量
double d=0;// 最终所求
scanf("%d",&x);//数据输入
c=x/t;//判断根据
switch(c){
case 0:d=x*0.1;break;
case 1:d=t*0.1+(x-t)*0.075;break;
case 2:
case 3:d=t*0.1+t*0.075+(x-2*t)*0.05;break;
case 4:
case 5:d=t*0.1+t*0.075+2*t*0.05+(x-4*t)*0.03;break;
case 6:
case 7:
case 8:
case 9:d=t*0.1+t*0.075+2*t*0.05+4*t*0.03+(x-6*t)*0.015;break;
default:d=t*0.1+t*0.075+2*t*0.05+4*t*0.03+6*t*0.015+(x-10*t)*0.01;break;
}
printf("%d",d);
return 0;
}
这个是美女朋友写的哦,我们来分析一下,
她的这串代码的优点在于:思路还是比较清晰的,并且符合我们的单一出口原则,在界面上很美观。
缺点在于:太优秀了doge/ 当然我们说着笑,缺点在于变量名字建议大家还是习惯用money等英文名,不仅方便自己以后维护(当然是对于以后做大项目),也方便别人查看。
今天的题目解析就到这里,老规矩,大伙儿评论区见。点赞收藏加关注,谢谢老铁!