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

实训5.2——求一元二次方程的复数根解

教学录像 光盘\chap5\实训5.2——求一元二次方程的复数根解

键盘输入一元二次方程ax2+bx+c=0的三个参数a,b和c,计算当判别式b2-4ac>=0时,输出实数根;当判别式b2-4ac<0时,输出复数根,并检查输入参数的正确性。使用嵌套if语句实现。首先使用scanf函数输入三个参数a,b和c,定义判别式变量delta=b2-4ac,定义变量sqrt_delta=sqrt(b2-4ac),其中sqrt为求根号的数学函数,调用该函数时需包含头文件math.h。当delta大于0时方程有两个不相等的实根,此时一元二次方程的两个根分别为:

x1=(-b+sqrt_delta)/2a,x2=(-b-sqrt_delta)/2a

当delta等于0时,方程有一个实根:

x = -b/2a

当delta小于0时,方程有两个共轭复数根,分别为:

x1 = -b/2a + sqrt_delta/2ai,x2 = -b/2a - sqrt_delta/2ai

1. 需求分析

分析目标需求,程序中需要做到如下几条。

需求1:键盘输入参数a, b, c的值并判断输入参数。

需求2:判断判别式,确定方程有实根还是复数根。

需求3:调用开根号数学函数sqrt,计算方程的根。

需求4:输出结果。

2. 技术应用

根据C语言标准以及开发平台版本,完善各个需求模块。

对于需求1,使用scanf函数输入参数a, b, c的值,首先判断变量a的值是否满足一元二次方程的要求。

对于需求2,使用if语句判断方程有实根还是有复数根,判断语句为:if(b2-4ac>=0)。

对于需求3,输出结果时根据实根和复数根的不同,输出不同数据格式,如复数根应输出:m+ni和m-ni的形式。

根据上述分析画出程序流程图,如图5-8所示。

图5-8 一元二次方程求复数根流程图

通过上述分析,写出完整的程序如下。

程序清单5.2:CalculateFormulaRealRoot.c

      01   #include<stdio.h>
      02   #include<math.h>
      03   main()
      04   {
      05       float a=0.0;
      06       float b=0.0;
      07       float c=0.0;
      08       double x=0.0, x1=0.0, x2=0.0;
      09       double delta=0.0;
      10       double sqrt_delta=0.0;
      11       double RealPart=0.0;
      12       double ImaginaryPart=0.0;
      13      printf("请输入三个参数a, b, c的值:\n");
      14      scanf("%f %f %f", &a, &b, &c);                //输入参数
      15      printf("您输入的三个参数值为:\n");
      16      printf("a=%f, b=%f, c=%f\n", a, b, c);             //参数打印
      17       if(0! =a)                               //参数a判断
      18       {
      19          delta=b*b-4*a*c;                 //判别式计算
      20          RealPart=-b/(2*a);                 //实部计算
      21           if(delta>=0)                        //判别式判断
      22           {
      23               sqrt_delta=sqrt(delta);            //判别式取根号
      24               printf("开始计算实根\n");
      25               if(0==delta)                    //实根个数判断
      26               {
      27                   x1=RealPart;              //一个实根
      28                   printf("该方程有一个实根:x=%f\n", x1);
      29               }
      30               else                          //两个实根
      31               {
      32                  x1=RealPart+sqrt_delta/(2*a);
      33                  x2=RealPart-sqrt_delta/(2*a);
      34                   printf("该方程有两个实根:x1=%f, x2=%f\n", x1, x2);
      35               }
      36           }
      37           else                              //复根分支
      38           {
      39               sqrt_delta=sqrt(-delta);           //判别式取根号
      40              ImaginaryPart=sqrt_delta/(2*a);     //虚部计算
      41               printf("计算两个复数根\n");
      42               printf("该方程有两个复数根:\n");
      43               printf("x1=%f+%fi\n", RealPart, ImaginaryPart);
      44               printf("x2=%f-%fi\n", RealPart, ImaginaryPart);
      45           }
      46       }
      47       else                                  //参数a非法分支
      48       {
      49           printf("错误:输入参数不正确\n");
      50       }
      51   }

程序第17行首先判断输入参数a是否为0,若为0,则判定输入参数不能组合成一元二次方程,打印错误信息,然后退出。

若a不为0,则进入正常计算流程,首先计算delta和对称轴数值-b/2a,如程序第19行和20行所示。然后判断delta是大于零,等于零,还是小于零。并根据不同情况计算不同类型的方程根。

程序运行时输入参数值12、-5和9,按回车键。

请输入三个参数a, b, c的值:

12-5 9

输出结果为:

您输入的三个参数值为:

a=12.000000, b=-5.000000, c=9.000000

计算两个复数根

该方程有两个复数根:

x1=0.208333 + 0.840593i

x2=0.208333-0.840593i

程序对输入参数,以及运算过程中潜在的错误均作了判断和检测,因此保证程序执行时不出现崩溃。如程序中对输入参数a作了非0检查,避免误将a赋值为0时,程序将因为a作为除数而运行崩溃。

随·堂·实·训5.2

程序第39行在开根号时对delta作了取反,若不做取反操作,系统将因为sqrt函数参数为正而导致崩溃,读者可尝试将第39行中的负号去掉,验证输入结果。

同时,读者也可以去掉对a的入参检查,并对参数a输入0,验证程序的运行流程。

分析本实训与实训5.1的相同和不同之处。