c++ 求解一元二次方程 全面考虑实根和虚根的情况

题目

求解一元二次方程。
一元二次方程的定义为:
ax2+bx+c=0
(1)如果b2 -4ac>0,方程有两个不同的实根,分别是:
在这里插入图片描述在这里插入图片描述
(2)如果b2 -4ac< 0,方程没有实根,但有虚根;
(3)如果b2 -4ac= 0,方程有一个实根。
请你编写一个程序,使其能求出多个二次方程的根。该程序要询问用户是否想继续解下一个方程。用户输入1来继续,输入其它数字,则终止程序。程序要求用户输入a,b和c,然后根据前面的条件计算,并输出答案。
要求:使用类实现,
(1)a,b,c为该类的私有成员变量;
(2)求根的实现为该类的成员函数,形式为:

//函数返回值:实根的个数;
//参数:x- 用以返回实根值的数组;
long CalResult(float x[]);

(3)该类还包含有参构造函数、析构函数。
(4)使用MFC工程实现,可酌情加分。

问题描述

题中要求我们编写一个程序,使其能求出多个二次方程的根,并要询问用户是否想继续解下一个方程,用户输入1来继续,输入其它数字,则终止程序。该程序还要求用户分别输入一元二次方程各项的系数a,b和c,然后经过计算,输出答案。

问题分析

对于本题,除了要从数学角度来解一元二次方程,还要用计算机语言表示出来。所以我们应定义一个求解类FindRoot,并使一元二次方程各项系数a,b,c为该类的私有成员变量,按照题中要求,求根的实现为该类的成员函数,其形式为long CalResult(float x[]),而询问客户是否继续计算一元二次方程则放在主函数部分。
但是在编写函数的过程中要注意两点:
1.当a = 0时的情况要考虑进去。
2.当Δ<0时,方程虽然没有实根,但又虚根,题目中没有要求说只求实根的个数,所以,当方程没有实根的情况下还要另外计算虚根的值。

设计思想

本题要求我们求解一元二次方程的解,在一元二次方程求解的过程中,需要考虑三种情况,即判别式Δ=b2 -4ac的大小问题。
(1)当Δ>0时,方程有两个不相等的实根
在这里插入图片描述在这里插入图片描述
(2)当Δ=0时,方程有两个相等的实根x1=x2=(-b)/(2a),即一个实根;
(3)当Δ<0时,方程没有实根,但有虚根,虚根为(-b / 2 * a)±((sqrt(-m)) / 2 * a)
以上是我们解数学题的思路,可是如果我们用C++来解决一元二次方程组求解的问题该怎么处理呢?
首先要建立一个求解FindRoot类,并声明a,b,c三个float类型的数据成员。在类中我们构造了一个用于实现求根的成员函数,其形式为long CalResult(float x[]),在该函数中用数组x来储存该方程的根,按要求定义一个n表示根的个数,然后需要我们判断判别式的大小,当判别式大于0时则n=2,当判别式==0时则n=1,当判别式小于0时则n=0,最后返回n的值。
在主函数中要实现方程的循环计算,计算机要询问客户是否继续计算,当客户输入“1”时才可继续方程的计算,所以我运用了do-while语句来判断是否继续方程的计算,除此之外要考虑的如果客户输入的a的值如果为0的话,方程不是一元二次方程,则利用if语句判断a是否为0,如果a为0,则跳出循环,程序结束。

设计表示

c++ 求解一元二次方程 全面考虑实根和虚根的情况_第1张图片
c++ 求解一元二次方程 全面考虑实根和虚根的情况_第2张图片

源代码

#include "stdafx.h"
#include 
#include 
using namespace std;

class FindRoot{
     
public:
	FindRoot(float aa = 0, float bb = 0, float cc = 0){
     
		a = aa;
		b = bb;
		c = cc;
	}
	~FindRoot(){
     }
	FindRoot(FindRoot&F);
	long CalResult(float x[]);
private:
	float a, b, c;                          //a,b,c为该类的私有成员变量
};

FindRoot::FindRoot(FindRoot&F){
     
	a = F.a;
	b = F.b;
	c = F.c;
}

long FindRoot::CalResult(float x[]){
                             //参数x- 用以返回实根值的数组

	long n;
	float m = (b*b - 4 * a*c);
	int q, p;

	if (m > 0)
	{
     
		n = 2;
		x[0] = (-b + sqrt(m)) / 2 * a;
		x[1] = (-b - sqrt(m)) / 2 * a;
		cout << "该方程有两个不同的实根,分别是:" << x[0] << " " << x[1] << endl;
		
	}
	else if (m < 0)
	{
     
		n = 0;
		q = -b / 2 * a;                       //q为虚根的实部
		p = (sqrt(-m)) / 2 * a;               //p为虚根的虚部

		cout << "方程没有实根,但有虚根。" << endl;
		cout << "虚根x1为:" << q << "+" << p << "i" << endl;
		cout << "虚根x2为:" << q << "-" << p << "i" << endl;
		
	}
	else
	{
     
		n = 1;
		x[0] = (-b) / 2 * a;

		cout << "方程有一个实根,该根为:" << x[0] << endl;
	}

	return n;                         //函数返回值为实根的个数
}
int _tmain(int argc, _TCHAR* argv[])
{
     
	float a, b, c;
	float x[2];
	int m;

	do{
     
		cout << "请分别输入一元二次方程的三个系数a,b,c" << endl;
		cin >> a >> b >> c;

		if (a == 0){
                 //当a = 0时,方程没有二次项,即不是一元二次方程,则跳出循环,程序终止
			cout << "输入不规范。"<<endl;
			break;
		}

		FindRoot number(a, b, c);

		number.CalResult(x);

		cout << endl;
		cout << "是否想解一元二次方程?请输入“1”继续" << endl;
		cin >> m;
		cout << endl;


	} while (m == 1);                          //能求出多个二次方程的根,输入1继续,否则终止程序

	cout << "计算结束,程序终止。" << endl;

	return 0;
}

测试数据及运行结果

c++ 求解一元二次方程 全面考虑实根和虚根的情况_第3张图片
c++ 求解一元二次方程 全面考虑实根和虚根的情况_第4张图片

你可能感兴趣的:(c++,c++,类)