【例5.7】求一元二次方程ax2+bx+c=0的解(a≠0)。
#include "math.h"
main()
{floata,b,c,disc,x1,x2,p,q;
scanf("%f,%f,%f",&a,&b,&c);
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)/*fabs():求绝对值库函数*/
printf("x1=x2=%7.2f\n",-b/(2*a));/*输出两个相等的实根*/
else
{if(disc>1e-6)
{x1=(-b+sqrt(disc))/(2*a);/*求出两个不相等的实根*/
x2=(-b-sqrt(disc))/(2*a);
printf("x1=%7.2f,x2=%7.2f\n",x1,x2);
}
else
{p=-b/(2*a); /*求出两个共轭复根*/
q=sqrt(fabs(disc))/(2*a);
printf("x1=%7.2f+%7.2fi\n",p,q);/*输出两个共轭复根*/
printf("x2=%7.2f-%7.2fi\n",p,q);
}
}
}
说明:由于实数在计算机中存储时,经常会有一些微小误差,所以本案例判断disc是否为0的方法是:判断disc的绝对值是否小于一个很小的数(例如10-6)。
思考题:如果将系数a,b,c定义成整数,能否直接判断disc是否等于0?
【例5.8】已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下 (计量单位:元):
profit≤1000 没有提成;
1000<profit≤2000 提成10%;
2000<profit≤5000 提成15%;
5000<profit≤10000 提成20%;
10000<profit 提成25%。
算法设计要点:
为了使用switch语句,必须将利润profit与提成的关系转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍 (1000,2000,5000,…),如果将利润profit整除1000,则:
profit≤1000 对应0,1
1000<profit≤2000 对应1,2
2000<profit≤5000 对应2,3,4,5
5000<profit≤10000 对应5,6,7,8,9,10
10000<profit 对应10,11,12,…
为了解决相邻两个区间的重叠问题,最简单的方法是:利润profit先减1(最小增量),然后再整除1000:
profit≤1000 对应0
1000<profit≤2000 对应1
2000<profit≤5000 对应2,3,4
5000<profit≤10000 对应5,6,7,8,9
10000<profit 对应10,11,12,…
main()
{long profit;
int grade;
float salary=500;
printf("Input profit:");
scanf("%ld",&profit);
grade=(profit-1)/1000;/*将利润-1,再整除1000,转化成switch语句中的case标号*/
switch(grade)
{case 0: break;/*profit≤1000*/
case 1:salary+=profit*0.1;break;/*1000<profit≤2000*/
case 2:
case 3:
case 4:salary+=profit*0.15;break;/*2000<profit≤5000*/
case 5:
case 6:
case 7:
case 8:
case 9:salary+=profit*0.2;break;/*5000<profit≤10000*/
default:salary+=profit*0.25;/*10000<profit*/
}
printf("salary=%.2f\n",salary);
}
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。