新手c好题推荐之 利润题目

这个题目相信大家多多少少见过,这个题目也是今天我好朋友(美女哦兄弟们)过来问我才记起来的,感觉还可以,所以分享给大家

【狡辩一下 最近课程比较多 没时间给大家整理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等英文名,不仅方便自己以后维护(当然是对于以后做大项目),也方便别人查看。

今天的题目解析就到这里,老规矩,大伙儿评论区见。点赞收藏加关注,谢谢老铁!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZealSinger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值