/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。
* 作 者:
* 完成日期: 2012 年 04 月 09 日
* 版 本 号: V1.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:
* 程序头部的注释结束
*/
方案一:用类的成员函数完成运算符的重载:
- #include <iostream>
- using namespace std;
- class Complex
- {
- public:
- Complex(){real=0;imag=0;}
- Complex(double r,double i){real=r;imag=i;}
- Complex operator+(Complex &c2);
- Complex operator-(Complex &c2);
- Complex operator*(Complex &c2);
- Complex operator/(Complex &c2);
- void display();
- private:
- double real;
- double imag;
- };
- //下面定义成员函数
- Complex Complex::operator+(Complex &c2)
- {
- Complex c;
- c.real=real+c2.real;
- c.imag=imag+c2.imag;
- return c;
- }
- Complex Complex::operator-(Complex &c2)
- {
- Complex c;
- c.real=real-c2.real;
- c.imag=imag-c2.imag;
- return c;
- }
- Complex Complex::operator*(Complex &c2)
- {
- Complex c;
- c.real=real*c2.real-imag*c2.imag;
- c.imag=imag*c2.real+real*c2.imag;
- return c;
- }
- Complex Complex::operator/(Complex &c2)
- {
- Complex c;
- c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
- c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
- return c;
- }
- void Complex::display()
- {
- cout<<"("<<real<<","<<imag<<"i)"<<endl;
- }
- int main()
- {
- Complex c1(3,4),c2(5,-10),c3;
- cout<<"c1=";
- c1.display();
- cout<<"c2=";
- c2.display();
- c3=c1+c2;
- cout<<"c1+c2=";
- c3.display();
- c3=c1-c2;
- cout<<"c1-c2=";
- c3.display();
- c3=c1*c2;
- cout<<"c1*c2=";
- c3.display();
- c3=c1/c2;
- cout<<"c1/c2=";
- c3.display();
- system("pause");
- return 0;
- }
方案二:请用类的友元函数,而不是成员函数,完成上面提及的运算符的重载:
- 01.#include<iostream>
- 02.using namespace std;
- 03.class Complex
- 04.{
- 05.public:
- 06. Complex(){real=0;imag=0;}
- 07. Complex(double r,double i){real=r;imag=i;}
- 08. friend Complex operator+(Complex &c1,Complex &c2);
- 09. friend Complex operator-(Complex &c1,Complex &c2);
- 10. friend Complex operator*(Complex &c1,Complex &c2);
- 11. friend Complex operator/(Complex &c1,Complex &c2);
- 12. friend void display(Complex &c2);
- 13.private:
- 14. double real;
- 15. double imag;
- 16.};
- 17.//下面定义友元函数
- 18.
- 19.//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.
- 20.Complex operator+(Complex &c1,Complex &c2)
- 21.{
- 22. Complex c;
- 23. c.real=c1.real+c2.real;
- 24. c.imag=c1.imag+c2.imag;
- 25. return c;
- 26.}
- 27.
- 28.
- 29.//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
- 30.Complex operator-(Complex &c1,Complex &c2)
- 31.{
- 32. Complex c;
- 33. c.real=c1.real-c2.real;
- 34. c.imag=c1.imag-c2.imag;
- 35. return c;
- 36.}
- 37.
- 38.//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
- 39.
- 40.Complex operator*(Complex &c1,Complex &c2)
- 41.{
- 42. Complex c;
- 43. c.real=c1.real*c2.real-c1.imag*c2.imag;
- 44. c.imag=c1.imag*c2.real+c1.real*c2.imag;
- 45. return c;
- 46.}
- 47.
- 48.//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i
- 49.Complex operator/(Complex &c1,Complex &c2)
- 50.{
- 51. Complex c;
- 52. double d=c2.real*c2.real+c2.imag*c2.imag;
- 53. c.real=(c1.real*c2.real+c1.imag*c2.imag)/d; //此处有危险未排除:除法溢出
- 54. c.imag=(c1.imag*c2.real-c1.real*c2.imag)/d;
- 55. return c;
- 56.}
- 57.
- 58.void display(Complex &c2)
- 59.{
- 60. cout<<"("<<c2.real<<","<<c2.imag<<"i)"<<endl;
- 61.}
- 62.
- 63.int main()
- 64.{
- 65. Complex c1(3,4),c2(5,-10),c3;
- 66. cout<<"c1=";
- 67. display(c1);
- 68. cout<<"c2=";
- 69. display(c2);
- 70. c3=c1+c2;
- 71. cout<<"c1+c2=";
- 72. display(c3);
- 73. c3=c1-c2;
- 74. cout<<"c1-c2=";
- 75. display(c3);
- 76. c3=c1*c2;
- 77. cout<<"c1*c2=";
- 78. display(c3);
- 79. c3=c1/c2;
- 80. cout<<"c1/c2=";
- 81. display(c3);
- 82. system("pause");
- 83. return 0;
- 84.}
- #include<iostream>
- using namespace std;
- class Complex
- {
- public:
- Complex(){real=0;imag=0;}
- Complex(double r,double i){real=r;imag=i;}
- friend Complex operator+(Complex &c1,Complex &c2);
- friend Complex operator-(Complex &c1,Complex &c2);
- friend Complex operator*(Complex &c1,Complex &c2);
- friend Complex operator/(Complex &c1,Complex &c2);
- friend void display(Complex &c2);
- private:
- double real;
- double imag;
- };
- //下面定义友元函数
- //复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.
- Complex operator+(Complex &c1,Complex &c2)
- {
- Complex c;
- c.real=c1.real+c2.real;
- c.imag=c1.imag+c2.imag;
- return c;
- }
- //复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
- Complex operator-(Complex &c1,Complex &c2)
- {
- Complex c;
- c.real=c1.real-c2.real;
- c.imag=c1.imag-c2.imag;
- return c;
- }
- //复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
- Complex operator*(Complex &c1,Complex &c2)
- {
- Complex c;
- c.real=c1.real*c2.real-c1.imag*c2.imag;
- c.imag=c1.imag*c2.real+c1.real*c2.imag;
- return c;
- }
- //复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i
- Complex operator/(Complex &c1,Complex &c2)
- {
- Complex c;
- double d=c2.real*c2.real+c2.imag*c2.imag;
- c.real=(c1.real*c2.real+c1.imag*c2.imag)/d; //此处有危险未排除:除法溢出
- c.imag=(c1.imag*c2.real-c1.real*c2.imag)/d;
- return c;
- }
- void display(Complex &c2)
- {
- cout<<"("<<c2.real<<","<<c2.imag<<"i)"<<endl;
- }
- int main()
- {
- Complex c1(3,4),c2(5,-10),c3;
- cout<<"c1=";
- display(c1);
- cout<<"c2=";
- display(c2);
- c3=c1+c2;
- cout<<"c1+c2=";
- display(c3);
- c3=c1-c2;
- cout<<"c1-c2=";
- display(c3);
- c3=c1*c2;
- cout<<"c1*c2=";
- display(c3);
- c3=c1/c2;
- cout<<"c1/c2=";
- display(c3);
- system("pause");
- return 0;
- }
- 运行结果:
方案三:在方案二的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c?d和d?c的结果为将d视为实部为d的复数同c运算的结果(其中?为+、-、*、/之一)。另外,定义一目运算符-,-c相当于0-c。
- 01.#include<iostream>
- 02.using namespace std;
- 03.class Complex
- 04.{
- 05.public:
- 06. Complex(){real=0;imag=0;}
- 07. Complex(double r,double i){real=r;imag=i;}
- 08. friend Complex operator+(Complex &c1,Complex &c2);
- 09. friend Complex operator-(Complex &c1,Complex &c2);
- 10. friend Complex operator-(Complex &c2);
- 11. friend Complex operator*(Complex &c1,Complex &c2);
- 12. friend Complex operator/(Complex &c1,Complex &c2);
- 13. friend Complex operator+(Complex &c1,const double &d);
- 14. friend Complex operator+(const double &d, Complex &c);
- 15. friend void display(Complex &c2);
- 16.private:
- 17. double real;
- 18. double imag;
- 19.};
- 20.//下面定义友元函数
- 21.
- 22.//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.
- 23.Complex operator+(Complex &c1,Complex &c2)
- 24.{
- 25. Complex c;
- 26. c.real=c1.real+c2.real;
- 27. c.imag=c1.imag+c2.imag;
- 28. return c;
- 29.}
- 30.Complex operator+(Complex &c1,const double &d)
- 31.{
- 32. return Complex(c1.real+d, c1.imag);
- 33.}
- 34.Complex operator+(const double &d, Complex &c1)
- 35.{
- 36. return Complex(c1.real+d, c1.imag);
- 37.}
- 38.
- 39.//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
- 40.Complex operator-(Complex &c1,Complex &c2)
- 41.{
- 42. Complex c;
- 43. c.real=c1.real-c2.real;
- 44. c.imag=c1.imag-c2.imag;
- 45. return c;
- 46.}
- 47.Complex operator-(Complex &c2)
- 48.{
- 49. return Complex(-c2.real, -c2.imag);
- 50.
- 51.}
- 52.//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
- 53.
- 54.Complex operator*(Complex &c1,Complex &c2)
- 55.{
- 56. Complex c;
- 57. c.real=c1.real*c2.real-c1.imag*c2.imag;
- 58. c.imag=c1.imag*c2.real+c1.real*c2.imag;
- 59. return c;
- 60.}
- 61.
- 62.//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i
- 63.Complex operator/(Complex &c1,Complex &c2)
- 64.{
- 65. Complex c;
- 66. double d=c2.real*c2.real+c2.imag*c2.imag;
- 67. c.real=(c1.real*c2.real+c1.imag*c2.imag)/d; //此处有危险未排除:除法溢出
- 68. c.imag=(c1.imag*c2.real-c1.real*c2.imag)/d;
- 69. return c;
- 70.}
- 71.
- 72.void display(Complex &c2)
- 73.{
- 74. cout<<"("<<c2.real<<","<<c2.imag<<"i)"<<endl;
- 75.}
- 76.
- 77.int main()
- 78.{
- 79. Complex c1(3,4),c2(5,-10),c3,c4;
- 80. cout<<"c1=";
- 81. display(c1);
- 82. cout<<"c2=";
- 83. display(c2);
- 84. c3=c1+c2;
- 85. cout<<"c1+c2=";
- 86. display(c3);
- 87. c3=c1-c2;
- 88. cout<<"c1-c2=";
- 89. display(c3);
- 90. c3=c1*c2;
- 91. cout<<"c1*c2=";
- 92. display(c3);
- 93. c3=c1/c2;
- 94. cout<<"c1/c2=";
- 95. display(c3);
- 96. c4=c1+3.14;
- 97. cout<<"c1+3.14=";
- 98. display(c4);
- 99. c4=3.14+c1;
- 100. cout<<"3.14+c1=";
- 101. display(c4);
- 102. c4=-c1;
- 103. cout<<"-c1=";
- 104. display(c4);
- 105. system("pause");
- 106. return 0;
- 107.}
有点长,但不是很难,步骤大体一样,Cope就行