矩阵乘法计算实验报告

C++课程设计实验报告

姓名:陈钱 学号:[1**********]6 班级:材科三班 题目:矩阵乘法计算 难易级别:A 级

实验报告成绩

指导教师

时间: 年 月 日

1 程序功能介绍

编写实现矩阵乘法计算的程序。

2 程序设计要求

(1) 设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。

(2) 修改程序结构,使程序可以反复执行,直至按键选择退出为止。

(3) 本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[M][N]来放

置数据,其中M,N 为用户可输入的任意整数。

(4) 增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以

通过键盘赋值,还可以通过读数据文件输入。

(5) 用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮

点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行乘法验证。

(6) 完成矩阵的乘法运算,在运算之前判断着两个矩阵是否满足运算条件,如果不满足,

给出提示信息。

3 程序设计思想

1)类的结构

该矩阵类的定义是将相关的数据和操作封装起来,用于实现乘法运算的矩阵要有两个矩阵类参与,结果放在另一个矩阵类的对象中,建议重载运算符*,并把这个重载函数定义为类的友元函数。参考的类的机构如下:

#include

#include

1

#include

#include

template

class CMatrix

{

T * * Mat; //矩阵的头指针

int nRow; //矩阵的行数

int nCol; //矩阵的列数

public:

CMatrix(); //缺省的构造函数

CMatrix(T * * mat,int row,int col); //构造函数

CMatrix(int row,int col); //构造函数

CMatrix(int row,int col,int k); //构造函数, 从键盘输入矩阵

void Show(); //输出

void InputFromFile(); //从文件输入矩阵

friend CMatrixoperator *(CMatrix &mat1,CMatrix &mat2);

};

4 实际运行程序如下:

#include

#include

#include

#include

template

//重载乘法2

class CMatrix

{

T * * Mat; //矩阵的头指针

int nRow; //矩阵的行数

int nCol; //矩阵的列数

public:

CMatrix(); //缺省的构造函数

CMatrix(T * * mat,int row,int col); //构造函数

CMatrix(int row,int col); //构造函数

CMatrix(int row,int col,int k); //构造函数, 从键盘输入矩阵

void Show(); //输出

void InputFromFile(); //从文件输入矩阵

friend CMatrixoperator *(CMatrix &mat1,CMatrix &mat2);

};

template

CMatrix::CMatrix() //缺省的构造函数

{

nRow=100,nCol=100;

Mat=new T*[100];

for(int i=0;i

{

Mat[i]=new T[100];

}

//重载乘法3

}

template

CMatrix::CMatrix(int row,int col) //两个参数的构造函数

{

int i,j;

nRow=row,nCol=col;

Mat=new T*[nRow];

for(i=0;i

{

Mat[i]=new T[nCol];

}

cout

for(i=0;i

for(j=0;j

{

cout

cin>>Mat[i][j];

}

}

template

CMatrix::CMatrix(int row,int col,int k) //三个参数的构造函数

{

nRow=row,nCol=col;

4

Mat=new T*[nRow];

for(int i=0;i

{

Mat[i]=new T[nCol];

}

}

template

void CMatrix::Show() //矩阵输出函数

{

int i,j;

for(i=0;i

{

cout

for(j=0;j

cout

}

cout

}

template

void CMatrix::InputFromFile() //矩阵文件输入函数

{

ifstream infile;

infile.open("daijp.txt",ios::nocreate);

5

if(!infile)

{

cout

exit(0);

}

for(int i=0;i

for(int j=0;j

{

infile>>Mat[i][j];

}

infile.close();

}

template

CMatrixoperator* (CMatrix &mat1,CMatrix &mat2) //矩阵乘法运算符重载

{

CMatrixmat3(mat1.nRow,mat2.nCol,0);

for(int i=0;i

for(int j=0;j

{

mat3.Mat[i][j]=0;

for(int k=0;k

mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];

}

6

return mat3;

}

template

void choose1(T) //数据输入类型选择函数模板,其中T 为伪参数,用于函数模板实列化 {

cout初始化赋值"键盘输入"文件输入"

cout

cin>>srfs;

switch(srfs) //用于选择不同的输入方式

{

case 1:

{

CMatrixmata,matb,matc;

}break;

case 2:

{

int a,b,c,d;

cout

cin>>a>>b;

CMatrixmata(a,b);

cout

cin>>c>>d;

7

{ cout

break;

}

CMatrixmatb(c,d);

CMatrixmatc(a,d,0);

mata.Show();

matb.Show();

matc=mata*matb;

cout

matc.Show();

}break;

case 3:

{

int a,b,c,d;

cout

cin>>a>>b;

CMatrixmata(a,b,0);

cout

cin>>c>>d;

if(b!=c)

{ "

8

} break; CMatrixmatb(c,d,0); CMatrixmatc(a,d,0); mata.InputFromFile(); matb.InputFromFile(); mata.Show(); matb.Show(); matc=mata*matb; cout

default:cout

} }

void choose() //数据类型选择函数

{ cout

cout 整型!" 浮点型!" 双精度型!"

cin>>sjlx;

switch(sjlx)

{

case 1:

{

choose1(1);

}break;

case 2:

{

choose1(0.0);

}break;

case 3:

{

choose1(1e-10);

}break;

default:cout

cout

}

void main() //主函数部分

{

loop:

cout

10

cout

cout

cout

cout

choose();

loop1:

cout

int a;

cin>>a;

switch(a)

{

case 1:goto loop;

break;

case 2:

{

cout

cout

cin.get();

cin.get(); //去除缓冲区的回车符

exit(1);

}

default:cout

goto loop1;

}

}

5 运行结果如下:

************

****************

******************** 欢迎使用!********************

时间:2014年3月22号

姓名:陈钱 学号:[1**********]6

整型!

浮点型!

双精度型!

选择数据类型:

1

初始化赋值

键盘输入

文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:2

第[1][3]个数据:3

第[2][1]个数据:4

第[2][2]个数据:5

第[2][3]个数据:6

第[3][1]个数据:7

第[3][2]个数据:8

第[3][3]个数据:9

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:9

第[1][2]个数据:8

第[1][3]个数据:7

第[2][1]个数据:6

第[2][2]个数据:5

第[2][3]个数据:4

第[3][1]个数据:3

第[3][2]个数据:2

第[3][3]个数据:1

班级:材科三班

1 2 3

4 5 6

7 8 9

9 8 7

6 5 4

3 2 1

两矩阵相乘结果为:

30 24 18

84 69 54

138 114 90

是否继续执行?

1. 继续!

2. 退出!

1

*******************************

*******************************

********************** 欢迎使用!********************

***********

*******************************

时间:2014年3月22号

姓名:陈钱 学号:[1**********]6

整型!

浮点型!

双精度型!

选择数据类型:

3

初始化赋值

键盘输入

文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3

3

请输入数据:

第[1][1]个数据:11

第[1][2]个数据:12

班级:材科三班

第[1][3]个数据:13

第[2][1]个数据:14

第[2][2]个数据:15

第[2][3]个数据:16

第[3][1]个数据:14

第[3][2]个数据:1

第[3][3]个数据:7

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:51

第[1][3]个数据:6

第[2][1]个数据:14

第[2][2]个数据:12

第[2][3]个数据:13

第[3][1]个数据:14

第[3][2]个数据:185

第[3][3]个数据:18

11 12 13

14 15 16

14 1 7

1 51 6

14 12 13

14 185 18

两矩阵相乘结果为:

361 3110 456

448 3854 567

126 2021 223

是否继续执行?

1. 继续!

2. 退出!

2

谢谢使用!

按任意键退出!

6 思考与总结

1)本程序只能进行简单的矩阵乘法,不能做更加复杂的混合运算。

2)当矩阵的行列数超出一定的范围后,不知该如何处理。

3)没有异常处理机制。

7心得与体会

1) 由于上学期的C++课程学的不是很好,在设计程序的时候参考已有程序比较多,所以,

还是要自己有真才实学才行。

2) 设计本程序耗时巨大,需要很大的毅力才能完成,贵在坚持。

3) 通过编写这次程序,对C++有了一点理解,对矩阵知识也有所了解。

4) 版权很重要!

C++课程设计实验报告

姓名:陈钱 学号:[1**********]6 班级:材科三班 题目:矩阵乘法计算 难易级别:A 级

实验报告成绩

指导教师

时间: 年 月 日

1 程序功能介绍

编写实现矩阵乘法计算的程序。

2 程序设计要求

(1) 设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。

(2) 修改程序结构,使程序可以反复执行,直至按键选择退出为止。

(3) 本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[M][N]来放

置数据,其中M,N 为用户可输入的任意整数。

(4) 增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以

通过键盘赋值,还可以通过读数据文件输入。

(5) 用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮

点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行乘法验证。

(6) 完成矩阵的乘法运算,在运算之前判断着两个矩阵是否满足运算条件,如果不满足,

给出提示信息。

3 程序设计思想

1)类的结构

该矩阵类的定义是将相关的数据和操作封装起来,用于实现乘法运算的矩阵要有两个矩阵类参与,结果放在另一个矩阵类的对象中,建议重载运算符*,并把这个重载函数定义为类的友元函数。参考的类的机构如下:

#include

#include

1

#include

#include

template

class CMatrix

{

T * * Mat; //矩阵的头指针

int nRow; //矩阵的行数

int nCol; //矩阵的列数

public:

CMatrix(); //缺省的构造函数

CMatrix(T * * mat,int row,int col); //构造函数

CMatrix(int row,int col); //构造函数

CMatrix(int row,int col,int k); //构造函数, 从键盘输入矩阵

void Show(); //输出

void InputFromFile(); //从文件输入矩阵

friend CMatrixoperator *(CMatrix &mat1,CMatrix &mat2);

};

4 实际运行程序如下:

#include

#include

#include

#include

template

//重载乘法2

class CMatrix

{

T * * Mat; //矩阵的头指针

int nRow; //矩阵的行数

int nCol; //矩阵的列数

public:

CMatrix(); //缺省的构造函数

CMatrix(T * * mat,int row,int col); //构造函数

CMatrix(int row,int col); //构造函数

CMatrix(int row,int col,int k); //构造函数, 从键盘输入矩阵

void Show(); //输出

void InputFromFile(); //从文件输入矩阵

friend CMatrixoperator *(CMatrix &mat1,CMatrix &mat2);

};

template

CMatrix::CMatrix() //缺省的构造函数

{

nRow=100,nCol=100;

Mat=new T*[100];

for(int i=0;i

{

Mat[i]=new T[100];

}

//重载乘法3

}

template

CMatrix::CMatrix(int row,int col) //两个参数的构造函数

{

int i,j;

nRow=row,nCol=col;

Mat=new T*[nRow];

for(i=0;i

{

Mat[i]=new T[nCol];

}

cout

for(i=0;i

for(j=0;j

{

cout

cin>>Mat[i][j];

}

}

template

CMatrix::CMatrix(int row,int col,int k) //三个参数的构造函数

{

nRow=row,nCol=col;

4

Mat=new T*[nRow];

for(int i=0;i

{

Mat[i]=new T[nCol];

}

}

template

void CMatrix::Show() //矩阵输出函数

{

int i,j;

for(i=0;i

{

cout

for(j=0;j

cout

}

cout

}

template

void CMatrix::InputFromFile() //矩阵文件输入函数

{

ifstream infile;

infile.open("daijp.txt",ios::nocreate);

5

if(!infile)

{

cout

exit(0);

}

for(int i=0;i

for(int j=0;j

{

infile>>Mat[i][j];

}

infile.close();

}

template

CMatrixoperator* (CMatrix &mat1,CMatrix &mat2) //矩阵乘法运算符重载

{

CMatrixmat3(mat1.nRow,mat2.nCol,0);

for(int i=0;i

for(int j=0;j

{

mat3.Mat[i][j]=0;

for(int k=0;k

mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];

}

6

return mat3;

}

template

void choose1(T) //数据输入类型选择函数模板,其中T 为伪参数,用于函数模板实列化 {

cout初始化赋值"键盘输入"文件输入"

cout

cin>>srfs;

switch(srfs) //用于选择不同的输入方式

{

case 1:

{

CMatrixmata,matb,matc;

}break;

case 2:

{

int a,b,c,d;

cout

cin>>a>>b;

CMatrixmata(a,b);

cout

cin>>c>>d;

7

{ cout

break;

}

CMatrixmatb(c,d);

CMatrixmatc(a,d,0);

mata.Show();

matb.Show();

matc=mata*matb;

cout

matc.Show();

}break;

case 3:

{

int a,b,c,d;

cout

cin>>a>>b;

CMatrixmata(a,b,0);

cout

cin>>c>>d;

if(b!=c)

{ "

8

} break; CMatrixmatb(c,d,0); CMatrixmatc(a,d,0); mata.InputFromFile(); matb.InputFromFile(); mata.Show(); matb.Show(); matc=mata*matb; cout

default:cout

} }

void choose() //数据类型选择函数

{ cout

cout 整型!" 浮点型!" 双精度型!"

cin>>sjlx;

switch(sjlx)

{

case 1:

{

choose1(1);

}break;

case 2:

{

choose1(0.0);

}break;

case 3:

{

choose1(1e-10);

}break;

default:cout

cout

}

void main() //主函数部分

{

loop:

cout

10

cout

cout

cout

cout

choose();

loop1:

cout

int a;

cin>>a;

switch(a)

{

case 1:goto loop;

break;

case 2:

{

cout

cout

cin.get();

cin.get(); //去除缓冲区的回车符

exit(1);

}

default:cout

goto loop1;

}

}

5 运行结果如下:

************

****************

******************** 欢迎使用!********************

时间:2014年3月22号

姓名:陈钱 学号:[1**********]6

整型!

浮点型!

双精度型!

选择数据类型:

1

初始化赋值

键盘输入

文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:2

第[1][3]个数据:3

第[2][1]个数据:4

第[2][2]个数据:5

第[2][3]个数据:6

第[3][1]个数据:7

第[3][2]个数据:8

第[3][3]个数据:9

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:9

第[1][2]个数据:8

第[1][3]个数据:7

第[2][1]个数据:6

第[2][2]个数据:5

第[2][3]个数据:4

第[3][1]个数据:3

第[3][2]个数据:2

第[3][3]个数据:1

班级:材科三班

1 2 3

4 5 6

7 8 9

9 8 7

6 5 4

3 2 1

两矩阵相乘结果为:

30 24 18

84 69 54

138 114 90

是否继续执行?

1. 继续!

2. 退出!

1

*******************************

*******************************

********************** 欢迎使用!********************

***********

*******************************

时间:2014年3月22号

姓名:陈钱 学号:[1**********]6

整型!

浮点型!

双精度型!

选择数据类型:

3

初始化赋值

键盘输入

文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3

3

请输入数据:

第[1][1]个数据:11

第[1][2]个数据:12

班级:材科三班

第[1][3]个数据:13

第[2][1]个数据:14

第[2][2]个数据:15

第[2][3]个数据:16

第[3][1]个数据:14

第[3][2]个数据:1

第[3][3]个数据:7

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:51

第[1][3]个数据:6

第[2][1]个数据:14

第[2][2]个数据:12

第[2][3]个数据:13

第[3][1]个数据:14

第[3][2]个数据:185

第[3][3]个数据:18

11 12 13

14 15 16

14 1 7

1 51 6

14 12 13

14 185 18

两矩阵相乘结果为:

361 3110 456

448 3854 567

126 2021 223

是否继续执行?

1. 继续!

2. 退出!

2

谢谢使用!

按任意键退出!

6 思考与总结

1)本程序只能进行简单的矩阵乘法,不能做更加复杂的混合运算。

2)当矩阵的行列数超出一定的范围后,不知该如何处理。

3)没有异常处理机制。

7心得与体会

1) 由于上学期的C++课程学的不是很好,在设计程序的时候参考已有程序比较多,所以,

还是要自己有真才实学才行。

2) 设计本程序耗时巨大,需要很大的毅力才能完成,贵在坚持。

3) 通过编写这次程序,对C++有了一点理解,对矩阵知识也有所了解。

4) 版权很重要!


相关文章

  • 数值分析实验,用程序实现列主元消去法解方程组
  • <数值分析>实验报告 实验序号:实验二 实验名称: 列主元消去法解方程组 学号: 姓名: 任课教师: 专业班级:) 1. 实验目的: 用列主元Gauss 消元法解n 阶线性代数方程组: ⎧a 11x 1+a 12x 2+⋯+a ...查看


  • 教师资格证考试目录
  • 高一上学期学必修1.3,下学期学必修2.4,高二上半学期(期中考试前)学必修5,再学选修,其中理科期中考试后期末考试前学选修2-1,文科是选修1-1,到年后第二学期理科在期中考试前学选修2-2,文科是1-2,期中考试后到期末考试理科学选修2 ...查看


  • 数值分析学习心得体会
  • 数值分析学习感想 一个学期的数值分析,在老师的带领下,让我对这门课程有了深刻的理解和感悟.这门 课程是一个十分重视算法和原理的学科,同时它能够将人的思维引入数学思考的模式,在处 理问题的时候,可以合理适当的提出方案和假设.他的内容贴近实际, ...查看


  • 投资学实验报告
  • 编号: 学年第学期 实 验 报 告 实验课程名称 投资学 专 业 班 级 姓 名 学 号 实验指导教师 目录 1. 模拟炒股 2. 多资产模型 3. 利用修正久期计算债券价格增量的近似值 4. 两种资产可行值 5. 在无风险资产和两个风险资 ...查看


  • 数字信号处理实验一(上机)报告
  • 数字信号处理实验报告 实验名称: 实验一 离散时间信号的时域表示 实验时间: 2014 年 9 月 16 日 学号: [1**********]4 姓名: 孙舸 成绩: 评语: 一. 实验目的 1.熟悉MATLAB 命令,掌握离散时间信号- ...查看


  • 数值分析课程设计(最终版)
  • 本文主要通过Matlab 软件,对数值分析中的LU 分解法.最小二乘法.复化Simpon 积分.Runge-Kutta 方法进行编程,并利用这些方法在MATLAB 中对一些问题进行求解,并得出结论. 实验一线性方程组数值解法中,本文选取LU ...查看


  • 测绘程序设计课程实习报告模板
  • 一.实习目的 <测绘程序设计>是一门理论与实践并重的课程,课程设计是测量数据处理理论学习的一个重要实践环节,可以看做是在学习了专业基础理论课<误差理论与测量平差基础>课程后进行的一门实践课程,其目的是增强学生对测量平 ...查看


  • 高斯消元法 1
  • 求解线性方程组的直接解法 5.1 Gauss 消去法 ① 三角方程组 先举一个简单的例子来说明消去法的基本思想. 例1. 用消去法解方程组 (1)⎧x 1+x 2+x 3=6, ⎪ (2) ⎨4x 2-x 3=5, ⎪2x -2x +x = ...查看


  • 数值分析作业思考题
  • 数值分析思考题1 1.讨论绝对误差(限).相对误差(限)与有效数字之间的关系. 2.相对误差在什么情况下可以用下式代替? e *x *-x e =*= x x * *r 3.查阅何谓问题的"病态性",并区分与" ...查看


热门内容