没有合适的资源?快使用搜索试试~ 我知道了~
面向对象程序设计实验报告四1
需积分: 0 0 下载量 104 浏览量
2022-08-03
11:29:29
上传
评论
收藏 1.02MB PDF 举报
温馨提示
试读
21页
1. 题目要求 2. 需求分析 1. 声明模板类 MAT,并实现其成员函数的定义 2. 使用矩阵定义、深拷贝构造、移动构造三种方式重载构造函数,其中移动构造函数
资源详情
资源评论
资源推荐
课 程 实 验 报 告
课程名称:面向对象程序设计
实验名称:面向对象的矩阵运算编程
院 系 :计算机科学与技术
专业班级 : CS2008 班
学 号 : U202015533
姓 名 : 徐瑞达
指导教师 : 许向文
2021 年 10 月 26 日
面向对象程序设计实验报告
- 1 -
一、需求分析
1. 题目要求
矩阵 MAT 是行列定长的二维数组。常见的矩阵运算包括矩阵的加、减、乘、转置和
赋值等运算。请对矩阵 MAT 类中的所有函数成员编程,并对随后给出的 main( )函数进行
扩展,以便完成矩阵及其重载的所有运算符的测试。输出矩阵元素时整数用”%6ld”
或”%6lld”打印,浮点数用”%8f”或”%8lf”打印。至少要测试两种实例类 MAT<int>和
MAT<long long>。
#define _CRT_SECURE_NO_WARNINGS
#include <iomanip>
#include <exception>
#include <typeinfo>
#include <string.h>
using namespace std;
template <typename T>
class MAT {
T* const e; //指向所有整型矩阵元素的指针
const int r, c; //矩阵的行 r 和列 c 大小
public:
MAT(int r, int c); //矩阵定义
MAT(const MAT& a); //深拷贝构造
MAT(MAT&& a)noexcept; //移动构造
virtual ~MAT()noexcept;
virtual T* const operator[ ](int r);//取矩阵 r 行的第一个元素地址,r 越界抛异常
virtual MAT operator+(const MAT& a)const; //矩阵加法,不能加抛异常
virtual MAT operator-(const MAT& a)const; //矩阵减法,不能减抛异常
virtual MAT operator*(const MAT& a)const; //矩阵乘法,不能乘抛异常
virtual MAT operator~()const; //矩阵转置
virtual MAT& operator=(const MAT& a); //深拷贝赋值运算
virtual MAT& operator=(MAT&& a)noexcept; //移动赋值运算
virtual MAT& operator+=(const MAT& a); //“+=”运算
virtual MAT& operator-=(const MAT& a); //“-=”运算
virtual MAT& operator*=(const MAT& a); //“*=”运算
//print 输出至 s 并返回 s:列用空格隔开,行用回车结束
virtual char* print(char* s)const noexcept;
};
int main(int argc, char* argv[ ]) //请扩展 main()测试其他运算
{
MAT<int> a(1, 2), b(2, 2), c(1, 2);
char t[2048];
a[0][0] = 1; //类似地初始化矩阵的所有元素
a[0][1] = 2; //等价于“*(a.operator[ ](0)+1)=2;”即等价于“*(a[0]+1)=2;”
a.print(t); //初始化矩阵后输出该矩阵
b[0][0] = 3; b[0][1] = 4; //调用 T* const operator[ ](int r)初始化数组元素
面向对象程序设计实验报告
- 2 -
b[1][0] = 5; b[1][1] = 6;
b.print(t);
c = a * b; //测试矩阵乘法运算
c.print(t);
(a + c).print(t); //测试矩阵加法运算
c = c - a; //测试矩阵减法运算
c.print(t);
c += a; //测试矩阵“+=”运算
c.print(t);
c = ~a; //测试矩阵转置运算
c.print(t);
return 0;
}
2. 需求分析
1. 声明模板类 MAT,并实现其成员函数的定义。
2. 使用矩阵定义、深拷贝构造、移动构造三种方式重载构造函数,其中移动构造函数需
要将参数 a 置空;
3. 重载矩阵的加法、减法、乘法运算符,当无法进行运算时抛出异常;
4. 定义深拷贝赋值和移动赋值运算,其中移动构造时需要将参数 a 赋空;
5. 重载矩阵的转置、自加、自减、自乘运算符;
6. 将矩阵格式化输出至 s,并要根据实例类型使用不同的格式化输出方式;
7. 在 main 函数中可以使用 TestMAT 函数进行测试,也应可以自己调用函数测试;
8. 至少实现两种实例类,本项目实现了四种实例类——int、long long、float、double。
二、系统设计
1. 概要设计
根据用户需求,将该项目系统按照函数功能分为若干个模块进行时实现。将 MAT 类声明
和定义封装在 MAT 头文件中,在 main 源文件中调用 TestMAT 函数测试或者自写程序测试,
用户可根据提示进行选择。
总体结构流程图如下:
面向对象程序设计实验报告
- 3 -
图 1 总体结构流程图
2. 详细设计
1. 初始化模板类模块:
该模块使用函数重载定义了三个构造函数,分别实现根据参数(行和列)初始化,深拷
贝初始化,移动初始化三个功能。其中 MAT(int r, int c)函数根据参数创建一个行数为 r、列数
为 c 的矩阵;MAT(const MAT &a)函数将模板类 a 深拷贝至 this 所指类;MAT(MAT &&a)
noexcept 函数用 a 移动初始化 this 所指类,并要将 a 赋空。具体流程图如图 2 所示。
图 2 初始化模块流程图
2. 赋值模块:
该模块使用函数重载定义了两个运算符’=’重载函数,分别实现深拷贝赋值,移动赋值两
个功能。其中 virtual MAT &operator=(const MAT &a)函数将模板类 a 深拷贝至 this 所指类;
virtual MAT &operator=(MAT &&a) noexcept 函数用 a 移动赋值 this 指类,并要将 a 赋空。具
体流程图如图 3 所示。
剩余20页未读,继续阅读
yiyi分析亲密关系
- 粉丝: 22
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0