当前位置: 首页 > news >正文

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
【样例说明】

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

 【完整代码如下】

#include<iostream>
#include<vector>
using namespace std;class Matrix
{
public:int row;//数组行数int col;//数组列数int flag = 1;//当flag=1:可以输出;否则flag=0:出错,输出Error//用vector嵌套来存放动态二维数组//因为用的是嵌套,所以为二维数组 vector< vector<double> >v;//输出对应行列的元素void table(const int i, const int j){cout << v[i][j] << endl;}friend ostream& operator<<(ostream& output, Matrix &m);friend istream& operator>>(istream& input, Matrix &m);Matrix& operator+=(const Matrix&); Matrix& operator*=(const Matrix&);Matrix& operator=(const Matrix&);
};istream& operator>>(istream& input, Matrix& m)
{cin >> m.row >> m.col;double x=0.0;//x为即将输入的数组元素//vector作为顺序容器,长度是可以变化的 vector<double> vv;m.v.clear();//先删除数组v中的所有元素(先清空,防止出错) for (int i=0; i<m.row; i++){	vv.clear();//清除vv里上一次存过的元素,方便多次使用for (int j=0; j<m.col; j++){cin >> x;vv.push_back(x);}m.v.push_back(vv);//一行输入完后就整体存入v,即将此时的vv存入v}return input;
}
ostream& operator<<(ostream& output, Matrix& m)
{if (m.flag != 0){for (int i=0; i<m.row-1; i++){for (int j=0; j<m.col-1; j++){cout << m.v[i][j] << " ";}cout << m.v[i][m.col-1] << endl;}for (int j = 0; j < m.col - 1; j++){cout << m.v[m.row-1][j] << " ";}cout << m.v[m.row-1][m.col-1];}//如果被标志过,即table1和table2不满足矩阵的加法和乘法运算规则,输出ERROR!;else{cout << "ERROR!";}return output;
}
Matrix& Matrix:: operator+=(const Matrix& m)
{if (row==m.row && col==m.col){for (int i=0; i<row; i++){for (int j=0; j<col; j++){v[i][j] += m.v[i][j];}}}else{flag = 0;}return *this;
}
Matrix& Matrix:: operator*=(const Matrix& m)
{//注意矩阵相乘条件:前一个的列数=后一个的行数if (col == m.row ){for (int i=0; i<row; i++){double sum=0;for (int j=0; j<m.col; j++){for (int k=0; k<col; k++){sum += v[i][k] * m.v[k][j];}v[i][j]=sum;}	}}else{flag = 0;}return *this;
}
Matrix& Matrix::operator=(const Matrix& m)
{flag = 1;row = m.row;col = m.col;vector<double> vv;v.clear();for (int i=0; i<m.row; i++){vv.clear();for (int j=0; j<m.col; j++){vv.push_back(m.v[i][j]);}v.push_back(vv);}return *this;
}
//测试程序 
int main()
{Matrix table1,table2;cin >>table1>>table2;table1.table(table1.row / 2, table1.col / 2);table1 *= table2;cout << table1 << endl;table1 += table2;cout << table1 << endl;table1 = table2;cout << table1;return 0;
}

相关文章:

  • IDEA导入jar包
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • modbusRTU通信简单实现(使用NModbus4通信库)
  • 【喵叔闲扯】--迪米特法则
  • 23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点
  • 元宇宙3D云展厅应用到汽车销售的方案及特点
  • DAO和增删改查通用方法-BasicDao
  • PON网络应用场景
  • Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化
  • 一文看分布式锁
  • Node.js中的Buffer和Stream
  • CTF-PWN-堆- 【off-by-one】
  • 「Verilog学习笔记」实现3-8译码器①
  • MySQL存储架构
  • YoloV8改进策略:聚焦线性注意力重构YoloV8
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Java 多线程编程之:notify 和 wait 用法
  • javascript 哈希表
  • js如何打印object对象
  • maya建模与骨骼动画快速实现人工鱼
  • Mithril.js 入门介绍
  • nginx 负载服务器优化
  • vue学习系列(二)vue-cli
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 离散点最小(凸)包围边界查找
  • 微服务入门【系列视频课程】
  • 智能合约开发环境搭建及Hello World合约
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 翻译 | The Principles of OOD 面向对象设计原则
  • $().each和$.each的区别
  • $GOPATH/go.mod exists but should not goland
  • (003)SlickEdit Unity的补全
  • (4.10~4.16)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (译) 函数式 JS #1:简介
  • (转)负载均衡,回话保持,cookie
  • ***原理与防范
  • .Net 6.0 处理跨域的方式
  • .net 中viewstate的原理和使用
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net6Api后台+uniapp导出Excel
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Android Pro] AndroidX重构和映射
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [CF226E]Noble Knight's Path
  • [CQOI 2010]扑克牌
  • [CSS] 点击事件触发的动画
  • [CSS]浮动
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [git]git命令如何取消先前的配置
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)