实训5.1——求一元二次方程的实根解
教学录像 光盘\chap5\实训5.1——求一元二次方程的实根解
键盘输入一元二次方程ax2+bx+c=0的三个参数a,b和c,计算当判别式b2-4ac>=0时的根,程序使用if语句判断是否满足判别式条件,结果精确到小数点后3位。判别式可计算为sqrt_delta=sqrt(b2-4ac),其中sqrt为求根号的数学函数,调用该函数时需包含头文件math.h。当sqrt_delta大于等于0时方程有实根。因此,一元二次方程的两个根分别为:
x1=(-b+sqrt_delta)/2a,x2=(-b-sqrt_delta)/2a
1. 需求分析
分析目标需求,程序中需要做到如下几条。
需求1:键盘输入参数a, b, c的值。
需求2:判断判别式,确定方程是否有实根。
需求3:调用开根号数学函数sqrt,计算方程的根。
需求4:输出结果,精度为小数点后3位。
2. 技术应用
根据C语言标准以及开发平台版本,完善各个需求模块。
图5-3 一元二次方程求实根流程图
对于需求1,使用scanf函数输入参数a,b,c的值。
对于需求2,使用if语句判断方程是否有实根,判断方法为:if(b2-4ac>=0)。
对于需求3,由于要求精确到小数点后3位,采用数据类型float型。
根据上述分析画出程序流程图,如图5-3所示。
通过上述分析,写出完整的程序如下。
程序清单5.1:CalculateFormulaRealRoot.c
01 #include<stdio.h> 02 #include<math.h> //头文件包含 03 04 main() 05 { 06 float a=0.0; //定义参数a 07 float b=0.0; //定义参数b 08 float c=0.0; //定义参数c 09 float x1=0.0; //定义参数x1 10 float x2=0.0; //定义参数x2 11 float delta=0.0; //定义参数delta 12 float sqrt_delta=0.0; //定义参数sqrt_delta 13 14 printf("请输入三个参数的值a, b, c:\n"); 15 scanf("%f %f %f", &a, &b, &c); //参数输入 16 printf("您输入的三个参数为:\n"); 17 printf("a=%f, b=%f, c=%f\n", a, b, c); 18 printf("开始计算方程的根\n"); 19 delta=b*b-4*a*c; //计算判别式 20 if(delta>=0) //判别式if语句判断 21 { 22 sqrt_delta=sqrt(delta); //计算delta根号值 23 x1=(-b+sqrt_delta)/(2*a); //计算根x1 24 x2=(-b-sqrt_delta)/(2*a); //计算根x2 25 printf("方程的根为:\n"); 26 printf("x1=%.3f, x2=%.3f\n", x1, x2); //输出根x1和x2 27 } 28 }
程序第20行到27行使用if语句判断方程是否有实根,若有,则执行if语句中的程序段。程序运行结果为:
请输入三个参数的值a, b, c
3-6 1
您输入的三个参数为:
a=3.000000, b=-6.000000, c=1.000000
开始计算方程的根
方程的根为:
x1=1.816, x2=0.184
程序第22行用于计算根号的delta值,此时注意调用sqrt函数时应包含头文件math.h。若程序第22行、23行和24行以如下两行代替:
x1=(-b+sqrt(delta))/(2*a);
x2=(-b -sqrt(delta))/(2*a);
此时将调用两次sqrt函数,对程序执行效率将产生一定影响。因此,编写程序时应尽量避免频繁调用函数。
作者心得:
程序没有考虑参数a为0的情况,在C语言中,除数为0将导致程序运行时崩溃,后续章节将对此作进一步描述。
随·堂·实·训5.1
分析程序,当输入参数a, b和c不满足判别式大于等于0时将如何执行,程序输出结果的是什么?输入不同参数验证对结果的影响,例如
(1)输入a=1, b=2, c=1。
(2)输入a=1, b=-3, c=2。