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) 版权很重要!