实训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的相同和不同之处。