每日一学6
本帖最后由 6bingame 于 2024-11-29 14:15 编辑结构化程序设计方法
课本例题
求解一元二次方程
题1:求一元二次方程ax平方+bx+c=0的根
解:
第1步:结构化分析
先从最上层考虑,求解问题的算法可以分成3个小问题,即输入问题、求解问题和输出问题。
这3个小问题就是求一元二次方程根的3个功能模块——输入模块M1、计算处理模块M2和输出模块M3。
其中,M1模块完成输入必要的原始数据,M2模块根据求根算法求解,M3模块完成所得结果的显示或打印。
这样的划分,可使求一元二次方程根的问题变成3个相对独立的子问题。
其模块机构如下所示。
->M1[输入数据]->M2[根据算法求解]->M3[输出结果]
分解出的3个模块从总体上是顺序结构。
其中,M1和M3模块完成简单的输入和输出,可以直接设计出程序流程,不需要再分解。
而M2模块完成求根计算,求根则需要首先判断二次项系数a是否为0.
当a=0时,方程蜕化成一次方程,求根方法就不同于二次方程。
如果a≠0,则要根据b平方-4ac的情况求二次方程的根。
可见M2模块比较复杂,可以将其再细化成M21和M22两个子模块,分别对应一次方程和二次方程的求根。
其模块结构如下所示。
->{a=0?}->Y->M21
->N->M22[求二次方程根]
然后,分别对M1、M21和M3的算法进行结构组成,最终得到细化后完整的流程图。
->->->{a>=0}->Y->
->N->
第2步:编程实现
#include<stdio.h>
#include<math.h> //调用sqrt()函数,必须包含头文件math.h
int main()
{
float a,b,c,d;
float x1,x2,x;
printf("请输入a,b,c值:"); //提示用户输入
scanf("%f%f%f",&a,&b,&c); //用户由键盘输入a,b,c的值
if(a==0.0) //如果a为零,方程的两个根均为-c/b
{
x1=x2=-c/b;
}
else //如果a不为零,执行以下代码
{
d=b*b-4*a*c;
x=-b/(2*a);
if(d>=0) //如果b*b-4*a*c>=0,计算出如下平方根
{
x1=x+sqrt(d)/(2*a);
x2=x-sqrt(d)/(2*a);
}
else //如果b*b-4*a*c<0,计算出如下平方根
{
x1=x+sqrt(-d)/(2*a);
x2=x-sqrt(-d)/(2*a);
}
}
printf("\n该方程式的两个根分别为:%f,%f\n",x1,x2); //输出结果
return 0;
}
页:
[1]