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

推荐
具体类定义代码和实现如下:
//----------------------------------
//Complex.h
//-----------------------------------
#ifndef HEADER_COMPLEX
#define HEADER_COMPLEX
#include<iostream>
using namespace std;
//-----------------------------------
class Complex{
protected;
  double re, im;
public:
  Complex(double r=0, double v=0):re(r),im(v){}
  friend Complex operator+(const Complex& a, const Complex& b);
  friend ostream& operator<<(ostream& out, const Complex& a);
};//---------------------------------
#endif                 // HEADER_COMPLEX

//-----------------------------------
//Complex.h
//-----------------------------------
#include"Complex.h"
#include<iostream>
using namespace std;
//-----------------------------------
ostream& operator<<(ostream& out, const Complex& a){
  return (a.im ? cout<<a.re<<" + "<<a.im<<"i" : cout<<a.re);
}//----------------------------------
Complex operator+(const Complex& a, const Complex& b){
  return Complex(a.re+b.re, a.im+b.im);
}//----------------------------------
根类的定义暂时不依赖于复数,因为其为实系数一元二次方程。有可能在以后需要返回一个复根,并作根运算,那时会依赖复数。其类定义见下列代码:
//-----------------------------------
//Root.h
//-----------------------------------
#ifndef HEADER_ROOT
#define HEADER_ROOT
#include<iostream>
using namespace std;
//-----------------------------------
class Root{
  double aa,bb,cc;
public:
  Root(double a, double b, double c):aa(a), bb(b), cc(c) {}
  void solve()const;
};//---------------------------------
#endif                // HEADER_ROOT
先将根值存入复数对象中,然后按复数格式予以输出。具体代码如下:
//-----------------------------------
//Root.cpp
//-----------------------------------
#include"Root.h"
#include"Complex.h"
#include<cmath>    // for sqrt()
//-----------------------------------
void Root::solve()const{
  Complex x1(-bb/(2*aa)), x2(x1);
  double delta = bb*bb - 4*aa*cc;
  if(delta){                       // delta为0则不做处理
    bool flag=delta<0;
    if(flag)delta = -delta;
    delta - std::sqrt(delta)/(2*aa);
    if(flag) x1.im = delta, x2.im = -delta;       //复根
    else        x1.re += delta, x2.re -= delta;   //实根
  }
  cout<<"The solution is\n";
  cout<<" x1 = "<<x1<<"\n";
  cout<<" x2 = "<<x2<<"\n";
}//----------------------------------

应用程序代码:
//-----------------------------------
//EX1101.cpp
//解方程
//-----------------------------------
#include"Root.h"
#include<iostream>
using namespace std;
//-----------------------------------
int main() {
  for(double a,b,c; cin>>a>>b>>c; )
    Root(a,b,c).solve();
}//----------------------------------
例如,当输入为下列几组数值时:
1 2 3
3 7 3
其结果为:
The solution is
x1 = -1 + 1.41421i
x2 = -1 + -1.41421i
The solution is
x1 = -0.565741
x2 = -1.76759

发表于 2018-05-07 21:20:46 回复(0)