C++课程设计报告矩阵乘法计算_c计算器课程设计报告
C++课程设计报告矩阵乘法计算由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c计算器课程设计报告”。
C++课程设计报告
一、题目名称:矩阵乘法计算
二、难易等级: A级
三、对题目的分析和注释:
分析:
依次建立两个矩阵空间并按照矩阵乘法规则进行运算。(矩阵的乘法规则:
1、矩阵的乘法运算必须符合m*n的矩阵与n*s的矩阵相乘。
2、第一个矩阵的第i行的元素依次乘以第二个矩阵的第j列元素后结果相加组成生成矩阵第i行第j列元素。)
注释:
(1)设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。
(2)修改程序结构,使程序可以反复执行,直至按键选择退出为止。
(3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[m][n]来放置数据,其中m,n为用户可输入的任意整数。
(4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化时赋值,也可以通过键盘赋值,还可以通过读取数据文件输入。
(5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序时,分别定义两个整型矩阵和两个浮点型矩阵进行乘法验证。
(6)完成矩阵的乘法运算,在运算之前判断这两个矩阵能否满足乘法运算的条件,若不满足,则给出提示信息。
四、所增加功能模块的设计
如果要说增加功能的话,自己编的程序里面不多,我只是按照题目要求,设计了一个矩阵类,同时用模板的形式改写矩阵数据类型和运算符的重载。
1、模板的使用
我使用了大量的模板,以T为模板参数,通过对T的不同类型的选择实现相应的运算处理。其中choose1()函数本是无参函数,为了方便模板化,给其赋以伪参数T,在执行时通过T的取值生成相应的函数模板。
template void choose1(T){ } 调用时:
switch(sjlx){
case 1:
{
choose1(1);
}break;
case 2:
{
choose1(0.0);
}break;
case 3:
{
choose1(1e-10);
}break;
default:cout
2、矩阵类的构造
按照课本要求采用二级指针动态开辟内存空间,节省内存使用; 其中数据结构如下:
Mat-->Mat[0]----->Mat[0][0] Mat[0][1] ……Mat[0][j]
Mat[1]----->Mat[1][0] Mat[1][1] ……Mat[1][j]
:
:
Mat[i]----->Mat[i][0] Mat[i][1] ……Mat[i][j] 实现构造的代码为:
template CMatrix::CMatrix(int row,int col){ int i,j;nRow=row,nCol=col;Mat=new T*[nRow];for(i=0;i
Mat[i]=new T[nCol];} cout
for(j=0;j
{
cout
cin>>Mat[i][j];
} }
3、运算符的重载
要实现矩阵间的乘法运算,有必要对其运算符进行重载。而乘法运算符又要针对不同数据类型进行运算,所以我对运算符重载函数模板化。template CMatrix operator*(CMatrix &mat1,CMatrix &mat2){ CMatrix mat3(mat1.nRow,mat2.nCol,0);for(int i=0;i
mat3.Mat[i][j]=0;
for(int k=0;k
mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];} return mat3;}
五、设计中遇到的主要问题及解决办法
1、无法实现文件输入
主要原因是输入之前调用的是默认构造函数,只是简单赋值,并未开辟内存空间,后来调用带参构造函数就可以正常输入数据;
2、重载乘法运算的函数无法重载
经检查发现,由于重载的是友元函数,函数不存在this指针,因此必须显式地调用两个相乘的矩阵类。
六、设计中尚存的不足
1、功能还不够强大,只能做简单的矩阵乘法,我所期望的是能够做各种混合运算,具有强大处理功能的实用程序,希望在以后的深入学习中可以改进。
2、关于异常处理这方面,我觉得处理功能也不是很行,觉得还是应该建立全面的异常检测与异常处理机制。
七、对设计的感想和心得体会
经过这几周的上机编程,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己上学期学习到的知识。这些都使我对计算机语言的学习有了更深入的认识。总之,通过这这几周的上机编程,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。像矩阵乘法计算问题这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。
实践出真知,做课程设计前,我的C++知识只是停留在理论水平,而且就算理论水平,也存在很多漏洞。有时,在做课题的时候,理论的漏洞冒了出来,我就只能在看着课本慢慢的再学习一遍,但有些东西还是没有搞懂,所以现在就又翻出课本,看着课本编程,也算是将旧的东西复习了一遍。同时,有的概念在编程过程中印象更加深刻。
成功=勤奋+合作。在课程设计这方面自己也花了好多时间,交流与合作在编程过程中给我很大的帮助,我得到了很多,每次看到解问题后大家的愉悦,我想大家应该与我一样收获很大吧。说真的,我挺喜欢这种讨论的氛围,它也让编程过程变得趣味横生,不再只是呆滞的盯着屏幕写程序。
对凡事都应当有毅力,不要中途放弃。在编程过程中,好几次遇到困难我都想再换一个别的程序或找同学拷一个程序,但我最终还是坚持下来了。永不言弃,你就一定会成功的。
磨刀不误砍柴工。在刚拿到任务时,书上的关键代码我也是看的一头雾水,后来我将上学期的课本认真研读一遍之后,感觉收获真的不少,接着编起程来就顺手好多了。
此次程序设计使我透彻地领悟到面向对象的程序设计的优点和强大生命力,特别是类和模板的使用,使程序的兼容性和扩展能力都大大加强,比如我们想要再做一个处理其他类型数据的矩阵的乘法计算,只需要添加一个相应的类型声明就可以利用模板迅速构造出来。
通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。另外某些具体的细节内容也是相当的重要。这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。这些经验对我以后的编程会有很大的帮助的,我要好好利用。
这次矩阵乘法计算问题课程设计让我充分认识到了自己的不足,认识到了动手能力的重要性。我会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础!