用类方法求解一元二次方程

用类方法求解一元二次方程
实现一个Complex类和一个Real类.将Real类定义为Complex类的子类.然后设计一个求解一元二次实系数方程的根的类Root.
class Root
{
public:
const Complex & Solve();
...
};
注意:上面对成员函数Root::Solve的声明只是示意性的.可以根据设计进行变通.

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

class Complex {
public:
Complex(double r = 0, double i = 0) : real_(r), imag_(i) {}

double real() const { return real_;}
double imag() const { return imag_;}

protected:
double real_, imag_;
};

inline Complex operator==(Complex a, Complex b) {
return a.real() == b.real() && a.imag() == b.imag();
}

inline Complex operator!=(Complex a, Complex b) {
return !(a==b);
}

inline Complex operator+(Complex a, Complex b) {
return Complex(a.real() + b.real(), a.imag() + b.imag());
}

inline Complex operator-(Complex a, Complex b) {
return Complex(a.real() - b.real(), a.imag() - b.imag());
}

inline Complex operator*(Complex a, Complex b) {
return Complex(a.real() * b.real() - a.imag() * b.imag(),
a.real() * b.imag() + a.imag() * b.real());
}

inline Complex operator/(Complex a, Complex b) {
if (b == Complex(0.0, 0.0)) {
cerr << "devide by zero" << endl;
exit(1);
}
double d = b.real() * b.real() + b.imag() * b.imag();
return Complex((a.real() * b.real() - a.imag() * b.imag()) / d,
(a.imag() * b.real() + a.real() * b.imag()) / d);
}

inline ostream& operator<<(ostream& out, const Complex& c) {
return out << "(" << c.real() << "+" << c.imag() << "i)";
}

class Real : public Complex {
public:
explicit Real (double r = 0) : Complex(r) {}

friend istream& operator>>(istream& in, Real& r) {
return in >> r.real_;
}
};

inline Real operator+(Real a, Real b) {
return Real(a.real() + b.real());
}

inline Real operator-(Real a, Real b) {
return Real(a.real() - b.real());
}

inline Real operator*(Real a, Real b) {
return Real(a.real() * b.real());
}

inline Real operator-(Real a, Real b) {
if (b.real() == 0.0) {
cerr << "divide by zero" << endl;
exit(1);
}
return Real(a.real() - b.real());
}

inline ostream& operator<<(ostream& out, const Real& r) {
return out << r.real();
}

Complex sqrt(Real r) {
return r.real() < 0.0 ? Complex(0.0, sqrt(r.real())) : Complex(sqrt(r.real()));
}

class Root {
public:
Root(Real a, Real b, Real c) : a_(a), b_(b), c_(c) {}

void Solve();

Complex operator[](int i) const { return result_[i]; }

private:
Real a_, b_, c_;
Complex result_[2];
};

inline ostream& operator<<(ostream& out, const Root& r) {
return out << "[ " << r[0] << ", " << r[1] << " ]";
}

void Root::Solve() {
Complex delta = sqrt(b_ * b_ - 4 * a_ * c_);
result_[0] = (- b_ + delta) / 2;
result_[1] = (- b_ - delta) / 2;
}

int main() {
Real a, b, c;
cin >> a >> b >> c;
Root root(a, b, c);
root.Solve();
cout << root;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

解一元二次方程的方法除了十字相乘法还有什么方法?
方法一:配方法。例:4x²-12x-1=0,系数化为1得:x²-3x-1\/4=0,把常数项移到等号的右边得x²-3x=1\/4,下面配方:等号的两边同时乘以一次项系数一半的平方,这样得出结果x1=½√10+3\/2,x2=-½√10+3\/2。方法二:公式法。例:ax²+bx+c=0,根据...

一元二次方程怎么解?
方法一:因式分解法 因式分解法是通过将一元二次方程化为几个因式的乘积等于零的形式,从而得到方程的解。例如,对于方程x² - 3x + 2 = 0,可以分解为 = 0,从而得到解x = 1和x = 2。这种方法的优点是简单易行,但对于某些复杂的方程可能不太适用。方法二:完全平方公式法 对于一些可...

如何通过求导解决一元二次导数方程?
1.直接求解法:如果a≠0,我们可以直接将原方程改写为f'(x)\/a=x^2+b\/a*x+c\/a,这是一个标准的一元二次方程,我们可以通过求解这个方程来得到f'(x)的解。2.因式分解法:如果a≠0,我们还可以将原方程改写为f'(x)=a[x^2+b\/a*x+c\/a],然后通过因式分解来求解。3.配方法:如果a≠...

解一元二次方程的四种方法
解一元二次方程的四种方法为:直接开平方法、配方法、公式法、因式分解法。形如x²=p或(nx+m)²=p(p≥0)的一元二次方程可采用直接开平方法解一元二次方程。如果方程化成x²=p的形式,那么可得x=±√p。如果方程能化成(nx+m)²=p(p≥0)的形式,那么nx+m=±...

一元二次方程有哪几类求根公式?
一元二次方程有4种解法,即直接开平方法、配方法、公式法、因式分解法。公式法可以解任何一元二次方程。因式分解法,也就是十字相乘法,必须要把所有的项移到等号左边,并且等号左边能够分解因式,使等号右边化为0。配方法比较简单:首先将二次项系数a化为1,然后把常数项移到等号的右边,最后在等号...

用Java语言编写求解一元二次方程的解,方程系数从键盘输入若a为零输出...
1)简介 一元二次方程 ax2+bx+c=0 的a、b、c三个参数由用户自行定义,通过该程序输出该一元二次方程的根。 对于该程序需要在“应声虫”的基础上进行参数的自定义,在定义完成后需要通过求根公式实现结果的输出,其中Math.sqrt()为对括号的内容进行开平方根。 2)任务代码 关于该程序的代码如下:i...

一元二次方程怎么解
解决一元二次方程有多种方法,主要包括分解因式法、公式法、配方法、开方法和均值代换法。首先,分解因式法适用于部分方程,如提公因式法、平方差公式和完全平方公式,以及十字相乘法,如例子中的x^2+2x+1=0和x(x+1)-3(x+1)=0,通过因式分解找到根的解。公式法适用于所有一元二次方程,利用...

求解一元二次方程有4种解法例题 每种方法5个例题(解一元二次方程:简单...
第二种方法是配方法,比较复杂,下面举一个例来说明怎样用配方法来解一元二次方程:X^2+2X-3=0 第一步:先在X^2+2X后加一项常数项,使之能成为一项完全平方式,那么根据题目,我们可以得知应该加一个1这样就变成了(X+1)^2。第二步:原式是X^2+2X-3,而(X+1)^2=X^2+2X+1,两个...

一元二次方程的求根公式是怎么得到的
一般来说,一元二次方程的解法有:(注:以下 ^ 是平方的意思。)一、直接开平方法。如:x^2-4=0 解:x^2=4 x=±2(因为x是4的平方根)∴x1=2,x2=-2 二、配方法。如:x^2-4x+3=0 解:x^2-4x=-3 配方,得(配一次项系数一半的平方)x^2-2*2*x+2^2=-3+2^2(方程两边...

一元二次方程的解法有哪些?
1、开平方法 形如x²=p的一元二次方程可采用直接开平方法解一元二次方程。2、配方法 将一元二次方程配成(x+m)²=n的形式,再利用直接开平方法求解的方法。3、计算机法 在使用计算机解一元二次方程时,和人手工计算类似,大部分情况下也是根据求根公式来求解。

相似回答