C语言程序设计案例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

实训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。