C++课程设计实验报告姓名陈国杭学号915104330113班级9151043301任课教师赵琦时间3月选择题目矩阵转置及乘法运算难易级别A级实验报告成绩一、程序功能简介该程序定义了一个向量类,里面的元素是模板形式,定义了有关向量类的各种属性、方法及运算符重载函数。二、课程设计要求和目的1.利用已知的向量类对象定义一个矩阵类,矩阵类的数据是向量子对象,同样定义矩阵类的各种属性、方法及运算符重载函数。2.完善成员函数,使矩阵可以由文件输入,具体的输入格式自己规定。3.完善矩阵的赋值、转置、乘法等运算,要求用整形矩阵和浮点型矩阵分别演算。4.更改main函数结构,可由用户选择输入矩阵数据的方法,程序可以连续运行,知道选择退出为止。三、课程设计中要解决的问题分析和调试1.源程序只给出了菜单的样式,及函数类的格式。2.运算符重载函数要重新熟练。3.引用的头文件iostream(输入输出流)fstream(filestream)cmath(数学常用库函数)cstdlib(提供一些函数与符号常量)string(string类)。4.添加人性化界面,初始运行程序时加了一个友好的界面,并附带输出了自己的姓名和学号,选择退出时,亦有特别字样。5.在主函数中调用read()函数,通过read()中读取外部文件,但会内存错误(已解决,行和列的未定义。)。5.在进行四种不同的运算时均会询问输入方式,main函数利用switch函数进行主菜单的编辑。6.在矩阵输入中增加错误判断的功能,防止输入错误导致程序无法进行。7.程序中若输入的矩阵无法求逆,或者无法进行乘法,会直接退出程序,亟待解决四、源程序结构流程框图与说明六、源程序代码以及草稿原件#includeiostreamY选择退出作者:陈国杭学号:915104330113N进行运算开始进入程序主菜单:选择何种计算输入选择提示输入矩阵的方式输入选择键盘输入矩阵输出结果是否继续执行程序结束退出选择”5”矩阵是否符合要求YN#includefstream#includecmath#includecstdlib#includestringusingnamespacestd;templateclassT//模板函数classCMatrix{introw;intcol;T**a;public:CMatrix();//构造函数√CMatrix(intr,intc);CMatrix(constCMatrix&src);//拷贝构造函数√~CMatrix();//析构函数√CMatrix&operator=(constCMatrix&);CMatrixTzhuanzhi();//转置函数√CMatrixTqiuni();//求逆矩阵√CMatrixToperator*(constCMatrixT&m)const;//矩阵的乘法√CMatrixTshucheng(doublenum);//矩阵数乘√CMatrixTread(char*fileName);//从文件输入√voidinput();//从键盘输入√voidshow();//显示矩阵√};templateclassTCMatrixT::CMatrix(){row=0;col=0;a=NULL;}//构造函数templateclassTCMatrixT::CMatrix(intr,intc){row=r;col=c;inti,j;a=newT*[r];for(i=0;ir;i++)a[i]=newT[c];for(i=0;irow;i++)for(j=0;jcol;j++)a[i][j]=0.0;}//将数组归零templateclassTCMatrixT::CMatrix(constCMatrixT&m)//拷贝{row=m.row;col=m.col;inti,j;a=newT*[row];//动态建立二维数组for(i=0;irow;i++)a[i]=newT[col];for(i=0;irow;i++)//动态数组赋值for(j=0;jcol;j++)a[i][j]=m.a[i][j];}templateclassTCMatrixT::~CMatrix()//析构{for(inti=0;irow;i++)delete[]a[i];delete[]a;}templateclassTCMatrixT&CMatrixT::operator=(constCMatrixT&m)//等于{for(inti=0;irow;i++)delete[]a[i];delete[]a;row=m.row;col=m.col;a=newC*[row];for(inti=0;irow;i++)for(intj=0;jcol;j++)a[i][j]=m.a[i][j];return*this;}templateclassTCMatrixTCMatrixT::zhuanzhi()//转置{CMatrixm(col,row);for(inti=0;irow;i++)for(intj=0;jcol;j++)m.a[j][i]=a[i][j];returnm;}templateclassTCMatrixTCMatrixT::qiuni(){CMatrixs(1,1);s.a[0][0]=0;if(row!=col){cout输入的矩阵没有逆矩阵。\nendl;returns;};CMatrixt(row,col);CMatrixn(row,col);inti,j,k;floatmax,temp;for(i=0;irow;i++){for(j=0;jcol;j++){t.a[i][j]=a[i][j];}}for(i=0;irow;i++){for(j=0;jcol;j++){n.a[i][j]=(i==j)?1:0;}}for(i=0;irow;i++){max=t.a[i][i];k=i;for(j=i+1;jcol;j++){if(fabs(t.a[j][i])fabs(max)){max=t.a[j][i];k=j;}}if(k!=i){for(j=0;jcol;j++){temp=t.a[i][j];t.a[i][j]=t.a[k][j];t.a[k][j]=temp;temp=n.a[i][j];n.a[i][j]=n.a[k][j];n.a[k][j]=temp;}}if(t.a[i][i]==0){cout输入的矩阵没有逆矩阵。\n;returns;}temp=t.a[i][i];for(j=0;jcol;j++){t.a[i][j]=t.a[i][j]/temp;n.a[i][j]=n.a[i][j]/temp;}for(j=0;jcol;j++){if(j!=i){temp=t.a[j][i];for(k=0;kcol;k++){t.a[j][k]=t.a[j][k]-t.a[i][k]*temp;n.a[j][k]=n.a[j][k]-n.a[i][k]*temp;}}}}returnn;}templateclassTCMatrixTCMatrixT::operator*(constCMatrixT&m)const//重载乘法{CMatrixs(1,1);s.a[0][0]=0;CMatrixn(row,m.col);if(col!=m.row){returns;}for(inti=0;irow;i++)for(intj=0;jm.col;j++){for(intk=0;kcol;k++){n.a[i][j]+=a[i][k]*m.a[k][j];}}//题目所给的矩阵乘法算法returnn;}templateclassTCMatrixTCMatrixT::shucheng(doublenum)//数乘{CMatrixb(row,col);for(inti=0;irow;i++)for(intj=0;jcol;j++)b.a[i][j]=a[i][j]*num;returnb;}templateclassTCMatrixTCMatrixT::read(char*fileName)//从文件输入{ifstreaminfile;infile.open(fileName);Loop:if(!infile){infile.close();cout不能打开该文件endl;cout再次输入文件名:;cinfileName;infile.clear();infile.open(fileName);gotoLoop;//防止多次输错}introw;intcol;infilerowcol;CMatrixTm(row,col);//通过文件前两个数字作为行、列doublez;inti=0,j=0;while(infilez){m.a[i][j]=z;if((j+1)%col==0){j=0;i+=1;}//定义何时换行elsej+=1;}infile.close();returnm;}templateclassTvoidCMatrixT::input()//键盘输入矩阵{for(inti=0;irow;i++)for(intj=0;jcol;j++)cina[i][j];}templateclassTvoidCMatrixT::show()//显示矩阵{for(inti=0;irow;i++){for(intj=0;jcol;j++){couta[i][j];}coutendl;}}intmain(){intx,y;cout*********************欢迎使用矩阵计算器*********************endl;cout制作者:陈国杭学号:915104330113endl;cout主菜单endl;cout1.计算矩阵的转置endl;cout2.计算矩阵的逆endl;cout3.计算矩阵的乘法endl;cout4.计算矩阵的数乘endl;cout5.退出菜单endl;coutendl;qing:cout请选择一种正确的运算:;while(cinx){if(x==5){cout欢迎再次使用endl;break;}elseif(x5||x1){cout输入错误,请重新输入!endl;gotoqing;}coutendl;cout1.文件输入endl;cout2.键盘输入endl;coutendl;yxiu:cout请选择正确的输入方式:;ciny;if(y!=1&&y!=2){cout输入错误,请重新输入!endl;gotoyxiu;}coutendl;switch(x){case1:{if(y==1){charfilename[256];cout请输入文件名:;cinfilename;coutendl;CMatrixdoublem1;CMatrixdoublem2=m1.read(filename);CMatrixdoublem3=m2.zhuanzhi();cout原矩阵的转置矩阵为:\n;m3.show();}if(y==2){inth,l;cout请输入矩阵的行:;cinh;cout请输入矩阵的列:;cinl;cout请依次输入矩阵的值:;CMatrixdoublem1(h,l);m1.input();CMatrixdoublem2=m1.zhuanzhi();coutendl;cout原矩阵的转置矩阵为:\n;m2.show();}