C++项目练手:复数类的功能实现
复数的相关功能
相关功能:
- 建立复数类,初始化复数
- 用户输入复数信息
- 复数信息的输出
- 求复数的绝对值
- 实现复数的加,减,乘,除,乘方等运算
注:界面友好(良好的人机交互),程序加必要的注释
复数类的定义:
#ifndef _COMPLEX_
#define _COMPLEX_
#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
using namespace std;
class complex {
private:
double re, im; //定义实部,虚部
public:
complex(double r = 0, double i = 0) :re(r), im(i) { } //通过初值列建立Complex类的构造函数
complex(const complex& x); //拷贝构造函数
void Input(double, double); //通过成员函数Input(),重新定义复数实部和虚部
complex& operator += (const complex&); //重载+=运算符,设计为成员函数
complex& operator -= (const complex&); //重载-=运算符,设计为成员函数
complex& operator *= (const complex&); //重载*=运算符,设计为成员函数
complex& operator /= (const complex&); //重载/=运算符,设计为成员函数
inline double real() const { return re; } //通过成员函数real()返回复数的实部,定义const表示不可进行修改
inline double imag() const { return im; } //通过成员函数imag()返回复数的虚部,定义const表示不可进行修改
double abs() const { return sqrt(re * re + im * im); } //通过成员函数abs()返回复数的绝对值,定义const表示返回数据不可进行修改
complex power(int) ; //通过成员函数power()返回复数的乘方
};
ostream& operator << (ostream& outs, const complex& x);
#endif
在类外对运算符进行重载,使其实现复数的加,减,乘,除运算:
inline complex operator + (const complex& a, const complex& b) { //重载运算符+,复数+复数的情况
return complex(a.real() + b.real(), a.imag() + b.imag()); //返回临时创建的对象,该语句后释放掉该临时对象
}
inline complex operator + (const complex& x, double y) { //重载运算符+,复数+实数的情况
return complex(x.real() + y, x.imag());
}
inline complex operator + (double x, const complex& y) { //重载运算符+,实数+复数的情况
return complex(y.real() + x, y.imag());
}
inline complex operator - (const complex& a, const complex& b) { //重载运算符-,复数-复数的情况
return complex(a.real() - b.real(), a.imag() - b.imag());
}
inline complex operator - (const complex& x, double y) { //重载运算符-,复数-实数的情况
return complex(x.real() - y, x.imag());
}
inline complex operator - (double x, const complex& y) { //重载运算符-,实数-复数的情况
return complex(y.real() - x, y.imag());
}
inline complex operator * (const complex& a, const complex& b) { //重载运算符*,复数*复数的情况
return complex(a.real() * b.real() - a.imag() * b.imag(),a.real()*b.imag()+a.imag()*b.real());
}
inline complex operator * (const complex& x,double y) { //重载运算符*,复数*实数的情况
return complex(x.real() * y, x.imag() * y);
}
inline complex operator * (double x, const complex& y) { //重载运算符*,实数*复数的情况
return complex(x * y.real(), x * y.imag());
}
inline complex operator / (const complex& a, const complex& b) { //重载运算符/,复数/复数的情况
double t = 1 / (b.real() * b.real() + b.imag() * b.imag());
return complex((a.real() * b.real() + a.imag() * b.imag()) * t, (b.real() * a.imag() - a.real() * b.imag()) * t);
}
inline complex operator / (const complex& x, double y) { //重载运算符/,复数/实数的情况
return complex(x.real() / y, x.imag() / y);
}
inline complex operator / (double x, const complex& y) { //重载运算符/,实数/复数的情况
double t = 1 / (y.real() * y.real() + y.imag() * y.imag());
return complex((x * y.real()) * t, (x * (-y.imag())) * t);
}
重载输出流运算符,使其能够输出复数,并加上简单的逻辑判断,当虚部为0时,取消输出虚部
ostream& operator << (ostream& outs, const complex& x) { //重载输出流运算符,输出复数
if (x.imag() > 0)
return outs << x.real() << "+" << x.imag() << "i";
else if (x.imag() < 0)
return outs << x.real() << x.imag() << "i";
else
return outs << x.real();
}
将类内成员函数进行类外的定义:
void complex::Input(double x, double y) {
this->re = x;
this->im = y;
}
complex::complex(const complex& x) { //拷贝构造函数
this->re = x.re;
this->im = x.im;
}
complex& complex::operator += (const complex& x) { //重载+=运算符,设计为成员函数
this->re += x.re;
this->im += x.im;
return *this;
}
complex& complex::operator -= (const complex& x) { //重载-=运算符,设计为成员函数
this->re -= x.re;
this->im -= x.im;
return *this;
}
complex& complex::operator *= (const complex& x) { //重载*=运算符,设计为成员函数
this->re = this->re * x.re - this->im * x.im;
this->im = this->re * x.im + this->im * x.re;
return *this;
}
complex& complex::operator /= (const complex& x) { //重载/=运算符,设计为成员函数
double t = 1 / (x.re * x.re + x.im * x.im);
this->re = (this->re * x.re + this->im * x.im) * t;
this->im = (x.re * this->im - this->re * x.im) * t;
return *this;
}
complex complex::power(int n) { //通过成员函数power()返回复数的乘方
complex temp(this->re, this->im);
for (int i = 1; i < n; i++) {
temp.re = temp.real() * temp.real() - temp.imag() * temp.imag();
temp.im = temp.real() * temp.imag() + temp.imag() * temp.real();
}
return temp;
}
再设计一个屏幕输出ScreenOutput.h文件,将复数类的相关屏幕输出写在一个.h文件里,降低代码复杂性
#ifndef _SCREENOUTPUT_
#define _SCREENOUTPUT_
#include"Complex.h"
#include<iostream>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<Windows.h>
using namespace std;
complex A, B;
void Begin() {
double a, b, c, d;
cout << "请依次输入复数A的实部和虚部:";
cin >> a >> b;
A.Input(a, b);
cout << "请依次输入复数B的实部和虚部:";
cin >> c >> d;
B.Input(c, d);
system("cls");
}
void case2_output() {
double n;
int judge=0;
int ch = 0;
system("cls");
cout << "------复数的基本运算------" << endl;
cout << "1.复数的加法运算" << endl;
cout << "2.复数的减法运算" << endl;
cout << "3.复数的除法运算" << endl;
cout << "4.复数的乘法运算" << endl;
cout << "5.复数的乘方运算" << endl;
cout << "6.退出操作" << endl;
cin >> judge;
switch (judge)
{
case 1: //复数的加法运算
system("cls");
cout << "------复数的加法运算------" << endl;
cout << "请选择如下功能:" << endl;
cout << "1.复数A+复数B" << endl;
cout << "2.复数A+实数(或实数+复数A)" << endl;
cout << "3.复数B+实数(或实数+复数B)" << endl;
cout << "4.退出加法运算" << endl;
cin >> ch;
switch (ch) {
case 1:
cout << "复数A:" << A << endl << "复数B:" << B << endl;
cout << "A + B = " << A + B << endl;
system("pause");
break;
case 2:
cout << "请输入实数n:";
cin >> n;
cout << "A = " << A << endl;
cout << "A + "<<n<<" = " << A + n << endl;
cout << n << " + A = " << n + A << endl;
system("pause");
break;
case 3:
cout << "请输入实数n:";
cin >> n;
cout << "B = " << B << endl;
cout << "B + " << n << " = " << B + n << endl;
cout << n << " + B = " << n + B << endl;
system("pause");
break;
case 4:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
break;
case 2: //复数的减法运算
system("cls");
cout << "------复数的减法运算------" << endl;
cout << "请选择如下功能:" << endl;
cout << "1.复数A-复数B" << endl;
cout << "2.复数A-实数(或实数-复数A)" << endl;
cout << "3.复数B-实数(或实数-复数B)" << endl;
cout << "4.退出减法运算" << endl;
cin >> ch;
switch (ch) {
case 1:
cout << "复数A:" << A << endl << "复数B:" << B << endl;
cout << "A - B = " << A - B << endl;
system("pause");
break;
case 2:
cout << "请输入实数n:";
cin >> n;
cout << "A = " << A << endl;
cout << "A - " << n << " = " << A - n << endl;
cout << n << " - A = " << n - A << endl;
system("pause");
break;
case 3:
cout << "请输入实数n:";
cin >> n;
cout << "B = " << B << endl;
cout << "B - " << n << " = " << B - n << endl;
cout << n << " - B = " << n - B << endl;
system("pause");
break;
case 4:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
break;
case 3: //复数的除法运算
system("cls");
cout << "------复数的除法运算------" << endl;
cout << "请选择如下功能:" << endl;
cout << "1.复数A/复数B" << endl;
cout << "2.复数B/复数A" << endl;
cout << "3.复数A/实数" << endl;
cout << "4.实数/复数A" << endl;
cout << "5.复数B/实数" << endl;
cout << "6.实数/复数B" << endl;
cout << "7.退出除法运算" << endl;
cin >> ch;
switch (ch) {
case 1:
cout << "复数A:" << A << endl << "复数B:" << B << endl;
cout << "A / B = " << A / B << endl;
system("pause");
break;
case 2:
cout << "复数A:" << A << endl << "复数B:" << B << endl;
cout << "B / A = " << B / A << endl;
system("pause");
break;
case 3:
cout << "请输入实数n:";
cin >> n;
cout << "复数A:" << A << endl;
cout << "A / " << n << " = " << A / n << endl;
system("puase");
break;
case 4:
cout << "请输入实数n:";
cin >> n;
cout << "复数A:" << A << endl;
cout << n << " / A = " << n / A << endl;
system("pause");
break;
case 5:
cout << "请输入实数n:";
cin >> n;
cout << "复数B:" << B << endl;
cout << "B / " << n << " = " << B / n << endl;
system("puase");
break;
case 6:
cout << "请输入实数n:";
cin >> n;
cout << "复数B:" << B << endl;
cout << n << " / B = " << n / B << endl;
system("pause");
break;
case 7:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
break;
case 4: //复数的乘法运算
system("cls");
cout << "------复数的乘法运算------" << endl;
cout << "请选择如下功能:" << endl;
cout << "1.复数A*复数B" << endl;
cout << "2.复数A*实数" << endl;
cout << "3.复数B*实数" << endl;
cout << "4.退出乘法运算" << endl;
cin >> ch;
switch (ch) {
case 1:
cout << "复数A:" << A << endl << "复数B:" << B << endl;
cout << "A * B = " << A * B << endl;
system("pause");
break;
case 2:
cout << "请输入实数n:";
cin >> n;
cout << "复数A:" << A << endl;
cout << n << " * A = " << n * A << endl;
cout << "A * " << n << " = " << A * n << endl;
system("pause");
break;
case 3:
cout << "请输入实数n:";
cin >> n;
cout << "复数B:" << B << endl;
cout << n << " * B = " << n * B << endl;
cout << "B * " << n << " = " << B * n << endl;
system("pause");
break;
case 4:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
break;
case 5: //复数的乘方操作
system("cls");
cout << "------复数的乘方运算------" << endl;
cout << "1.复数A的乘方" << endl;
cout << "2.复数B的乘方" << endl;
cout << "3.退出乘方操作" << endl;
cin >> ch;
switch (ch) {
case 1:
cout << "请输入实数n:";
cin >> n;
cout << "复数A:" << A << endl;
cout << "A~" << n << " = " << A.power(n) << endl;
system("pause");
break;
case 2:
cout << "请输入实数n:";
cin >> n;
cout << "复数B:" << B << endl;
cout << "B~" << n << " = " << B.power(n) << endl;
system("pause");
break;
case 3:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
break;
case 6:
break;
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
}
void display() {
Begin();
while (true) {
system("cls");
cout << "-----复数基本运算系统-----" << endl;
cout << "基本功能:" << endl;
cout << "1.查看复数" << endl;
cout << "2.复数的基本运算" << endl;
cout << "3.复数的绝对值" << endl;
cout << "4.退出系统" << endl;
int choose;
cin >> choose;
string ans1,ans3;
switch (choose) {
case 1: //查看复数功能
case1_begin:
system("cls");
cout << "输入选择查看的复数(A或B):";
cin >> ans1;
if (ans1 == "A") {
cout << A << endl;
system("pause");
}
else if (ans1 == "B") {
cout << B << endl;
system("pause");
}
else {
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
goto case1_begin;
}
break;
case 2:
case2_output();
break;
case 3:
case3_begin:
system("cls");
cout << "输入选择查看复数(A或B)的绝对值:" << endl;
cin >> ans3;
if (ans3 == "A") {
cout << "复数A:" << A << endl;
cout << "复数A的绝对值:" << A.abs() << endl;
system("pause");
}
else if (ans3 == "B") {
cout << "复数B:" << B << endl;
cout << "复数B的绝对值:" << B.abs() << endl;
system("pause");
}
else {
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
goto case3_begin;
}
break;
case 4:
system("cls");
exit(0);
default:
cout << "错误输入,按任意键重新返回" << endl;
system("pause");
break;
}
}
}
#endif
源代码:
#include"Complex.h"
#include"ScreenOutput.h"
#include<iostream>
#include<string>
#include<iomanip>
#include<cstdlib>
using namespace std;
int main()
{
display();
return 0;
}
程序运行框案例如下: