C++ 实现一个复数类

2024-06-06 18:58
文章标签 c++ 实现 复数

本文主要是介绍C++ 实现一个复数类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求

实现⼀个复数类 ComplexComplex 类包括两个 double 类型的成员 realimage ,分别表示复数的实部和虚部。

Complex 类,重载其流提取、流插⼊运算符,以及加减乘除四则运算运算符。

重载流提取运算符 >> ,使之可以读⼊以下格式的输⼊(两个数值之间使⽤空⽩分隔),将第⼀个数值存为复数的实部,将第⼆个数值存为复数的虚部:

 -1.1 2.0+0 -4.5

重载流插⼊运算符 << ,使之可以将复数输出为如下的格式⸺实部如果是⾮负数,则不输出符号位;输出时要包含半⻆左右⼩括号

(-1.1+2.0i)(0-4.5i)

每次输⼊两个复数,每个复数均包括由空格分隔的两个浮点数,输⼊第⼀个复数后,键⼊回⻋,然后继续输⼊第⼆个复数。

输出两个复数,每个复数占⼀⾏;复数是由⼩括号包围的形如 (a+bi) 的格式。注意不能输出全⻆括号

样例输⼊

-1.1 2.00 -4.5 

样例输出

(-1.1+2i) (0-4.5i)
(-1.1-2.5i)
(-1.1+6.5i)
(9+4.95i)
(-0.444444-0.244444i)

提示

需要注意,复数的四则运算定义如下所示:

  • 加法法则: ( a + b i ) + ( c + d i ) = ( a + c ) + ( b + d ) i (a + bi) + (c + di) = (a + c) + (b + d)i (a+bi)+(c+di)=(a+c)+(b+d)i
  • 减法法则: ( a + b i ) − ( c + d i ) = ( a − c ) + ( b − d ) i (a + bi) − (c + di) = (a − c) + (b − d)i (a+bi)(c+di)=(ac)+(bd)i
  • 乘法法则: ( a + b i ) × ( c + d i ) = ( a c − b d ) + ( b c + a d ) i (a + bi) × (c + di) = (ac − bd) + (bc + ad)i (a+bi)×(c+di)=(acbd)+(bc+ad)i
  • 除法法则: ( a + b i ) ÷ ( c + d i ) = [ ( a c + b d ) / ( c 2 + d 2 ) ] + [ ( b c − a d ) / ( c 2 + d 2 ) ] i (a + bi) ÷ (c + di) = [(ac + bd)/(c^2 + d^2 )] + [(bc − ad)/(c^2 + d^2)]i (a+bi)÷(c+di)=[(ac+bd)/(c2+d2)]+[(bcad)/(c2+d2)]i

两个流操作运算符必须重载为 Complex 类的友元函数

此外,在输出的时候,你需要判断复数的虚部是否⾮负⸺例如输⼊ 3 1.0 ,那么输出应该为 3+1.0i 。这⾥向⼤家提供⼀种可能的处理⽅法:使⽤ ostream 提供的 setf() 函数 ⸺它可以设置数值输出的时候是否携带标志位。例如,对于以下代码:

ostream os;
os.setf(std::ios::showpos);
os << 12;

输出内容会是 +12

⽽如果想要取消前⾯的正号输出的话,你可以再执⾏:

os.unsetf(std::ios::showpos);

即可恢复默认的设置(不输出额外的正号)

代码实现

#include <iostream>
using namespace std;const double EPISON = 1e-7;
class Complex
{
private:double real;double image;
public:Complex(const Complex& complex) :real{ complex.real }, image{ complex.image } {}Complex(double Real=0, double Image=0) :real{ Real }, image{ Image } {}//TODOComplex operator+(const Complex c) {return Complex(this->real + c.real, this->image + c.image);}Complex operator-(const Complex c) {return Complex(this->real - c.real, this->image - c.image);}Complex operator*(const Complex c) {double _real = this->real * c.real - this->image * c.image;double _image = this->image * c.real + this->real * c.image;return Complex(_real, _image);}Complex operator/(const Complex c) {double _real = (this->real * c.real + this->image * c.image) / (c.real * c.real + c.image * c.image);double _image = (this->image * c.real - this->real * c.image) / (c.real * c.real + c.image * c.image);return Complex(_real, _image);}friend istream &operator>>(istream &in, Complex &c);friend ostream &operator<<(ostream &out, const Complex &c);
};//重载>>
istream &operator>>(istream &in, Complex &c) {in >> c.real >> c.image;return in;
}//重载<<
ostream &operator<<(ostream &out, const Complex &c) {out << "(";//判断实部是否为正数或0if (c.real >= EPISON || (c.real < EPISON && c.real > -EPISON)) out.unsetf(std::ios::showpos);out << c.real;out.setf(std::ios::showpos);out << c.image;out << "i)";return out;
}int main() {Complex z1, z2;cin >> z1;cin >> z2;cout << z1 << " " << z2 << endl;cout << z1 + z2 << endl;cout << z1 - z2 << endl;cout << z1*z2 << endl;cout << z1 / z2 << endl;return 0;
}

这篇关于C++ 实现一个复数类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036954

相关文章

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造