利用C++求解一元二次方程
题目:求解一元二次方程:ax²+bx+c=0 的解,其中a=1,b=-3,c=2.
分析:大家都知道一元二次方程的解有三种情况,即考虑Δ=(b²-4ac)的算术平方根,当Δ>0时,方程有两个不相等的实根x1=(-b+sqrt(d))/(2a);x2=(-b-sqrt(d))/(2a);当Δ=0时,方程有两个相等的实根x1=x2=(-b)/(2a);当Δ<0时,方程有两个不相等的虚根x1=(-b)/(2a),x2=sqrt(-d)/(2a)。
以上是我们解数学题的思路,可是如果我们用C++来解决一元二次方程组求解的问题该怎么处理呢?首先先要建立一个FindRoot类,并声明a,b,c,d四个float类型的数据成员,d代表Δ,方程的根x1,x2均声明成double类型,为了简单方便同时声明构造函数,程序的主函数进行参数准备并且进行求解和输出,下面是我做的FindRoot类UML图和obj对象UML图:
下面就介绍一下此程序在Visual C++ 6.0中的实现步骤和结果:
步骤:
1.建立一个名为equation的工程,即在project菜单栏中选择“Win32 Console Application“选项。
2.为工程添加一个头文件equation.h,声明FindRoot类并包含需要的头文件。
具体代码:
#if !defined(EQUATION_H)
#define EQUATION_H
#include<iostream>
#include<cmath>
using namespace std;
//声明FindRoot类
class FindRoot
{
private:
float a,b,c,d;
double x1,x2;
public:
FindRoot(float x,float y, float z);
void Find();
void Display();
};
#endif
3.为工程添加equation.cpp文件,在这个文件中实现FindRoot。
具体代码:
#include "equation.h"
//实现FindRoot类
FindRoot::FindRoot(float x,float y,float z) //构造函数
{
a=x;
b=y;
c=z;
d=b*b-4*a*c;
}
void FindRoot::Find() //实现成员函数Find
{
if(d>0)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
return;
}
else if(d==0)
{
x1=x2=(-b)/(2*a);
return;
}
else
{
x1=(-b)/(2*a);
x2=sqrt(-d)/(2*a);
}
}
void FindRoot::Display() //实现成员函数Display
{
if(d>0)
{
cout<<"x1="<<x1<<"\nx2="<<x2<<endl;
return;
}
else if(d==0)
{
cout<<"x1=x2="<<x1<<endl;
return;
}
else
{
cout<<"x1="<<x1<<"+"<<x2<<"i"<<endl;
cout<<"x2="<<x1<<"-"<<x2<<"i"<<endl;
}
}
4.为工程添加Find.cpp文件,并在文件中设计主函数对方程求解。
具体代码:
#include "equation.h"
void Read(float&,float&,float&); //参数使用对象引用方式
void main()
{
float a,b,c;
cout<<"这是一个求方程ax2+bx+c=0的根的程序。"<<endl;
for(;;) //循环求解
{
Read(a,b,c); //准备系数
if(a==0) return; //根据输入系数a决定是否结束for循环
FindRoot obj(a,b,c); //建立对象obj
obj.Find(); //求解
obj.Display(); //输出计算结果
}
}
void Read(float& a,float& b,float& c) //准备系数
{
cout<<"输入方程系数a:";
cin>>a;
if(a==0) //系数为零则退出Read函数
{
getchar(); //消除回车影响
return;
};
cout<<"输入方程系数b:";
cin>>b;
cout<<"输入方程系数c:";
cin>>c;
}
5.编译并运行程序。
运行结果:
结果和计算的结果一样,有了这样的一个程序,我们以后解数学的一元二次方程就不愁了,只要把方程化成一般式,然后在程序中输入相应参数就可快速得到答案了,虽然可以快速得到答案,但是还是不鼓励一直用程序解方程,因为学习贵在理解解题的思路和解题过程,只有这样才能有所感所悟,也会有所提高。
当然这个程序设计的不是特别的好,但是为了具体设计项目的思路,所以做的复杂一点,贵在理解,谢谢,希望可以帮到你。顺便祝你有个好心情。
补充:软件开发 , C++ ,