1、课程设计任务书20122013学年第一学期课程设计名称: 数据结构课程设计 课程设计题目: 矩阵的加减乘运算 完 成 期 限:自 2012年 12 月10日至 2012年 12 月 21 日共 2 周设计内容: 加、减、乘法运算是矩阵的基本运算。由键盘任意输入的两个矩阵,对运算的合法性进行判断,根据判断结果作出相应处理。矩阵存储、原始矩阵和矩阵运算结果的输出需采用合适的形式。设计要求:1.遵循结构化程序设计思想编程实现,附必要注释。 2.界面友好,操作简便,容错性好。指导教师:李婧 教研室负责人:郑坤课程设计评阅评语: 指导教师签名: 年 月 日摘 要设计了一个矩阵运算系统,该矩阵运算系统具有
2、普通矩阵的相加、相减、相乘等功能。本运算系统以Microsoft Visual C+ 6.0作为系统开发工具,采用算法表达式处理算法来实现矩阵的加、减、乘运算。系统操作简单,界面清晰,易于为用户所接受。关键词:矩阵; 二维数组;VC+6.0目 录1 课题描述12 需求分析23 概要设计34 详细设计45程序编码66 程序调试及测试127 结果分析158 总结16参考文献171 课题描述数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还
3、能够提高实动手力。为学生后继课程的学习打下良好的基础。本次课设的设计内容是矩阵的相加,相减,相乘运算。由键盘任意输入两个矩阵,对运算的合法性进行判断,根据判断结果作出相应处理。经过分析后可以发现虽然计算存在规律,但是输入数据没有规律。所以我就将其设计为一个循环运算的程序,这样我就把没有规律的数据有规律的存放在连续的内存单元中。设计的过程中要遵循结构化程序设计思想,必要时附上相应的注释。此程序的功能可以分解为三个大的部分,第一部分就是实现数据的输入与对合法性的判断;第二部分就是实现两个矩阵的加减乘运算以及结果的保存;第三部分的功能就是实现对第二部分运算结果的输出显示。通过本次课设,可以使我们对程
4、序的调试方法及思想有更进一步的理解。并且让我们学会了使用一些编程技巧,使学我们养成良好的编程习惯。2 需求分析1).数据由用户从键盘输入,要求用户进行输入选择再进行运算,界面要求简约。2).实现矩阵的存储,输出,计算的功能。3).运算系统包括矩阵的加减和乘运算,要求用户必须可以输入任何矩阵并可以实现用户需求。3 概要设计这次试验主要运用Microsoft Visual C+ 6.0编译工具,使用C语言进行编程。首先通过C语言考虑到用户的界面,使用选择界面进行操作。然后在输入矩阵的时候采用二维数组的方法实现存储并按照格式输出,这样可以实现简约美。在循环的时候采用内外嵌套循环使用使运算可以更加清楚
5、。因为考虑到加减运算法则一致所以采用了加减同时运算,乘法分开运算然后可以符合用户需求,在进行判断的时候必须在输入的时候就提前先进行判断,然后在输入两个矩阵之后在进行矩阵运算法则的判断。运算完成之后可以继续选择运算不至于跳出又要重复启动程序,最后会选择退出。演示程序以用户和计算机对话的方式执行,即在计算机的终端上的“信息提示”下进行相关的数据的输入和操作。4 详细设计此程序的功能可以分解为三个大的部分,第一部分就是实现数据的输入与对合法性的判断;第二部分就是实现两个矩阵的加减乘运算以及结果的保存;第三部分的功能就是实现对第二部分运算结果的输出显示。本程序用数组存储的方式建立矩阵,最终利用菜单来选
6、择是进行相加还是相减或相乘运算,在输入每个数据前都先对其进行判断,若有错则提示重新输入,若无错将继续进行。该程序的流程图如图所示:图4.1 矩阵运算主流程图图4.2 加法运算流程图5程序编码#include #define M 40 #define N 40 float AMN; float BMN; float CMN; int i,j,m,n,p,q,k; int main() printf( #n); printf( # 欢迎您使用矩阵计算器系统。 #n); printf( # 系统功能: #n); printf( # 矩阵的加减乘运算; #n); printf( #nn); int x
7、;doprintf(请选择您需要的运算,若退出则选择0后按回车键结束n); printf(*n); printf(0,退出 n); printf(1,矩阵相加减n); printf(2,矩阵相乘n);printf(*n); scanf(%d,&x); switch (x) case 0:printf(谢谢您使用该系统!);break; /退出系统case 1: /选择加法运算 printf(请输入矩阵A的行数和列数(用逗号隔开):); scanf(%d,%d,&i,&j); while(i=0|j=0)printf(*对不起,您输入有误,请重新输入.*nn);printf(请输入矩阵A的行数和
8、列数(用逗号隔开):); scanf(%d,%d,&i,&j); printf(请输入矩阵B的行数和列数(用逗号隔开):) ; scanf(%d,%d,&m,&n); while(m=0|n=0)printf(*对不起,您输入有误,请重新输入.*nn);printf(请输入矩阵B的行数和列数(用逗号隔开):); scanf(%d,%d,&m,&n); while(i!=m|j!=n)/判断是否满足加法运算条件:既两个矩阵的行、列数是否相等 printf(*对不起,您输入的两个矩阵不能相加减,两个矩阵的行列数必须相等,请重新输入.*nn);printf(请输入矩阵A的行数和列数(用逗号隔开):)
9、; scanf(%d,%d,&i,&j); printf(请输入矩阵B的行数和列数(用逗号隔开):) ; scanf(%d,%d,&m,&n); printf(请输入矩阵A:n);/输入矩阵A的元素 for(p=0;pi;p+) for(q=0;qj;q+) scanf(%f,&Apq); printf(输出矩阵A:n); /输出矩阵Afor(p=0;pi;p+) for(q=0;qj;q+) printf(%10.2f,Apq); if(q+1)%j=0) printf(n); printf(请输入矩阵B:n); /输入矩阵B的元素for(p=0;pi;p+) for(q=0;qj;q+)
10、scanf(%f,&Bpq); printf(输出矩阵B:n);/输出矩阵B for(p=0;pi;p+) for(q=0;qj;q+) printf(%10.2f,Bpq); if(q+1)%j=0) printf(n); printf(“n运算结果如下:nn”);printf(矩阵A+矩阵B为:n); /进行两个矩阵相加计算 for(p=0;pi;p+) for(q=0;qj;q+) Cpq=Apq+Bpq; for(p=0;pi;p+) for(q=0;qj;q+) printf(%10.2f,Cpq); if(q+1)%j=0) printf(n); printf(矩阵A-矩阵B为:n
11、); /计算两个矩阵相减 for(p=0;pi;p+) for(q=0;qj;q+) Cpq=Apq-Bpq; for(p=0;pi;p+) for(q=0;qj;q+) printf(%10.2f,Cpq); if(q+1)%j=0) printf(n); ;break; case 2:/选择乘法运算 printf(请输入矩阵A的行数和列数(用逗号隔开):); scanf(%d,%d,&i,&j); while(i=0|j=0)printf(*对不起,您输入有误,请重新输入.*nn);printf(请输入矩阵A的行数和列数(用逗号隔开):); scanf(%d,%d,&i,&j); prin
12、tf(请输入矩阵B的行数和列数(用逗号隔开):) ; scanf(%d,%d,&m,&n); while(m=0|n=0)printf(*对不起,您输入有误,请重新输入.*nn);printf(请输入矩阵B的行数和列数(用逗号隔开):); scanf(%d,%d,&m,&n); while(j!=m|n!=i)/判定两个矩阵能否相乘:A的列数必须等于B的行数 printf(*对不起,您输入的两个矩阵不能相乘,B矩阵的行数必须和A矩阵的列数相等,请重试.*n);printf(请输入矩阵A的行数和列数(用逗号隔开):); scanf(%d,%d,&i,&j); printf(请重新输入矩阵B的行数
13、和列数(用逗号隔开):n) ; scanf(%d,%d,&m,&n);printf(请输入矩阵A:n);/输入矩阵A的元素 for(p=0;pi;p+) for(q=0;qj;q+) scanf(%f,&Apq); printf(输出矩阵A:n);/输出矩阵Afor(p=0;pi;p+) for(q=0;qj;q+) printf(%10.2f,Apq); if(q+1)%j=0) printf(n); printf(请输入矩阵B:n);/输入矩阵B的元素 for(p=0;pm;p+) for(q=0;qn;q+) scanf(%f,&Bpq); printf(输出矩阵B:n);/输出矩阵B
14、for(p=0;pm;p+) for(q=0;qn;q+) printf(%10.2f,Bpq); if(q+1)%n=0) printf(n); printf(nn运算结果如下:nn);printf(矩阵A*矩阵B为:n); /计算两个矩阵相乘for(p=0;pi;p+) for(q=0;qn;q+)Cpq = 0;for( k = 0; k j; k+ )Cpq+=Apk*Bkq; for(p=0;pi;p+) for(q=0;qn;q+) printf(%10.2f,Cpq); if(q+1)%n=0) printf(n); ;break; default:printf(errorn);
15、break; while(x);/当选择0时程序结束return 0;6 程序调试及测试6.1 程序调试1)使用Microsoft visual c+ 编辑软件进行源程序的编写。2)使用Microsoft visual c+软件进行编译,步骤:单击“组建”选择“编译”。3)使用Microsoft visual c+运行程序并调试,步骤:单击“组建”选择“执行”。6.2 运行及编译连接过程1)开始运行程序如图6.1图6.1 界面选择菜单2)首先进行选择,先选1号进行加法减法运算当输入负值时,提示你重新输入,或者两个矩阵进行加减运算时,矩阵的行列数应该相等,否则提示重新输入,界面如图6.2图6.2
16、 合法性判断界面3)当输入的数符合程序时,则先先把两个矩阵分别输出到屏幕上,随后计算出加减的结果,具体数字如图6.3所示图6.3 加减运算界面4)矩阵相乘的结果如图6.4所示图6.4 乘法运算界面5)当选择0时,则退出程序如图6.5图6.5 退出程序界面7 结果分析矩阵的设计虽然不是很难,但由于设计一个好的矩阵要考虑很多问题,因此比较的繁琐以致使源程序比较长,也因此导致了很多的语法错误和逻辑错误。错误一般有等号与赋值号的混淆,大括号的不匹配,头文件的不正确包含,变量的不定义使用但语法错误不像逻辑错误那样很难发现,它可以根据编译环境的提示和一些经验便可以很快解决。因此语法错误修改不是这次课程设计
17、的难点,而逻辑修改才是这次设计最难且花时间最多的地方。在程序的运行过程中,如果输入超出边界的值时,刚开始会出现错误,经过同学的帮助加入来了一些限定范围的语句和提示,这样程序就会更加的方便的使用了。程序还有一点感觉不合适的地方就是运算的的时候,不能加减乘运算同时进行,这是因为存储方式的不同,因为考虑到运法则的问题,此类运算分开也比较合理所以就进行了选择运算。还有就是在矩阵相乘时,两个矩阵的输出不同,需注意代码的实现。程序初步完成以后,进行测试发现出现死循环,观察显示结果发现,while循环里面的if语句实现方法错误,只能实现一次就跳出,其后的语句都会被忽略而得不到执行,最后采用while循环修改
18、,正确写法见源程序。8 总结这次矩阵运算的程序设计不仅让我对C语言的熟悉程度上升到了另一个高度,更加熟练的运用C语言,而且在一定意义上对面向对象设计的理解更加深刻了,是我学习C语言的过程中一次进步。在这个过程中,我对编程语言有了一个新的认识。对这些知识也有更深的理解和很好的掌握的同时,通过课程设计,明白到了原来开发一个小小的实用系统,是需要考虑到很多方面的问题的,这些都是要在实践中摸索的,当看着一个个矩阵运算的结果出现在自己面前时,心中泛起激动的涟漪,原来编程也不是那么遥不可及,编程也富有趣味性,并且从中能让我收获更多的实践知识,挺高自己学习C语言和编程的能力。 参考文献1 李春葆.数据结构习题与解析M(C语言版).北京:清华大学出版社,20022 谭浩强.C 程序设计教程M.北京:清华大学出版社,20073 苏仕民.数据结构课程设计.北京:机械工业出版社,20054 陈维兴、林小茶.C+面向对象程序设计教程.北京:清华大学出版社,20095 严蔚敏、吴伟民.数据结构(C语言版).北京:清华大学出版社,20076 徐孝凯.数据结构实用教程(C/C+描述)M.北京:清华大学出版社,1999