• 实验十二 运算符重载


    A.三维坐标点的平移(递增++ 递增--的重载)

    题目描述
    定义一个三维点Point类,利用友元函数重载"++“和”–-"运算符,并区分这两种运算符的前置和后置运算。

    要求如下:
    1.实现Point类;
    2.编写main函数,初始化1个Point对象,将这个对象++或–后赋给另外一个对象,并输出计算后对象的坐标信息。

    输入
    第1行:输入三个int类型的值,分别为一个Point对象p1的x,y,z坐标。

    输出

    原值是最初输入的数值

    第1行是p1后置++后,再输出

    第2行是p1恢复原值,接着p1后置++同时复制给p2,p2输出
    第3、4行是p1恢复原值,p1前置++同时输出,然后p1再输出
    第5、6行是p1恢复原值,p1后置–后,再输出,接着输出一次原值
    第7、8行是p1恢复原值,p1前置–同时输出,然后p1再输出

    输入样例
    10 20 30

    输出样例
    x=11 y=21 z=31
    x=10 y=20 z=30
    x=11 y=21 z=31
    x=11 y=21 z=31
    x=9 y=19 z=29
    x=10 y=20 z=30
    x=9 y=19 z=29
    x=9 y=19 z=29

    1. #include<iostream>
    2. using namespace std;
    3. class point
    4. {
    5. int x,y,z;
    6. public:
    7. point(int xx = 0, int yy = 0, int zz = 0)
    8. {
    9. x = xx; y = yy; z = zz;
    10. }
    11. friend point operator ++(point&p); //全局函数
    12. friend point operator ++(point&p, int);
    13. friend point operator --(point&p);
    14. friend point operator --(point&p, int);
    15. void show()const
    16. {
    17. cout << "x=" << x << " y=" << y << " z=" << z << endl;
    18. }
    19. };
    20. point operator ++(point& p)//对于前增量,我们直接让它++或--完了之后返回就可以了。
    21. {
    22. p.x++; p.y++; p.z++;
    23. return p;
    24. }
    25. point operator ++(point& p, int)//对于后增量,我们应该要创建一个临时变量先存储现值,然后做++或--,返回临时变量的值。
    26. { //int 占位区分
    27. point temp=p;
    28. p.x++; p.y++; p.z++;
    29. return temp;
    30. }
    31. point operator --(point& p)
    32. {
    33. p.x--; p.y--; p.z--;
    34. return p;
    35. }
    36. point operator --(point& p, int)
    37. {
    38. point temp=p;
    39. p.x--; p.y--; p.z--;
    40. return temp;
    41. }
    42. int main()
    43. {
    44. int x, y, z;
    45. cin >> x >> y >> z;
    46. point p1(x, y, z);
    47. point p2;
    48. point p3 = p1;//p1原值 类对象之间的赋值也可以通过赋值运算符“=”进行。
    49. p1++;
    50. p1.show();//p1后置++后,再输出
    51. p1 = p3; //p1恢复原值
    52. p2 = p1++;//p1后置++同时复值给p2
    53. p2.show();//p2输出
    54. p1 = p3; //p1恢复原值
    55. (++p1).show();//p1前置++同时输出
    56. p1.show(); //然后p1再输出
    57. p1 = p3;//p1恢复原值
    58. p1--;
    59. p1.show(); //p1后置–-后,再输出
    60. p1 = p3;
    61. p1.show();// 接着输出一次原值
    62. p1 = p3; //p1恢复原值
    63. (--p1).show();//p1前置–同时输出
    64. p1.show();//然后p1再输出
    65. }

    B. 分数的加减乘除(加减乘除重载 局部函数)

    Fraction类的基本形式如下:

    1. // 定义Fraction类
    2. class Fraction
    3. {
    4. private:
    5. int fz, fm;
    6. int commonDivisor(); // 计算最大公约数
    7. void contracted(); // 分数化简
    8. public:
    9. Fraction(int = 0, int = 1);
    10. Fraction(Fraction&);
    11. Fraction operator+(Fraction);
    12. Fraction operator-(Fraction);
    13. Fraction operator*(Fraction);
    14. Fraction operator/(Fraction);
    15. void set(int = 0, int = 1);
    16. void disply();
    17. };

    要求如下:

    1.实现Fraction类;common_divisor()和contracted()函数体可为空,不实现具体功能。

    2.编写main函数,初始化两个Fraction对象的,计算它们之间的加减乘除。

    输入

    第1行:依次输入第1个和第2个Fraction对象的分子和分母值。

    输出

    每行依次分别输出加减乘除计算后的Fraction对象(直接输出分数值,不需要约简)。

    输入样例1 

    1 3 2 5

    输出样例1

    fraction=11/15
    fraction=-1/15
    fraction=2/15
    fraction=5/6

    1. #include<iostream>
    2. using namespace std;
    3. class Fraction
    4. {
    5. private:
    6. int fz, fm;
    7. int commonDivisor(); // 计算最大公约数
    8. void contracted(); // 分数化简
    9. public:
    10. Fraction(int a = 0, int b = 1) : fz(a), fm(b)
    11. {
    12. };
    13. Fraction(Fraction& f)
    14. {
    15. fz = f.fz;
    16. fm = f.fm;
    17. }
    18. Fraction operator+(Fraction& f) //临时对象存储
    19. {
    20. Fraction temp;
    21. temp.fz = fz * f.fm + fm * f.fz;
    22. temp.fm = fm * f.fm;
    23. return temp;
    24. }
    25. Fraction operator-(Fraction& f)
    26. {
    27. Fraction temp;
    28. temp.fz = fz * f.fm - f.fz * fm;
    29. temp.fm = fm * f.fm;
    30. return temp;
    31. }
    32. Fraction operator*(Fraction& f)
    33. {
    34. Fraction temp;
    35. temp.fz = fz * f.fz;
    36. temp.fm = fm * f.fm;
    37. return temp;
    38. }
    39. Fraction operator/(Fraction& f)
    40. {
    41. Fraction temp;
    42. temp.fz = fz * f.fm;
    43. temp.fm = fm * f.fz;
    44. return temp;
    45. }
    46. void set(int z, int m)
    47. {
    48. fz = z;
    49. fm = m;
    50. }
    51. void disply()
    52. {
    53. cout << "fraction=" << fz << "/" << fm << endl;
    54. }
    55. };
    56. int main()
    57. {
    58. int fz, fm;
    59. cin >> fz >> fm;
    60. Fraction f1(fz, fm);
    61. cin >> fz >> fm;
    62. Fraction f2(fz, fm);
    63. Fraction f3;
    64. f3 = f1 + f2;
    65. f3.disply();
    66. f3 = f1 - f2;
    67. f3.disply();
    68. f3 = f1 * f2;
    69. f3.disply();
    70. f3 = f1 / f2;
    71. f3.disply();
    72. }

    C. 复数的加减乘运算(加减乘 全局函数)

    定义一个复数类,通过重载运算符:+、-、*,实现两个复数之间的各种运算。

    1. class Complex
    2. {
    3. private:
    4. float real, image;
    5. public:
    6. Complex(float x = 0, float y = 0);
    7. friend Complex operator+(Complex&, Complex&);
    8. friend Complex operator-(Complex&, Complex&);
    9. friend Complex operator*(Complex&, Complex&);
    10. void show();
    11. };

    要求如下:

    1.实现Complex类;

    2.编写main函数,初始化两个Complex对象,计算它们之间的加减乘,并输出结果。

    复数相乘的运算规则

    设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.

    输入

    第1行:输入两个数值,分别为第一个Complex对象的实部和虚部。

    第2行:输入两个数值,分别为第二个Complex对象的实部和虚部。

    输出

    第1行:两个Complex对象相加后的输出结果。

    第2行:两个Complex对象相减后的输出结果。

    第3行:两个Complex对象相乘后的输出结果。

    输入样例1

    10 20
    50 40

    输出样例1

    Real=60 Image=60
    Real=-40 Image=-20
    Real=-300 Image=1400

    1. #include<iostream>
    2. using namespace std;
    3. class Complex
    4. {
    5. private:
    6. float real, image;
    7. public:
    8. Complex(float x = 0, float y = 0) : real(x), image(y) {}
    9. friend Complex operator+(Complex&, Complex&);
    10. friend Complex operator-(Complex&, Complex&);
    11. friend Complex operator*(Complex&, Complex&);
    12. void show()
    13. {
    14. cout << "Real=" << real << " Image=" << image << endl;
    15. }
    16. };
    17. Complex operator + (Complex& c1, Complex& c2)
    18. {
    19. Complex t;
    20. t.real = c1.real + c2.real;
    21. t.image = c1.image + c2.image;
    22. return t;
    23. }
    24. Complex operator - (Complex& c1, Complex& c2)
    25. {
    26. Complex t;
    27. t.real = c1.real - c2.real;
    28. t.image = c1.image - c2.image;
    29. return t;
    30. }
    31. Complex operator * (Complex& c1, Complex& c2)
    32. {
    33. Complex t;
    34. t.real = c1.real * c2.real - c1.image * c2.image;
    35. t.image = c1.real * c2.image + c1.image * c2.real;
    36. return t;
    37. }
    38. int main()
    39. {
    40. float real, image;
    41. cin >> real >> image;
    42. Complex c1(real, image);
    43. cin >> real >> image;
    44. Complex c2(real, image);
    45. Complex c3;
    46. c3 = c1 + c2;
    47. c3.show();
    48. c3 = c1 - c2;
    49. c3.show();
    50. c3 = c1 * c2;
    51. c3.show();
    52. }

  • 相关阅读:
    如何用AscendCL的接口开发网络模型推理场景下应用?
    点云从入门到精通技术详解100篇-基于3D点云的曲面文字检测(续)
    编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回整数1,否则返回0
    React-18(组件化开发)--ref与react过渡动画
    解决Visual Studio Code 控制台中文乱码问题
    Programming abstractions in C阅读笔记:p144-p160
    ubuntu20.04安装genymotion3.5.1
    痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设
    风控欺诈坏人太少,没法建模?来试下这个解决目标样本不平衡的方法吧
    chatgpt配合xmind制作思维导图
  • 原文地址:https://blog.csdn.net/fangyuxuan123/article/details/127849829