1、 VoidShow(); /输出 VoidInputFromFile(); /从文件中输入矩阵 friend CMatrixoperator *(CMatrix &mat1,CMatrixmat2);/重载乘法;2、依照模板,在模板外依次定义相关的函数模板,再通过实例化建立相应的成员函数,同样方便快捷,避免了代码的冗长,程序层次清晰;templateCMatrix:CMatrix(int row,int col) /两个参数的构造函数 3、建立选择函数choose,实现程序的多态性,同时也简化了主函数的内容,主函数只需简单调用choose函数就能执行整个程序的相关功能;void choose(
2、) /数据类型选择函数 cout时间:2009年9月26日nendl作者:setw(32) 整型2 浮点型3 双精度型请选择数据类型:n; int sjlx; cinsjlx; switch(sjlx) case 1: choose1(1); break; case 2: choose1(0.0); case 3: choose1(1e-10); default:coutMat0 -Mat00 Mat01 Mat0j Mat1 -Mat10 Mat11 Mat1j : Mati -Mati0 Mati1 Matij实现构造的代码为: template int i,j; nRow=row,nCo
3、l=col; Mat=new T*nRow; for(i=0;inRow;i+) Mati=new TnCol;请输入数据: for(j=0;jnCol;j+) cout第i+1j+1Matij; 3、运算符的重载要实现矩阵间的乘法运算,有必要对其运算符进行重载。而乘法运算符又要针对不同数据类型进行运算,因此,对运算符重载函数模板化也是很有必要的。 operator* (CMatrixmat2) /矩阵乘法运算符重载 CMatrix mat3(mat1.nRow,mat2.nCol,0); for(int i=0;mat1.nRow; for(int j=0;mat2.nCol; mat3.M
4、atij=0; for(int k=0;kmat1.nCol;k+) mat3.Matij+=mat1.Matik*mat2.Matkj; return mat3;无论何种数据类型的矩阵,其乘法算法都是一致的,详见以上代码。4、数据的输入输出 本程序数据可以初始赋值也可以通过键盘输入,还可以从外部文件输入。键盘输入:文件输入:void CMatrixInputFromFile() /矩阵文件输入函数 ifstream infile; infile.open(daijp.txt,ios:nocreate); if(!infile) cout infile.close();矩阵的输出:Show()
5、 /矩阵输出函数Matijsetw(6);5、程序的菜单设计和异常处理 本程序主要是使用switch开关语句进行菜单设计,通过读取键入不同的值进入不同的子句执行入口,进而实现不同的功能。通过比较输入的两矩阵的行和列判断能否进行乘法运算,防止乱输入出现的异常。同时,本程序只是在主函数中使用了少量goto语句,并非滥用,非但没有使程序流程无规律,反倒使程序代码更加简洁,层次结构更加清晰。void main() /主函数loop: *n *n *nnn*您好,欢迎使用矩阵乘法计算程序!*n *n *nn choose();loop1:想继续执行吗?1.继续2.退出 int a;a; switch(a
6、) case 1:goto loop; break; case 2: cout非常感谢您的使用!欢迎不嗇赐教!联系方式:电话: 151QQ: 12345678按任意键退出 cin.get(); /去除缓冲区的回车符 exit(1); default: goto loop1;五、程序设计中遇到的主要问题及解决办法1、无法实现文件输入主要原因是输入之前调用的是默认构造函数,只是简单赋值,并未开辟内存空间,后来调用带参构造函数就可以正常输入数据;2、重载乘法运算的函数无法重载 经检查发现,由于重载的是友元函数,函数不存在this指针,因此必须显式地调用两个相乘的矩阵类。六、设计中尚存的不足1、功能还
7、不够强大,只能做简单的矩阵乘法,我所期望的是能够做各种混合运算,具有强大处理功能的实用程序,无奈所学知识有限,时间仓促;2、矩阵的输出还有一个问题,当矩阵的行数超过了窗口一行所能显示的数时,这时又该怎么来输出矩阵呢?3、关于异常处理这,我觉得处理功能也不是很行,觉得还是应该建立全面的异常检测与异常处理机制;七、设计的感想和心得体会1、本程序解皆系本人自主开发,开发过程自然十分艰辛,使我深深地懂得了软件版权保护的重要性;2、此次程序设计使我透彻地领悟到面向对象的程序设计的优点和强大生命力,特别是类和模板的使用,使程序的兼容性和扩展能力都大大加强,比如我们想要再做一个处理其他类型数据的矩阵的乘法计
8、算,只需要添加一个相应的类型声明就可以利用模板迅速构造出来;3、对凡事都应当有毅力,不要中途放弃。在开发过程中,好几次遇到困难我都想再换一个别的程序或找同学拷一个程序,但我最终还是坚持下来了。永不言弃,你就一定会成功的;4、磨刀不误砍柴工。在刚拿到任务时,书上的关键代码我也是看的一头雾水,后来我将上学期的课本认真研读一遍之后,感觉收获真的不少,接着编起程来就顺手好多了;5、通过这次程序设计,我相信我十月份的等级考试已经没多大问题了,哈哈修改后的程序(矩阵乘法计算)#includefstream.hiomanip.hstdlib.h /构造函数,从键盘输入矩阵 void Show(); /输出
9、void InputFromFile(); /重载乘法CMatrix() /缺省构造函数 nRow=100,nCol=100; Mat=new T*100;100; Mati=new T100;CMatrix(int row,int col,int k)/三个参数的构造函数 初始化赋值 键盘输入 文件输入 int srfs;请选择数据输入方式:srfs; switch(srfs) /用于选择不同的输入方式 CMatrixb; mata(a,b);请输入第二个矩阵的行数和列数:cd; if(b!=c) cout错误!两矩阵不能相乘! break; matb(c,d); matc(a,d,0); mata.Show(); matb.Show(); matc=mata*matb; cout CMatrix mata(a,b,0); if(b! matb(c,d,0); mata.InputFromFile(); matb.InputFromFile();欢迎不吝赐教!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1