利用C++求解一元二次方程
2012-10-06 00:07
260 查看
题目:求解一元二次方程: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.编译并运行程序。
运行结果:
结果和计算的结果一样,有了这样的一个程序,我们以后解数学的一元二次方程就不愁了,只要把方程化成一般式,然后在程序中输入相应参数就可快速得到答案了,虽然可以快速得到答案,但是还是不鼓励一直用程序解方程,因为学习贵在理解解题的思路和解题过程,只有这样才能有所感所悟,也会有所提高。
当然这个程序设计的不是特别的好,但是为了具体设计项目的思路,所以做的复杂一点,贵在理解,谢谢,希望可以帮到你。顺便祝你有个好心情。
分析:大家都知道一元二次方程的解有三种情况,即考虑Δ=(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++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出
- 一元二次方程求解 使用c++ class编写
- 一元二次方程求解C++实现
- 利用模拟退火算法求解TSP问题(C++实现)
- 利用C语言求解一元二次方程组的解
- 利用统计方法求π(PI),并可视化显示求解过程(C++&&OpenCV)
- 【c++程序】求解一元二次方程
- c语言入门之项目1.8——利用if语句一元二次方程求解
- 第十一周项目四C/C++利用遍历思想求解图问题
- C/C++中利用空指针(NULL),提高程序运行效率
- 第12周项目4 利用遍历思想求解图问题
- [C++面试题]之循环链表、队列、栈和堆(在csdn上看到一道面试题—求解啊)
- 利用栈结构二进制数转十进制数代码实现c++
- 利用C++将输入一个字符串把其中的字符串逆向输出
- eclipse 利用已有c++代码建工程,并编译执行
- 第12周项目4 -利用遍历思想求解图问题(1)
- 第十二周--图--项目四利用遍历思想求解图问题(7)
- 第十二周项目四----利用遍历思想求解图问题之输出简单路径
- 第12周项目4 利用遍历思想求解图问题(1--5)
- 利用分治思想,写一个求解从n个元素里选取m个有多少种组合方案的(非递归)高性能算法