• 实验十三 运算符重载2



    A. 时钟调整(运算符前后增量)

    假定一个时钟包含时、分、秒三个属性,取值范围分别为0~11,0~59,0~59,具体要求如下:

    1、用一元运算符++,并且是前增量的方法,实现时钟的调快操作。例如要把时钟调快5秒,则执行5次”  ++<对象> “ 的操作

    2、用一元运算符--,并且是后增量的方法,实现时钟的调慢操作。例如要把时钟调慢10秒,则执行10次” <对象>-- “的操作

    3、用构造函数的方法实现时钟对象的初始化,用输出函数实现时钟信息的输出

    clock和time是系统内部函数,所以不要用来做类名或者其他

    输入

    第一行输入时钟的当前时间时、分、秒

    第二行输入t表示有t个示例

    第三行输入t个整数x,如果x为正整数,则表示执行调快操作,使用重载运算符++;如果x为负整数,则表示执行调慢操作,使用重载运算符--

    每次的调快或调慢操作都是承接上一次调整后的结果进行,例如先调快10秒,再调慢2秒,那么调慢2秒是接着调快10秒后的结果进行的

    输出

    每行输出每个时钟调整操作后的时分秒

    输入样例1 

    11 58 46
    4
    5 70 -22 -55
    输出样例1

    11:58:51
    0:0:1
    11:59:39
    11:58:44

    1. #include <iostream>
    2. using namespace std;
    3. class shizhong
    4. {
    5. private:
    6. int hour, minute, second;
    7. public:
    8. shizhong(int h, int m, int s) :hour(h), minute(m), second(s)
    9. {
    10. }
    11. friend shizhong operator++(shizhong& s);
    12. friend shizhong operator--(shizhong& s,int);
    13. void print()
    14. {
    15. cout << hour << ":" << minute << ":" << second << endl;
    16. }
    17. };
    18. shizhong operator++(shizhong& s)
    19. {
    20. s.second++;
    21. if (s.second == 60)
    22. {
    23. s.second = 0;
    24. s.minute++;
    25. if (s.minute == 60)
    26. {
    27. s.minute = 0;
    28. s.hour++;
    29. if (s.hour == 12)
    30. {
    31. s.hour = 0;
    32. }
    33. }
    34. }
    35. return s;
    36. }
    37. shizhong operator--(shizhong&a,int)
    38. {
    39. shizhong temp = a;
    40. if (a.second == 0)
    41. {
    42. a.second = 59;
    43. a.minute--;
    44. if (a.minute == -1)
    45. {
    46. a.minute = 59;
    47. a.hour--;
    48. if (a.hour == -1)
    49. {
    50. a.hour = 11;
    51. }
    52. }
    53. }
    54. else
    55. {
    56. a.second--;
    57. }
    58. return temp;
    59. }
    60. int main()
    61. {
    62. int hour, minute, second, x;
    63. int t;
    64. cin >> hour >> minute >> second;
    65. cin >> t;
    66. shizhong s(hour, minute, second);
    67. while (t--)
    68. {
    69. while (cin >> x)
    70. {
    71. if (x > 0)
    72. {
    73. for (int i = 0; i < x; i++)
    74. {
    75. ++s;
    76. }
    77. }
    78. if(x<0)
    79. {
    80. for (int i = 0; i > x; i--)
    81. {
    82. s--;
    83. }
    84. }
    85. s.print();
    86. }
    87. }
    88. }

    B. 矩阵(运算符重载)

    下面主函数和CMatrix类完成矩阵的输入、输出。请补齐CMatrix类中需要的成员函数。

    注意:主函数和CMatrix类已给代码不可修改,只可在CMatrix类中添加新的成员函数,并补充完整未实现的成员函数。修改已知代码不计分。

    提示:根据已给代码分析CMatrix需要重载哪些运算符?

    输入

     测试次数

    每组测试数据格式如下:

    正整数n、m,分表表示矩阵的行、列

    n*m行整数数据

    输出

    每组测试数据输出矩阵数据两次,具体输出格式见样例。

    输入样例1 

    2
    3 3
    1 2 3
    4 5 6
    7 8 9
    2 4
    10 20 30 40
    50 60 70 80
    输出样例1

    matrixA:
    1 2 3 
    4 5 6 
    7 8 9 
    matrixB:
    1 2 3 
    4 5 6 
    7 8 9 
    matrixA:
    10 20 30 40 
    50 60 70 80 
    matrixB:
    10 20 30 40 
    50 60 70 80 
     

    1. #include <iostream>
    2. using namespace std;
    3. // 定义矩阵类
    4. class CMatrix
    5. {
    6. private:
    7. int n, m; // n-行,m-列
    8. int** data; // 存储矩阵数据
    9. public:
    10. CMatrix()
    11. {
    12. n = 0; //防止运行时异常
    13. m = 0;
    14. data = NULL;
    15. }
    16. CMatrix(int n1, int m1)
    17. {
    18. n = n1;
    19. m = m1;
    20. // 分配n行m列的二维数组空间
    21. data = new int* [n];
    22. for (int i = 0; i < n; i++)
    23. {
    24. data[i] = new int[m];
    25. }
    26. }
    27. ~CMatrix()
    28. {
    29. // 释放空间
    30. for (int i = 0; i < n; i++)
    31. {
    32. delete[] data[i];
    33. }
    34. delete[] data;
    35. }
    36. CMatrix(const CMatrix& a)
    37. {
    38. n = a.n;
    39. m = a.m;
    40. data = new int* [n];
    41. for (int i = 0; i < n; i++)
    42. {
    43. data[i] = new int[m];
    44. for (int j = 0; j < m; j++)
    45. {
    46. data[i][j] = a.data[i][j];
    47. }
    48. }
    49. }
    50. CMatrix& operator = (const CMatrix& a)
    51. {
    52. //应该先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝。
    53. if (data != NULL)
    54. {
    55. for (int i = 0; i < n; i++)
    56. {
    57. delete[] data[i];
    58. }
    59. delete[] data;
    60. }
    61. n = a.n;
    62. m = a.m;
    63. //二维数组的深拷贝
    64. data = new int* [n];
    65. for (int i = 0; i < n; i++)
    66. {
    67. data[i] = new int[m];
    68. }
    69. for (int i = 0; i < n; i++)
    70. {
    71. for (int j = 0; j < m; j++)
    72. {
    73. data[i][j] = a.data[i][j];
    74. }
    75. }
    76. return *this;
    77. }
    78. int* const operator [](const int k)//指针常量是为了输入
    79. {
    80. return data[k];//只用一个[],因为有*
    81. }
    82. int operator () (int i, int j) //输出二维数组
    83. {
    84. return data[i][j];
    85. }
    86. };
    87. int main()
    88. {
    89. int t, n, m, i, j;
    90. cin >> t;
    91. while (t--)
    92. {
    93. cin >> n >> m;
    94. // 定义矩阵对象matrixA
    95. CMatrix matrixA(n, m);
    96. for (i = 0; i < n; i++)
    97. {
    98. for (j = 0; j < m; j++)
    99. {
    100. // 输入第i行第j列的数据
    101. cin >> matrixA[i][j];//这里用到了[]重载
    102. }
    103. }
    104. // 输出matrixA中的数据
    105. cout << "matrixA:" << endl;
    106. for (i = 0; i < n; i++)
    107. {
    108. for (j = 0; j < m; j++)
    109. {
    110. cout << matrixA(i, j) << " ";//()重载
    111. }
    112. cout << endl;
    113. }
    114. // 定义矩阵对象matrixB
    115. CMatrix matrixB;
    116. matrixB = matrixA;
    117. // 输出marixB中的数据
    118. cout << "matrixB:" << endl;
    119. for (i = 0; i < n; i++)
    120. {
    121. for (j = 0; j < m; j++)
    122. {
    123. cout << matrixB[i][j] << " ";
    124. }
    125. cout << endl;
    126. }
    127. }
    128. return 0;
    129. }

    D. 货币加减(运算符重载)

    题目描述

    定义CMoney类,包含元、角、分三个数据成员,友元函数重载‘+’、'-',实现货币的加减运算(假设a-b中a的金额始终大于等于b的金额),

    重载输入及输出,实现货币的输入,输出。

    读入最初的货币值,对其不断进行加、减操作,输出结果。

    可根据需要,为CMoney类添加构造函数或其它成员函数。

    输入

    测试次数

    每组测试数据格式如下:

    第一行,初始货币:元 角 分

    第二行开始,每行一个操作:add 元 角 分(加)、minus 元 角 分(减)、stop(结束)

    输出

     对每组测试数据,输出操作终止后的货币金额,具体输出格式见样例。

    输入样例1 

    2
    0 0 0
    add 48 9 0
    minus 0 5 3
    add 18 6 8
    add 12 1 2
    stop
    10 2 5
    add 5 8 0
    add 32 1 2
    minus 10 5 9
    minus 37 5 8
    stop


    输出样例1

    79元1角7分
    0元0角0分
     

    1. #include<iostream>
    2. using namespace std;
    3. class Cmoney
    4. {
    5. private:
    6. int yuan, fen, jiao;
    7. public:
    8. friend Cmoney operator+(Cmoney&, Cmoney&);
    9. friend Cmoney operator-(Cmoney&, Cmoney&);
    10. friend istream& operator >> (istream& cin, Cmoney& a);
    11. friend ostream& operator << (ostream& cout, Cmoney& c);
    12. void print()
    13. {
    14. cout << yuan << "元" << jiao << "角" << fen << "分";
    15. }
    16. Cmoney()
    17. {
    18. yuan = 0, jiao = 0, fen = 0;
    19. }
    20. Cmoney(int y, int j, int f) :yuan(y), jiao(j), fen(f)
    21. {
    22. }
    23. };
    24. Cmoney operator+(Cmoney& c1, Cmoney& c2)
    25. {
    26. //由于分不能超过10 角不能超过10 统一换算成分
    27. Cmoney temp;
    28. int c1fen = c1.yuan * 100 + c1.jiao * 10 + c1.fen;
    29. int c2fen = c2.yuan * 100 + c2.jiao * 10 + c2.fen;
    30. int sum = c1fen + c2fen;
    31. temp.yuan = sum / 100 ;
    32. temp.jiao = (sum % 100) / 10;
    33. temp.fen = (sum % 100) % 10;
    34. return temp;
    35. }
    36. Cmoney operator-(Cmoney& c1, Cmoney& c2)
    37. {
    38. Cmoney temp;
    39. int c1fen = c1.yuan * 100 + c1.jiao * 10 + c1.fen;
    40. int c2fen = c2.yuan * 100 + c2.jiao * 10 + c2.fen;
    41. int sum = c1fen - c2fen; //假设c1-c2中的金额始终大于0
    42. temp.yuan = sum / 100 ;
    43. temp.jiao = (sum % 100) / 10;
    44. temp.fen = (sum % 100) % 10;
    45. return temp;
    46. }
    47. //全局函数 左移 右移运算符
    48. istream& operator >> (istream& cin, Cmoney& a)//istream& 自己命名一个cin
    49. {
    50. cin >> a.yuan >> a.jiao >> a.fen;
    51. return cin; //一定要返回自己命名的
    52. }
    53. ostream& operator << (ostream& cout, Cmoney& c)
    54. {
    55. cout << c.yuan << "元" << c.jiao << "角" << c.fen << "分" << endl;
    56. return cout;
    57. }
    58. int main()
    59. {
    60. int t;
    61. cin >> t;
    62. while (t--)
    63. {
    64. int yuan, jiao, fen;
    65. cin >> yuan >> jiao >> fen;
    66. Cmoney c1(yuan, jiao, fen);
    67. string caozuo;
    68. cin >> caozuo;
    69. Cmoney c3;
    70. while (caozuo != "stop")
    71. {
    72. if (caozuo == "add")
    73. {
    74. cin >> yuan >> jiao >> fen;
    75. Cmoney c2(yuan, jiao, fen);
    76. c3 = c1 + c2;
    77. }
    78. if (caozuo == "minus")
    79. {
    80. cin >> yuan >> jiao >> fen;
    81. Cmoney c2(yuan, jiao, fen);
    82. c3 = c1 - c2;
    83. }
    84. c1 = c3; //重置c1为上一个操作后的c3
    85. cin >> caozuo;//继续输入操作 直到输入stop退出循环
    86. }
    87. cout << c3; //运用了重载运算 <<
    88. }
    89. }

    C. 矩形关系(运算符重载)

    题目描述

    假设坐标采用二维平面坐标。

    定义点类CPoint,包含属性x,y(整型)。方法有:带参构造函数,getX,getY分别返回点的x坐标,y坐标。

    定义矩形类CRectangle,包含属性:矩形的左上角坐标leftPoint,右下角坐标rightPoint。类中方法有:

    1)带参构造函数,初始化矩形的左上角、右下角

    2)重载>运算符,参数为CPoint点对象,假设为p,若p在矩形内,返回true,否则返回false。

    3)重载>运算符,第一个矩形若包含第二个矩形(部分边界可以相等),返回true,否则返回false。(要求该函数调用2)实现)

    4)重载==运算符,判断两个矩形是否一致,返回true或false。

    5)重载*运算符,判断两个矩形是否有重叠部分,返回true或false。

    6)重载类型转换运算符,计算矩形的面积并返回,面积是整型。

    7)重载<<运算符,输出矩形的两个角坐标,具体格式见样例。

    输入2个矩形,计算面积,判断矩形的关系。主函数如下,不可修改。

    输入样例1 

    2
    1 4 4 1
    2 3 3 2
    1 4 4 1
    0 3 5 2
    输出样例1

    矩形1:1 4 4 1 9
    矩形2:2 3 3 2 1
    矩形1包含矩形2

    矩形1:1 4 4 1 9
    矩形2:0 3 5 2 5
    矩形1和矩形2相交

    1. #include<iostream>
    2. using namespace std;
    3. class CPoint
    4. {
    5. private:
    6. int x, y;
    7. public:
    8. CPoint(int xx, int yy)
    9. {
    10. x = xx; y = yy;
    11. }
    12. int getX()
    13. {
    14. return x;
    15. }
    16. int getY()
    17. {
    18. return y;
    19. }
    20. };
    21. class CRectangle
    22. {
    23. private:
    24. CPoint leftPoint, rightPoint; //左上角坐标 右下角坐标
    25. public:
    26. CRectangle(int x1, int y1, int x2, int y2) :leftPoint(x1, y1), rightPoint(x2, y2)
    27. {
    28. }
    29. //重载>运算符,参数为CPoint点对象,假设为p,若p在矩形内,返回true,否则返回false
    30. bool operator>(CPoint& p)
    31. {
    32. if (p.getX() > leftPoint.getX() && p.getX() < rightPoint.getX() && p.getY() < leftPoint.getY() && p.getY() > rightPoint.getY())
    33. {
    34. return true;
    35. }
    36. else
    37. {
    38. return false;
    39. }
    40. }
    41. //重载>运算符,第一个矩形若包含第二个矩形(部分边界可以相等),返回true,否则返回false
    42. bool operator>(CRectangle& cr) //传入的cr是第二个矩形 两个坐标点都要符合在矩形上(包含边界)
    43. {
    44. if (cr.leftPoint.getX() >= leftPoint.getX() &&
    45. cr.leftPoint.getX() <= rightPoint.getX() &&
    46. cr.leftPoint.getY() <= leftPoint.getY() &&
    47. cr.leftPoint.getY() >= rightPoint.getY() &&
    48. cr.rightPoint.getX() >= leftPoint.getX() &&
    49. cr.rightPoint.getX() <= rightPoint.getX() &&
    50. cr.rightPoint.getY() <= leftPoint.getY() &&
    51. cr.rightPoint.getY() >= rightPoint.getY() )
    52. {
    53. return true;
    54. }
    55. else
    56. {
    57. return false;
    58. }
    59. }
    60. //重载==运算符,判断两个矩形是否一致
    61. bool operator==(CRectangle& cr) //两个坐标点一致
    62. {
    63. if (cr.leftPoint.getX() == leftPoint.getX()&&
    64. cr.leftPoint.getY() == leftPoint.getY() &&
    65. cr.rightPoint.getX() == rightPoint.getX() &&
    66. cr.rightPoint.getY() == rightPoint.getY())
    67. {
    68. return true;
    69. }
    70. else
    71. {
    72. return false;
    73. }
    74. }
    75. //重载*运算符,判断两个矩形是否有重叠部分,返回true或false。
    76. bool operator*(CRectangle& cr)
    77. { //不重叠的情况
    78. if (cr.leftPoint.getX() > rightPoint.getX()
    79. || cr.leftPoint.getY() < rightPoint.getY() ||
    80. cr.rightPoint.getX() < leftPoint.getX() ||
    81. cr.rightPoint.getY() > leftPoint.getY())
    82. {
    83. return false;
    84. }
    85. else
    86. {
    87. return true;
    88. }
    89. }
    90. //重载类型转换运算符,计算矩形的面积并返回,面积是整型。
    91. operator int()
    92. {
    93. int area;
    94. area = (rightPoint.getX() - leftPoint.getX()) * (leftPoint.getY() - rightPoint.getY());
    95. return area;
    96. }
    97. friend ostream& operator<<(ostream& stream, CRectangle& cr);
    98. };
    99. //全局函数 重载<<运算符,输出矩形的两个角坐标
    100. ostream& operator<<(ostream& stream, CRectangle& cr)
    101. {
    102. stream << cr.leftPoint.getX() << " " << cr.leftPoint.getY() << " " << cr.rightPoint.getX() << " " << cr.rightPoint.getY();
    103. return stream;
    104. }
    105. int main()
    106. {
    107. int t, x1, x2, y1, y2;
    108. cin >> t;
    109. while (t--)
    110. {
    111. // 矩形1的左上角、右下角
    112. cin >> x1 >> y1 >> x2 >> y2;
    113. CRectangle rect1(x1, y1, x2, y2);
    114. // 矩形2的左上角、右下角
    115. cin >> x1 >> y1 >> x2 >> y2;
    116. CRectangle rect2(x1, y1, x2, y2);
    117. // 输出矩形1的坐标及面积 //用了<<重载 和 int()重载
    118. cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
    119. // 输出矩形2的坐标及面积
    120. cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;
    121. if (rect1 == rect2) //==重载
    122. {
    123. cout << "矩形1和矩形2相等" << endl;
    124. }
    125. else if (rect2 > rect1) // >重载
    126. {
    127. cout << "矩形2包含矩形1" << endl;
    128. }
    129. else if (rect1 > rect2) // >重载
    130. {
    131. cout << "矩形1包含矩形2" << endl;
    132. }
    133. else if (rect1 * rect2) //重叠
    134. {
    135. cout << "矩形1和矩形2相交" << endl;
    136. }
    137. else
    138. {
    139. cout << "矩形1和矩形2不相交" << endl;
    140. }
    141. cout << endl;
    142. }
    143. return 0;
    144. }

  • 相关阅读:
    Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读
    最全总结:聊聊 Python 命令行参数化的几种方式
    servlet 教程 2:返回 jsp 页面
    胞外囊泡代谢组学—前列腺癌代谢变化研究的新策略
    文举论金:黄金原油全面走势分析策略独家指导
    [附源码]Python计算机毕业设计Django居家养老服务系统小程序
    JavaWeb基础(一)——Tomcat介绍
    ThreadLocal详解
    32 道 Spring 常见面试总结(附详细参考答案),我经常拿来面试别人
    SqlSugar安装使用和插入、更新、删除等基本操作
  • 原文地址:https://blog.csdn.net/fangyuxuan123/article/details/128131601