• 矩阵类运算(运算符重载)


    目录

    题目描述

    思路分析

    AC代码1

    AC代码2


    题目描述

    利用重载运算符,实现矩阵的加法,减法。

    请重载加减运算符并自定义矩阵类完成相应的操作

    输入

    第一行为测试数据数

    对于每组测试数据

    第一行为矩阵的行数和列数

    接下来分别为两个矩阵的各个元素

    输出

    输出矩阵的和与差

    输入样例1

    2
    4 5
    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    16 17 18 19 20
    9 8 7 6 5
    4 3 2 1 0
    -1 5 6 9 1
    2 0 2 1 6
    4 5
    9 8 7 6 5
    4 3 2 1 0
    -1 5 6 9 1
    2 0 2 1 6
    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    16 17 18 19 20

    输出样例1

    Add:
    10 10 10 10 10 
    10 10 10 10 10 
    10 17 19 23 16 
    18 17 20 20 26 
    Minus:
    -8 -6 -4 -2 0 
    2 4 6 8 10 
    12 7 7 5 14 
    14 17 16 18 14 
    -----------------
    Add:
    10 10 10 10 10 
    10 10 10 10 10 
    10 17 19 23 16 
    18 17 20 20 26 
    Minus:
    8 6 4 2 0 
    -2 -4 -6 -8 -10 
    -12 -7 -7 -5 -14 
    -14 -17 -16 -18 -14 
    -----------------

    思路分析

    先说一下我发现的问题,一个是原本是考虑到先定义a和b两个矩阵,然后定义矩阵c=a+b和c=a-b的,但如果要这样操作的话,必须重载赋值运算符=才可以,我的一些同学在这个时候会发现系统会说找不到匹配的赋值函数,有可能是没有加const在参数上,但我加了const还是运行不出正确结果,于是我觉得是涉及到内存问题而a+b没有返回具有地址的对象,而是仅仅返回一个值(后来发现是其他问题,并不是这个原因,a+b返回了一个对象,这个对象可以满足条件,即修改之后的AC代码1)。因此我换了一种方法,不去定义矩阵C,使用(a+b)和(a-b)的方法来替换c,如代码2,这样也不需要重载赋值运算符=,因为没有用上。

    还有一个问题,就是我们创建矩阵元素必须得使用二级指针开辟内存了,因此原有的拷贝构造函数只是浅复制,我们必须重新定义一个拷贝构造函数来实现内存重新申请和copy矩阵元素。

    AC代码1

    1. #include"iostream"
    2. #include"string"
    3. using namespace std;
    4. class matrix
    5. {
    6. int n, m;
    7. int** p=NULL;
    8. public:
    9. matrix(int n, int m) :n(n), m(m) {
    10. int i;
    11. p = new int* [n];
    12. for (i = 0; i < n; i++)
    13. p[i] = new int[m];
    14. }
    15. matrix(const matrix& a)
    16. {
    17. n = a.n;
    18. m = a.m;
    19. int i, j;
    20. p = new int* [n];
    21. for (i = 0; i < n; i++)
    22. p[i] = new int[m];
    23. for (i = 0; i < n; i++)
    24. for (j = 0; j < m; j++)
    25. p[i][j] = a.p[i][j];
    26. }
    27. ~matrix()
    28. {
    29. if (p)
    30. {
    31. for (int i = 0; i < n; i++)
    32. delete[] p[i];
    33. delete[] p;
    34. }
    35. }
    36. void setmatrix()
    37. {
    38. int i, j;
    39. for (i = 0; i < n; i++)
    40. for (j = 0; j < m; j++)
    41. cin>>p[i][j];
    42. }
    43. matrix operator=(const matrix &a)
    44. {
    45. int i, j;
    46. n = a.n;
    47. m = a.m;
    48. for (i = 0; i < n; i++)
    49. for (j = 0; j < m; j++)
    50. p[i][j] = a.p[i][j];
    51. return *this;
    52. }
    53. matrix operator+(const matrix& b)
    54. {
    55. cout << "Add:" << endl;
    56. matrix c(*this);
    57. int i, j;
    58. for (i = 0; i < n; i++)
    59. for (j = 0; j < m; j++)
    60. c.p[i][j] = p[i][j] + b.p[i][j];
    61. return c;
    62. }
    63. matrix operator-(const matrix& b)
    64. {
    65. cout << "Minus:" << endl;
    66. matrix c(*this);
    67. int i, j;
    68. for (i = 0; i < n; i++)
    69. for (j = 0; j < m; j++)
    70. c.p[i][j] = p[i][j] - b.p[i][j];
    71. return c;
    72. }
    73. void display()
    74. {
    75. int i, j;
    76. for (i = 0; i < n; i++)
    77. {
    78. for (j = 0; j < m ; j++)
    79. cout << p[i][j] << ' ';
    80. cout << endl;
    81. }
    82. }
    83. void showline() { cout << "-----------------" << endl; }
    84. };
    85. int main()
    86. {
    87. int t, n, m;
    88. cin >> t;
    89. while (t--)
    90. {
    91. cin >> n >> m;
    92. matrix a(n, m);
    93. a.setmatrix();
    94. matrix b(n, m);
    95. b.setmatrix();
    96. matrix c=a+b;
    97. c.display();
    98. c=a-b;
    99. c.display();
    100. c.showline();
    101. }
    102. }

    AC代码2

    1. #include"iostream"
    2. #include"string"
    3. using namespace std;
    4. class matrix
    5. {
    6. int n, m;
    7. int** p=NULL;
    8. public:
    9. matrix(int n, int m) :n(n), m(m) {
    10. int i, j;
    11. p = new int* [n];
    12. for (i = 0; i < n; i++)
    13. p[i] = new int[m];
    14. }
    15. matrix(const matrix& a)
    16. {
    17. n = a.n;
    18. m = a.m;
    19. int i, j;
    20. p = new int* [n];
    21. for (i = 0; i < n; i++)
    22. p[i] = new int[m];
    23. for (i = 0; i < n; i++)
    24. for (j = 0; j < m; j++)
    25. p[i][j] = a.p[i][j];
    26. }
    27. ~matrix()
    28. {
    29. if (p)
    30. {
    31. for (int i = 0; i < n; i++)
    32. delete[] p[i];
    33. delete[] p;
    34. }
    35. }
    36. void setmatrix()
    37. {
    38. int i, j;
    39. for (i = 0; i < n; i++)
    40. for (j = 0; j < m; j++)
    41. cin>>p[i][j];
    42. }
    43. matrix operator+(const matrix& b)
    44. {
    45. cout << "Add:" << endl;
    46. matrix c(*this);
    47. int i, j;
    48. for (i = 0; i < n; i++)
    49. for (j = 0; j < m; j++)
    50. c.p[i][j] = p[i][j] + b.p[i][j];
    51. return c;
    52. }
    53. matrix operator-(const matrix& b)
    54. {
    55. cout << "Minus:" << endl;
    56. matrix c(*this);
    57. int i, j;
    58. for (i = 0; i < n; i++)
    59. for (j = 0; j < m; j++)
    60. c.p[i][j] = p[i][j] - b.p[i][j];
    61. return c;
    62. }
    63. void display()
    64. {
    65. int i, j;
    66. for (i = 0; i < n; i++)
    67. {
    68. for (j = 0; j < m ; j++)
    69. cout << p[i][j] << ' ';
    70. cout << endl;
    71. }
    72. }
    73. void showline() { cout << "-----------------" << endl; }
    74. };
    75. int main()
    76. {
    77. int t, n, m;
    78. cin >> t;
    79. while (t--)
    80. {
    81. cin >> n >> m;
    82. matrix a(n, m);
    83. a.setmatrix();
    84. matrix b(n, m);
    85. b.setmatrix();
    86. (a+b).display();
    87. (a-b).display();
    88. a.showline();
    89. }
    90. }
  • 相关阅读:
    vue3 使用 elementUi: ./lib/theme-chalk/index.css is not exported from package
    群聊比单聊,凭什么复杂这么多?
    华为机试真题 C++ 实现【迷宫问题】
    链表求和[dummy+尾插法+函数处理链表引用常见坑位]
    NM DEV Mathematics for Java 【suanshu.net免费】
    文本挖掘技术研究进展_笔记
    为什么说C++太复杂(复杂到哪了?)
    折半插入排序算法
    几个好用的数据标注软件labelme、CVAT及LabelImage
    聊聊Spring中最常用的11个扩展点
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/124961958