经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++ 实现一个复数类的实例代码
来源:jb51  时间:2021/4/19 8:38:32  对本文有异议

要求

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

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

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

  1. -1.1 2.0
  2. +0 -4.5

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

  1. (-1.1+2.0i)
  2. (0-4.5i)

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

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

样例输⼊

  1. -1.1 2.0
  2. 0 -4.5

样例输出

  1. (-1.1+2i) (0-4.5i)
  2. (-1.1-2.5i)
  3. (-1.1+6.5i)
  4. (9+4.95i)
  5. (-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)=(a−c)+(b−d)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)=(ac−bd)+(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)]+[(bc−ad)/(c2+d2)]i

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

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

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

输出内容会是 +12

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

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

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

代码实现

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const double EPISON = 1e-7;
  5. class Complex
  6. {
  7. private:
  8. double real;
  9. double image;
  10. public:
  11. Complex(const Complex& complex) :real{ complex.real }, image{ complex.image } {
  12.  
  13. }
  14. Complex(double Real=0, double Image=0) :real{ Real }, image{ Image } {
  15.  
  16. }
  17. //TODO
  18. Complex operator+(const Complex c) {
  19. return Complex(this->real + c.real, this->image + c.image);
  20. }
  21. Complex operator-(const Complex c) {
  22. return Complex(this->real - c.real, this->image - c.image);
  23. }
  24. Complex operator*(const Complex c) {
  25. double _real = this->real * c.real - this->image * c.image;
  26. double _image = this->image * c.real + this->real * c.image;
  27. return Complex(_real, _image);
  28. }
  29. Complex operator/(const Complex c) {
  30. double _real = (this->real * c.real + this->image * c.image) / (c.real * c.real + c.image * c.image);
  31. double _image = (this->image * c.real - this->real * c.image) / (c.real * c.real + c.image * c.image);
  32. return Complex(_real, _image);
  33. }
  34. friend istream &operator>>(istream &in, Complex &c);
  35. friend ostream &operator<<(ostream &out, const Complex &c);
  36. };
  37.  
  38. //重载>>
  39. istream &operator>>(istream &in, Complex &c) {
  40. in >> c.real >> c.image;
  41. return in;
  42. }
  43.  
  44. //重载<<
  45. ostream &operator<<(ostream &out, const Complex &c) {
  46. out << "(";
  47. //判断实部是否为正数或0
  48. if (c.real >= EPISON || (c.real < EPISON && c.real > -EPISON)) out.unsetf(std::ios::showpos);
  49. out << c.real;
  50. out.setf(std::ios::showpos);
  51. out << c.image;
  52. out << "i)";
  53. return out;
  54. }
  55.  
  56. int main() {
  57. Complex z1, z2;
  58. cin >> z1;
  59. cin >> z2;
  60. cout << z1 << " " << z2 << endl;
  61. cout << z1 + z2 << endl;
  62. cout << z1 - z2 << endl;
  63. cout << z1*z2 << endl;
  64. cout << z1 / z2 << endl;
  65. return 0;
  66. }

到此这篇关于C++ 实现一个复数类的文章就介绍到这了,更多相关C++ 复数类内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号