




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+课程设计报告姓名 学号 班级0804 任课教师 时间 2009.9 教师指定题目 矩阵乘法计算 评定难易级别 A级 实验报告成绩 自评成绩:优 一、题目名称:矩阵乘法计算二、难易等级: A级三、程序设计思想1、建立矩阵类的类模板,通过实例化形成模板类,再实例化成矩阵对象,大大缩短了代码的长度,同时也方便了对象的建立;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); /构造函数,从键盘输入矩阵 VoidShow(); /输出 VoidInputFromFile(); /从文件中输入矩阵 friend CMatrixoperator *(CMatrix &mat1,CMatrix &mat2);/重载乘法;2、依照模板,在模板外依次定义相关的函数模板,再通过实例化建立相应的成员函数,同样方便快捷,避免了代码的冗长,程序层次清晰;templateCMatrix:CMatrix(int row,int col) /两个参数的构造函数 3、建立选择函数choose,实现程序的多态性,同时也简化了主函数的内容,主函数只需简单调用choose函数就能执行整个程序的相关功能;void choose() /数据类型选择函数cout时间:2009年9月26日nendl作者:setw(32)学号: setw(32)专业:电子技术endl;coutendl 整型endl 浮点型endl 双精度型endl;coutsjlx;switch(sjlx) case 1: choose1(1); break; case 2: choose1(0.0); break; case 3: choose1(1e-10); break; default:cout输入选择错误!endl;4、main函数中加入相关界面输出语句和程序结束语句,使程序更加人性化,并加入了异常处理语句,使程序运行的更加稳定可靠;四、程序增加功能及实现办法1、模板的使用本程序使用了大量的模板,譬如矩阵类模板、相关函数模板,以T为模板参数,通过对T的不同类型的选择实现相应的运算处理。其中choose1()函数本是无参函数,为了方便模板化,给其赋以伪参数T,在执行时通过T的取值生成相应的函数模板,真可谓方便!templatevoid choose1(T) /数据输入类型选择函数模板,其中T为伪参数,用于函数模板实例化调用时:switch(sjlx) case 1: choose1(1); /生成int型模板 break; case 2: choose1(0.0); /生成float型模板 break; case 3: choose1(1e-10); /生成double型模板 break; default:cout输入选择错误!Mat0 -Mat00 Mat01 Mat0j Mat1 -Mat10 Mat11 Mat1j : : Mati -Mati0 Mati1 Matij实现构造的代码为: templateCMatrix:CMatrix(int row,int col) /两个参数的构造函数int i,j;nRow=row,nCol=col;Mat=new T*nRow;for(i=0;inRow;i+)Mati=new TnCol;cout请输入数据:n;for(i=0;inRow;i+)for(j=0;jnCol;j+)cout第i+1j+1Matij;3、运算符的重载要实现矩阵间的乘法运算,有必要对其运算符进行重载。而乘法运算符又要针对不同数据类型进行运算,因此,对运算符重载函数模板化也是很有必要的。templateCMatrix operator* (CMatrix &mat1,CMatrix &mat2) /矩阵乘法运算符重载CMatrix mat3(mat1.nRow,mat2.nCol,0);for(int i=0;imat1.nRow;i+)for(int j=0;jmat2.nCol;j+)mat3.Matij=0;for(int k=0;kmat1.nCol;k+)mat3.Matij+=mat1.Matik*mat2.Matkj;return mat3;无论何种数据类型的矩阵,其乘法算法都是一致的,详见以上代码。4、数据的输入输出 本程序数据可以初始赋值也可以通过键盘输入,还可以从外部文件输入。键盘输入:cout请输入数据:n;for(i=0;inRow;i+)for(j=0;jnCol;j+)cout第i+1j+1Matij;文件输入:templatevoid CMatrix:InputFromFile() /矩阵文件输入函数ifstream infile;infile.open(daijp.txt,ios:nocreate);if(!infile)cout输入文件不存在,请先建立输入文件n;exit(0);for(int i=0;inRow;i+)for(int j=0;jMatij;infile.close();矩阵的输出:templatevoid CMatrix:Show() /矩阵输出函数int i,j;for(i=0;inRow;i+)coutendl;for(j=0;jnCol;j+)coutMatijsetw(6);coutendl;5、程序的菜单设计和异常处理 本程序主要是使用switch开关语句进行菜单设计,通过读取键入不同的值进入不同的子句执行入口,进而实现不同的功能。通过比较输入的两矩阵的行和列判断能否进行乘法运算,防止乱输入出现的异常。同时,本程序只是在主函数中使用了少量goto语句,并非滥用,非但没有使程序流程无规律,反倒使程序代码更加简洁,层次结构更加清晰。void main() /主函数loop:cout *n;cout *n; cout *; coutnnn*您好,欢迎使用矩阵乘法计算程序!*n;cout *n;cout *n;cout *nn; choose();loop1:cout想继续执行吗?endl1.继续endl2.退出a;switch(a) case 1:goto loop; break; case 2: cout非常感谢您的使用!endlendl欢迎不嗇赐教!endlendl联系方式:endl电话: 151endlQQ: 12345678endl; cout按任意键退出endl; cin.get(); cin.get(); /去除缓冲区的回车符 exit(1); default:cout输入选择错误!endl; goto loop1;五、程序设计中遇到的主要问题及解决办法1、无法实现文件输入主要原因是输入之前调用的是默认构造函数,只是简单赋值,并未开辟内存空间,后来调用带参构造函数就可以正常输入数据;2、重载乘法运算的函数无法重载 经检查发现,由于重载的是友元函数,函数不存在this指针,因此必须显式地调用两个相乘的矩阵类。六、设计中尚存的不足1、功能还不够强大,只能做简单的矩阵乘法,我所期望的是能够做各种混合运算,具有强大处理功能的实用程序,无奈所学知识有限,时间仓促;2、矩阵的输出还有一个问题,当矩阵的行数超过了窗口一行所能显示的数时,这时又该怎么来输出矩阵呢?3、关于异常处理这,我觉得处理功能也不是很行,觉得还是应该建立全面的异常检测与异常处理机制;七、设计的感想和心得体会1、本程序解皆系本人自主开发,开发过程自然十分艰辛,使我深深地懂得了软件版权保护的重要性;2、此次程序设计使我透彻地领悟到面向对象的程序设计的优点和强大生命力,特别是类和模板的使用,使程序的兼容性和扩展能力都大大加强,比如我们想要再做一个处理其他类型数据的矩阵的乘法计算,只需要添加一个相应的类型声明就可以利用模板迅速构造出来;3、对凡事都应当有毅力,不要中途放弃。在开发过程中,好几次遇到困难我都想再换一个别的程序或找同学拷一个程序,但我最终还是坚持下来了。永不言弃,你就一定会成功的;4、磨刀不误砍柴工。在刚拿到任务时,书上的关键代码我也是看的一头雾水,后来我将上学期的课本认真研读一遍之后,感觉收获真的不少,接着编起程来就顺手好多了;5、通过这次程序设计,我相信我十月份的等级考试已经没多大问题了,哈哈修改后的程序(矩阵乘法计算)#include#include#include#includetemplate class CMatrix /矩阵类的模板 T * * Mat; /矩阵的头指针 int nRow; /矩阵的行数 int nCol; /矩阵的列数public: CMatrix(); /缺省构造函数 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;i100;i+)Mati=new T100;templateCMatrix:CMatrix(int row,int col) /两个参数的构造函数int i,j;nRow=row,nCol=col;Mat=new T*nRow;for(i=0;inRow;i+)Mati=new TnCol;cout请输入数据:n;for(i=0;inRow;i+)for(j=0;jnCol;j+)cout第i+1j+1Matij;templateCMatrix:CMatrix(int row,int col,int k)/三个参数的构造函数nRow=row,nCol=col;Mat=new T*nRow;for(int i=0;inRow;i+)Mati=new TnCol;templatevoid CMatrix:Show() /矩阵输出函数int i,j;for(i=0;inRow;i+)coutendl;for(j=0;jnCol;j+)coutMatijsetw(6);coutendl;templatevoid CMatrix:InputFromFile() /矩阵文件输入函数ifstream infile;infile.open(daijp.txt,ios:nocreate);if(!infile)cout输入文件不存在,请先建立输入文件n;exit(0);for(int i=0;inRow;i+)for(int j=0;jMatij;infile.close();templateCMatrix operator* (CMatrix &mat1,CMatrix &mat2) /矩阵乘法运算符重载CMatrix mat3(mat1.nRow,mat2.nCol,0);for(int i=0;imat1.nRow;i+)for(int j=0;jmat2.nCol;j+)mat3.Matij=0;for(int k=0;kmat1.nCol;k+)mat3.Matij+=mat1.Matik*mat2.Matkj;return mat3;templatevoid choose1(T) /数据输入类型选择函数模板,其中T为伪参数,用于函数模板实例化 cout 初始化赋值endl 键盘输入endl 文件输入endl; int srfs; coutsrfs; switch(srfs) /用于选择不同的输入方式 case 1: CMatrix mata,matb,matc; break; case 2: int a,b,c,d; cout请输入第一个矩阵的行数和列数:ab; CMatrix mata(a,b); cout请输入第二个矩阵的行数和列数:cd;if(b!=c)cout错误!两矩阵不能相乘!n;break; CMatrix matb(c,d); CMatrix matc(a,d,0); mata.Show(); matb.Show(); matc=mata*matb;cout两矩阵相乘结果为:n; matc.Show(); break; case 3: int a,b,c,d; cout请输入第一个矩阵的行数和列数:ab; CMatrix mata(a,b,0); cout请输入第二个矩阵的行数和列数:cd; if(b!=c)cout错误!两矩阵不能相乘!n;break; CMatrix matb(c,d,0); CMatrix matc(a,d,0);mata.InputFromFile();matb.InputFromFile(); mata.Show(); matb.Show(); matc=mata*matb;cout两矩阵相乘结果为:n; matc.Show(); break;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 伏安分析法试题及答案
- 2025年白城市镇赉县公安局选调事业编制人员的模拟试卷及一套答案详解
- 湖南省名校联盟2026届新高三起点检测数学试卷 含解析
- 市场部物料管理课件
- 工装衣服知识培训课件
- 工程问题趣味课件
- 工程造价专业试讲课件
- 二零二五年第三章国际服务贸易政策操作规范
- 农村特色文化保护与发展合作合同
- 工程考试课件教学
- GB/T 9123-2010钢制管法兰盖
- 09S304 卫生设备安装图集
- 酸雾抑制剂化学品安全技术说明书
- 重点监管的危险化学品名录(完整版)
- 解三角形专题 - (解析版)
- 高等教育心理学学习提纲整理
- 桩基施工安全检查表
- 水玻璃有机酯自硬砂工艺简介
- 2022年公司管理制度发布流程
- XXX医院管道护理工作总结
- 超清地质年代表
评论
0/150
提交评论