![3e3c57ad5f8f08ac008868065e72e6dc.png](https://i-blog.csdnimg.cn/blog_migrate/e9c9ae472da49c335ccef1d65b89e191.jpeg)
图控大叔
构图传递思想
阅读从未如此简单!!!
01
前言
昨天有个同学(把他当成我的粉丝)找我,说代码出现了bug,并且把源码发我看看。我打开之后才发现,那是与《企业发放的奖金根据利润提成》有关的程序计算,我看了看,改了改,最后找出了问题,并且整理了出来。
02
源码分析
以下是修正过的代码,那位同学出现的错误将在注释中提到。有两种写法,一种是手动输入利润,另一种是设置提成阈值使程序自动结束。
/*【程序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,求应发放奖金总数?
*/
#include
#define BASE 10000
volatile int flag = 1;
volatile double I =0;
double case_get(double i);
int main(int argc, char const *argv[]){
/* code 手动输入利润*/
volatile double count = 0;
double i = 0;
flag =1;
printf("请输入当月利润I:\n");
scanf("%lf",&I);
count =0;
printf("\n");
while(flag)
{
printf("目前利润是 %lf 万\n",I/BASE);
count +=case_get(I/BASE);
printf("累计提成是is %lf \n\n",count);
}
return 0;
}
double case_get(double i){
printf("%s\n",__FUNCTION__);
if(i>100)
{
I -= (i-100)*BASE;
return (i-100)*BASE*0.01;
}
else if(i>60)
{
I -= (i-60)*BASE;
return (i-60)*BASE*0.015;
}
else if(i>40)
{
I -= (i-40)*BASE;
return (i-40)*BASE*0.03;
}
else if(i>20)
{
I -= (i-20)*BASE;
return (i-20)*BASE*0.05;
}
else if(i>10)
{
I -= (i-10)*BASE;
return (i-10)*BASE*0.075;
}
else
{
flag = 0;
return i*BASE*0.1;
}
}
/*
【程序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,求应发放奖金总数?
*/
#include
#define BASE 10000
volatile int flag = 1;
volatile double I =0;
double case_get(double i);
int main(int argc, char const *argv[]){
/* code 设置提成阈值使程序自动结束*/
volatile double count = 0;
double i = 0;
double money =0;
while(1)
{
flag =1;
money = money+10000;
I = money;
/*
那位同学说一直不能超过10万
问题出在了这里,因为此时的I是全局变量,
而下面case_get函数也在对I进行更改
一开始的写法是:I = I + 10000;
因此采用临时变量就可以解决
*/
count =0;
//printf("now I is %lf \n",I);
while(flag)
{
//printf("I is %lf \n",I);
//printf("目前是%lf万 \n",I/BASE);
count +=case_get(I/BASE);
//printf("目前利润%lf万 提成累加为 %lf \n",money,count);
}
//printf("get is %lf \n",count);
if(count >= 39600)
{
printf("最后结果 目前利润%lf万 提成累加为 %lf \n",money,count);
break;
}
}
return 0;
}
double case_get(double i){
//printf("%s\n",__FUNCTION__);
if(i>100)
{
I -= (i-100)*BASE;
return (i-100)*BASE*0.01;
}
else if(i>60)
{
I -= (i-60)*BASE;
return (i-60)*BASE*0.015;
}
else if(i>40)
{
I -= (i-40)*BASE;
return (i-40)*BASE*0.03;
}
else if(i>20)
{
I -= (i-20)*BASE;
return (i-20)*BASE*0.05;
}
else if(i>10)
{
I -= (i-10)*BASE;
return (i-10)*BASE*0.075;
}
else
{
flag = 0;
return i*BASE*0.1;
}
}
以下是CSDN平台上一位博主的写法,那位同学说博主的写法更加简单,不像他的那么麻烦。但是我觉得他的更好,二次修改方便,比如说:如果在某段利润范围更改提成比例,他的代码更改起来速度更快!!
#include
/*
这是CSDN平台一位博主的写法
*/
int main(){
double I,J;
printf("请输入当月利润:");
scanf("%lf",&I);
if(I<=100000)
J=I*0.1;
else if(I<=200000)
J=100000*0.1+(I-100000)*0.075;
else if(I<=400000)
J=100000*0.1+(200000-100000)*0.075+(I-200000)*0.05;
else if(I<=600000)
J=100000*0.1+(200000-100000)*0.075+(400000-200000)*0.05+(I-600000)*0.03;
else if(I<=1000000)
J=100000*0.1+(200000-100000)*0.075+(400000-200000)*0.05+(600000-400000)*0.03+(I-600000)*0.015;
else
J=100000*0.1+(200000-100000)*0.075+(400000-200000)*0.05+(600000-400000)*0.03+(1000000-600000)*0.015+(I-1000000)*0.01;
printf("应得的奖金是:%f\n",J);
return 0;
}
————————————————
版权声明:本文为CSDN博主「AKK188888881」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AKK188888881/java/article/details/104360135
03
结尾
本次推文到这里就要结束了,如果读者在编程中遇到了bug,也可以到后台给小编留言哦!
《图控大叔》,与您一起进步!