C++项目练手:复数类的功能实现

C++项目练手:复数类的功能实现

复数的相关功能

相关功能:

  1. 建立复数类,初始化复数
  2. 用户输入复数信息
  3. 复数信息的输出
  4. 求复数的绝对值
  5. 实现复数的加,减,乘,除,乘方等运算

注:界面友好(良好的人机交互),程序加必要的注释

复数类的定义:

#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;
}

程序运行框案例如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值