矩阵乘法计算实验报告_第1页
矩阵乘法计算实验报告_第2页
矩阵乘法计算实验报告_第3页
矩阵乘法计算实验报告_第4页
矩阵乘法计算实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE11C++课程设计实验报告姓名:陈钱学号:913116120316班级:材科三班题目:矩阵乘法计算难易级别:A级实验报告成绩指导教师时间:年月日1程序功能介绍编写实现矩阵乘法计算的程序。2程序设计要求设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。修改程序结构,使程序可以反复执行,直至按键选择退出为止。本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[M][N]来放置数据,其中M,N为用户可输入的任意整数。增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以通过键盘赋值,还可以通过读数据文件输入。用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行乘法验证。完成矩阵的乘法运算,在运算之前判断着两个矩阵是否满足运算条件,如果不满足,给出提示信息。3程序设计思想1)类的结构该矩阵类的定义是将相关的数据和操作封装起来,用于实现乘法运算的矩阵要有两个矩阵类参与,结果放在另一个矩阵类的对象中,建议重载运算符*,并把这个重载函数定义为类的友元函数。参考的类的机构如下:#include<iostream.h>#include<fstream.h>#include<iomanip.h>#include<stdlib.h>template<classT>classCMatrix{ T**Mat;//矩阵的头指针 intnRow;//矩阵的行数 intnCol;//矩阵的列数public: CMatrix();//缺省的构造函数 CMatrix(T**mat,introw,intcol);//构造函数 CMatrix(introw,intcol);//构造函数 CMatrix(introw,intcol,intk);//构造函数,从键盘输入矩阵 voidShow();//输出 voidInputFromFile();//从文件输入矩阵 friendCMatrix<T>operator*(CMatrix<T>&mat1,CMatrix<T>&mat2);//重载乘法};4实际运行程序如下:#include<iostream.h>#include<fstream.h>#include<iomanip.h>#include<stdlib.h>template<classT>classCMatrix{ T**Mat;//矩阵的头指针 intnRow;//矩阵的行数 intnCol;//矩阵的列数public: CMatrix();//缺省的构造函数 CMatrix(T**mat,introw,intcol);//构造函数 CMatrix(introw,intcol);//构造函数 CMatrix(introw,intcol,intk);//构造函数,从键盘输入矩阵 voidShow();//输出 voidInputFromFile();//从文件输入矩阵 friendCMatrix<T>operator*(CMatrix<T>&mat1,CMatrix<T>&mat2);//重载乘法};template<classT>CMatrix<T>::CMatrix()//缺省的构造函数{ nRow=100,nCol=100; Mat=newT*[100]; for(inti=0;i<100;i++) { Mat[i]=newT[100]; }}template<classT>CMatrix<T>::CMatrix(introw,intcol)//两个参数的构造函数{ inti,j; nRow=row,nCol=col; Mat=newT*[nRow]; for(i=0;i<nRow;i++) { Mat[i]=newT[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<classT>CMatrix<T>::CMatrix(introw,intcol,intk)//三个参数的构造函数{ nRow=row,nCol=col; Mat=newT*[nRow]; for(inti=0;i<nRow;i++) { Mat[i]=newT[nCol]; }}template<classT>voidCMatrix<T>::Show()//矩阵输出函数{ inti,j; for(i=0;i<nRow;i++) { cout<<endl; for(j=0;j<nCol;j++) cout<<Mat[i][j]<<setw(6); } cout<<endl;}template<classT>voidCMatrix<T>::InputFromFile()//矩阵文件输入函数{ ifstreaminfile; infile.open("daijp.txt",ios::nocreate); if(!infile) { cout<<"输入文件不存在,请先建立输入文件\n"; exit(0); } for(inti=0;i<nRow;i++) for(intj=0;j<nCol;j++) { infile>>Mat[i][j]; } infile.close();}template<classT>CMatrix<T>operator*(CMatrix<T>&mat1,CMatrix<T>&mat2)//矩阵乘法运算符重载{ CMatrix<T>mat3(mat1.nRow,mat2.nCol,0); for(inti=0;i<mat1.nRow;i++) for(intj=0;j<mat2.nCol;j++) { mat3.Mat[i][j]=0; for(intk=0;k<mat1.nCol;k++) mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j]; } returnmat3;}template<classT>voidchoose1(T)//数据输入类型选择函数模板,其中T为伪参数,用于函数模板实列化{ cout<<"<1>初始化赋值"<<endl<<"<2>键盘输入"<<endl<<"<3>文件输入"<<endl; intsrfs; cout<<"请选择输入方式:\n"; cin>>srfs; switch(srfs)//用于选择不同的输入方式 { case1: { CMatrix<T>mata,matb,matc; }break; case2: { inta,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; case3: { inta,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; }}voidchoose()//数据类型选择函数 { cout<<"时间:2014年3月22号"<<endl<<"姓名:陈钱"<<setw(32)<<"学号:913116120316"<<setw(32)<<"班级:材科三班"<<endl; cout<<endl<<"<1>整型!"<<endl<<"<2>浮点型!"<<endl<<"<3>双精度型!"<<endl; cout<<"选择数据类型:\n"; intsjlx; cin>>sjlx; switch(sjlx) { case1: { choose1(1); }break; case2: { choose1(0.0); }break; case3: { choose1(1e-10); }break; default:cout<<"输入选择错误!"<<endl; } cout<<endl; } voidmain()//主函数部分 {loop: cout<<"*******************************\n"; cout<<"*******************************\n"; cout<<"\n\n\n**********************欢迎使用!********************\n"; cout<<"***********\n"; cout<<"*******************************\n\n"; choose();loop1: cout<<"是否继续执行?"<<endl<<"1.继续!"<<endl<<"2.退出!"<<endl; inta; cin>>a; switch(a) { case1:gotoloop; break; case2: { cout<<"谢谢使用!"<<endl; cout<<"按任意键退出!"<<endl; cin.get(); cin.get();//去除缓冲区的回车符 exit(1); } default:cout<<"输入选择错误!"<<endl; gotoloop1; } }5运行结果如下:************************************************欢迎使用!********************时间:2014年3月22号姓名:陈钱学号:913116120316班级:材科三班<1>整型!<2>浮点型!<3>双精度型!选择数据类型:1<1>初始化赋值<2>键盘输入<3>文件输入请选择输入方式:2输入第一个矩阵的行数和列数:33请输入数据:第[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输入第二个矩阵的行数和列数:33请输入数据:第[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]个数据:1123456789987654321两矩阵相乘结果为:30241884695413811490是否继续执行?1.继续!2.退出!1************************************************************************************欢迎使用!**************************************************************时间:2014年3月22号姓名:陈钱学号:913116120316班级:材科三班<1>整型!<2>浮点型!<3>双精度型!选择数据类型:3<1>初始化

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论