• C++ 编写动态二维double型数据类Matrix


    【问题描述】

    编写一个程序,定义一个安全、动态二维double型的数组类Matrix。

    • 实现Matrix table(row,col)定义row行col列的二维数组, row和col为正整数;
    • 实现table(i,j)访问table的第i行第j列的元素,行号和列号从0开始;
    • 实现Matrix的输入输出(>>、<<);
    • 实现矩阵加等、乘等运算(+=、*=),例:Matrix& operator+=(const Matrix&); Matrix& operator*=(const Matrix&);
    • 实现矩阵的赋值运算(=),例:Matrix& operator=(const Matrix&)。

    【输入形式】

    • 第一行table1的行列值row1和col1,空格分隔;
    • 第二行table1的初始化值,共row1*col1个数据,空格分隔;
    • 第三行table2的行列值row2和col2,空格分隔;
    • 第四行table2的初始化值,共row2*col2个数据,空格分隔;

    【输出形式】

    • Matrix的输出格式为row行col列, 数据空格分隔;
    • 若table1和table2不满足矩阵的加法和乘法运算规则,输出ERROR!;
    • 依次输出以下表达式的值,每个输出间隔一行;
    • table1(row1/2,col1/2);
    • table1 *= table2;
    • table1 += table2;
    • table1 = table2。

    【样例输入1】

    1 3
    1 1 1  
    2 3
    2 2 2 2 2 2
    【样例输出1】

    1
    ERROR! 
    ERROR!
    2 2 2
    2 2 2
    【样例输入2】

    2 3
    1 1 1 1 1 1
    3 2
    2 2 2 2 2 2
    【样例输出2】

    1
    6 6
    6 6
    ERROR!
    2 2
    2 2
    2 2
    【样例输入3】

    2 2
    1 1 1 1 
    2 2
    1 0 0 1
    【样例输出3】

    1
    1 1
    1 1
    2 1
    1 2
    1 0
    0 1
    【样例说明】

    • 不要显示多余的提示信息,避免输出判定错误。
    • 输出结束后不要输出任何内容,包括空格和换行。
    • 注意判断输出信息是否符合要求。

     【完整代码如下】

    1. #include
    2. #include
    3. using namespace std;
    4. class Matrix
    5. {
    6. public:
    7. int row;//数组行数
    8. int col;//数组列数
    9. int flag = 1;//当flag=1:可以输出;否则flag=0:出错,输出Error
    10. //用vector嵌套来存放动态二维数组
    11. //因为用的是嵌套,所以为二维数组
    12. vector< vector<double> >v;
    13. //输出对应行列的元素
    14. void table(const int i, const int j)
    15. {
    16. cout << v[i][j] << endl;
    17. }
    18. friend ostream& operator<<(ostream& output, Matrix &m);
    19. friend istream& operator>>(istream& input, Matrix &m);
    20. Matrix& operator+=(const Matrix&);
    21. Matrix& operator*=(const Matrix&);
    22. Matrix& operator=(const Matrix&);
    23. };
    24. istream& operator>>(istream& input, Matrix& m)
    25. {
    26. cin >> m.row >> m.col;
    27. double x=0.0;//x为即将输入的数组元素
    28. //vector作为顺序容器,长度是可以变化的
    29. vector<double> vv;
    30. m.v.clear();//先删除数组v中的所有元素(先清空,防止出错)
    31. for (int i=0; i
    32. {
    33. vv.clear();//清除vv里上一次存过的元素,方便多次使用
    34. for (int j=0; j
    35. {
    36. cin >> x;
    37. vv.push_back(x);
    38. }
    39. m.v.push_back(vv);//一行输入完后就整体存入v,即将此时的vv存入v
    40. }
    41. return input;
    42. }
    43. ostream& operator<<(ostream& output, Matrix& m)
    44. {
    45. if (m.flag != 0)
    46. {
    47. for (int i=0; i-1; i++)
    48. {
    49. for (int j=0; j-1; j++)
    50. {
    51. cout << m.v[i][j] << " ";
    52. }
    53. cout << m.v[i][m.col-1] << endl;
    54. }
    55. for (int j = 0; j < m.col - 1; j++)
    56. {
    57. cout << m.v[m.row-1][j] << " ";
    58. }
    59. cout << m.v[m.row-1][m.col-1];
    60. }
    61. //如果被标志过,即table1和table2不满足矩阵的加法和乘法运算规则,输出ERROR!;
    62. else
    63. {
    64. cout << "ERROR!";
    65. }
    66. return output;
    67. }
    68. Matrix& Matrix:: operator+=(const Matrix& m)
    69. {
    70. if (row==m.row && col==m.col)
    71. {
    72. for (int i=0; i
    73. {
    74. for (int j=0; j
    75. {
    76. v[i][j] += m.v[i][j];
    77. }
    78. }
    79. }
    80. else
    81. {
    82. flag = 0;
    83. }
    84. return *this;
    85. }
    86. Matrix& Matrix:: operator*=(const Matrix& m)
    87. {
    88. //注意矩阵相乘条件:前一个的列数=后一个的行数
    89. if (col == m.row )
    90. {
    91. for (int i=0; i
    92. {
    93. double sum=0;
    94. for (int j=0; j
    95. {
    96. for (int k=0; k
    97. {
    98. sum += v[i][k] * m.v[k][j];
    99. }
    100. v[i][j]=sum;
    101. }
    102. }
    103. }
    104. else
    105. {
    106. flag = 0;
    107. }
    108. return *this;
    109. }
    110. Matrix& Matrix::operator=(const Matrix& m)
    111. {
    112. flag = 1;
    113. row = m.row;
    114. col = m.col;
    115. vector<double> vv;
    116. v.clear();
    117. for (int i=0; i
    118. {
    119. vv.clear();
    120. for (int j=0; j
    121. {
    122. vv.push_back(m.v[i][j]);
    123. }
    124. v.push_back(vv);
    125. }
    126. return *this;
    127. }
    128. //测试程序
    129. int main()
    130. {
    131. Matrix table1,table2;
    132. cin >>table1>>table2;
    133. table1.table(table1.row / 2, table1.col / 2);
    134. table1 *= table2;
    135. cout << table1 << endl;
    136. table1 += table2;
    137. cout << table1 << endl;
    138. table1 = table2;
    139. cout << table1;
    140. return 0;
    141. }

  • 相关阅读:
    mac配置hdc
    Java基础-----正则表达式
    js实现PDF 预览和文件下载
    Docker从入门到跑路
    9月第1周榜单丨哔哩哔哩飞瓜数据B站UP主排行榜发布!
    企业哪些项目可以参与CMMI的评估?
    android studio 修改图标
    JS常见的报错及异常捕获
    浅析<router-view> v-slot事例
    Zabbix原厂给中国用户的一封信,4大理由消除使用限制的担忧
  • 原文地址:https://blog.csdn.net/weixin_74287172/article/details/134470154