C++课程设计实验报告
姓名:陈钱 学号:913116120316 班级:材科三班
题目:矩阵乘法计算 难易级别:A级
实验报告成绩
指导教师
时间: 年 月 日
1 程序功能介绍
编写实现矩阵乘法计算的程序。
2 程序设计要求
(1) 设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。
(2) 修改程序结构,使程序可以反复执行,直至按键选择退出为止。
(3) 本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[M][N]来放置数据,其中M,N为用户可输入的任意整数。
(4) 增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以通过键盘赋值,还可以通过读数据文件输入。
(5) 用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行乘法验证。
(6) 完成矩阵的乘法运算,在运算之前判断着两个矩阵是否满足运算条件,如果不满足,给出提示信息。
3 程序设计思想
1)类的结构
该矩阵类的定义是将相关的数据和操作封装起来,用于实现乘法运算的矩阵要有两个矩阵类参与,结果放在另一个矩阵类的对象中,建议重载运算符*,并把这个重载函数定义为类的友元函数。参考的类的机构如下:
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<stdlib.h>
template<class T>
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 CMatrix<T>operator *(CMatrix<T> &mat1,CMatrix<T> &mat2); //重载乘法
};
4 实际运行程序如下:
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<stdlib.h>
template<class T>
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 CMatrix<T>operator *(CMatrix<T> &mat1,CMatrix<T> &mat2); //重载乘法
};
template<class T>
CMatrix<T>::CMatrix() //缺省的构造函数
{
nRow=100,nCol=100;
Mat=new T*[100];
for(int i=0;i<100;i++)
{
Mat[i]=new T[100];
}
}
template<class T>
CMatrix<T>::CMatrix(int row,int col) //两个参数的构造函数
{
int i,j;
nRow=row,nCol=col;
Mat=new T*[nRow];
for(i=0;i<nRow;i++)
{
Mat[i]=new T[nCol];
}
cout<<"请输入数据: \n";
for(i=0;i<nRow;i++)
for(j=0;j<nCol;j++)
{
cout<<"第["<<i+1<<"]["<<j+1<<"]个数据:";
cin>>Mat[i][j];
}
}
template<class T>
CMatrix<T>::CMatrix(int row,int col,int k) //三个参数的构造函数
{
nRow=row,nCol=col;
Mat=new T*[nRow];
for(int i=0;i<nRow;i++)
{
Mat[i]=new T[nCol];
}
}
template<class T>
void CMatrix<T>::Show() //矩阵输出函数
{
int i,j;
for(i=0;i<nRow;i++)
{
cout<<endl;
for(j=0;j<nCol;j++)
cout<<Mat[i][j]<<setw(6);
}
cout<<endl;
}
template<class T>
void CMatrix<T>::InputFromFile() //矩阵文件输入函数
{
ifstream infile;
infile.open("daijp.txt",ios::nocreate);
if(!infile)
{
cout<<"输入文件不存在,请先建立输入文件\n";
exit(0);
}
for(int i=0;i<nRow;i++)
for(int j=0;j<nCol;j++)
{
infile>>Mat[i][j];
}
infile.close();
}
template<class T>
CMatrix<T>operator* (CMatrix<T> &mat1,CMatrix<T> &mat2) //矩阵乘法运算符重载
{
CMatrix<T>mat3(mat1.nRow,mat2.nCol,0);
for(int i=0;i<mat1.nRow;i++)
for(int j=0;j<mat2.nCol;j++)
{
mat3.Mat[i][j]=0;
for(int k=0;k<mat1.nCol;k++)
mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];
}
return mat3;
}
template<class T>
void choose1(T) //数据输入类型选择函数模板,其中T为伪参数,用于函数模板实列化
{
cout<<"<1>初始化赋值"<<endl<<"<2>键盘输入"<<endl<<"<3>文件输入"<<endl;
int srfs;
cout<<"请选择输入方式: \n";
cin>>srfs;
switch(srfs) //用于选择不同的输入方式
{
case 1:
{
CMatrix<T>mata,matb,matc;
}break;
case 2:
{
int a,b,c,d;
cout<<"输入第一个矩阵的行数和列数: "<<endl;
cin>>a>>b;
CMatrix<T>mata(a,b);
cout<<"输入第二个矩阵的行数和列数: "<<endl;
cin>>c>>d;
if(b!=c)
{
cout<<"错误,两个矩阵不能相乘!\n";
break;
}
CMatrix<T>matb(c,d);
CMatrix<T>matc(a,d,0);
mata.Show();
matb.Show();
matc=mata*matb;
cout<<"两矩阵相乘结果为: \n";
matc.Show();
}break;
case 3:
{
int a,b,c,d;
cout<<"输入第一个矩阵的行数和列数: "<<endl;
cin>>a>>b;
CMatrix<T>mata(a,b,0);
cout<<"输入第二个矩阵的行数和列数: "<<endl;
cin>>c>>d;
if(b!=c)
{
cout<<"错误,两个矩阵不能相乘!\n";
break;
}
CMatrix<T>matb(c,d,0);
CMatrix<T>matc(a,d,0);
mata.InputFromFile();
matb.InputFromFile();
mata.Show();
matb.Show();
matc=mata*matb;
cout<<"两矩阵相乘结果为: \n";
matc.Show();
}break;
default:cout<<"输入选择错误!"<<endl;
}
}
void choose() //数据类型选择函数
{
cout<<"时间:20##年3月22号"<<endl<<"姓名:陈钱 "<<setw(32)<<"学号:913116120316"<<setw(32)<<"班级:材科三班"<<endl;
cout<<endl<<"<1> 整型!"<<endl<<"<2> 浮点型!"<<endl<<"<3> 双精度型!"<<endl;
cout<<"选择数据类型: \n";
int sjlx;
cin>>sjlx;
switch(sjlx)
{
case 1:
{
choose1(1);
}break;
case 2:
{
choose1(0.0);
}break;
case 3:
{
choose1(1e-10);
}break;
default:cout<<"输入选择错误!"<<endl;
}
cout<<endl;
}
void main() //主函数部分
{
loop:
cout<<"*******************************\n";
cout<<"*******************************\n";
cout<<"\n\n\n********************** 欢迎使用!********************\n";
cout<<" ***********\n";
cout<<"*******************************\n\n";
choose();
loop1:
cout<<"是否继续执行?"<<endl<<"1.继续!"<<endl<<"2.退出!"<<endl;
int a;
cin>>a;
switch(a)
{
case 1:goto loop;
break;
case 2:
{
cout<<"谢谢使用!"<<endl;
cout<<"按任意键退出!"<<endl;
cin.get();
cin.get(); //去除缓冲区的回车符
exit(1);
}
default:cout<<"输入选择错误!"<<endl;
goto loop1;
}
}
5 运行结果如下:
************
****************
******************** 欢迎使用!********************
时间:20##年3月22号
姓名:陈钱 学号:913116120316 班级:材科三班
<1> 整型!
<2> 浮点型!
<3> 双精度型!
选择数据类型:
1
<1>初始化赋值
<2>键盘输入
<3>文件输入
请选择输入方式:
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
*******************************
*******************************
********************** 欢迎使用!********************
***********
*******************************
时间:20##年3月22号
姓名:陈钱 学号:913116120316 班级:材科三班
<1> 整型!
<2> 浮点型!
<3> 双精度型!
选择数据类型:
3
<1>初始化赋值
<2>键盘输入
<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)版权很重要!
算法设计与分析实验报告班级姓名学号年月日目录实验一二分查找程序实现03页实验二棋盘覆盖问题分治法08页实验三01背包问题的动态规划…
算法设计课程报告课题名称算法设计与实现课题负责人名学号张樱紫0743111317同组成员名单角色无指导教师左劼评阅成绩评阅意见提交…
遗传算法实验报告姓名:**学号:**一、实验目的:熟悉和掌握遗传算法的运行机制和求解的基本方法。遗传算法是一种基于空间搜索的算法,…
1hanoi塔packagesyyimportjavautilpublicclassHanoipublicstaticvoidmo…
华北电力大学科技学院实验报告实验名称课程名称专业班级软件12K1学生姓名吴旭成绩学号1219xx020xx4指导老师刘老师实验日期…
王典学号Y20xx05009矩阵连乘实验报告一设计分析问题描述给定n个矩阵A1A2An其中Ai与Ai1是可乘的i12n1如何确定计…
攀枝花学院实验报告实验课程计算机算法实验实验项目矩阵连乘实验日期20xx49系数学与计算机学院班级软件工程姓名冯斌学号20xx10…
王典学号Y20xx05009矩阵连乘实验报告一设计分析问题描述给定n个矩阵A1A2An其中Ai与Ai1是可乘的i12n1如何确定计…
南京信息工程大学实验实习报告院计算机与软件学院专业软件工程年级20xx班次3姓名魏开阳学号20xx1344105一实验内容矩阵连乘…