1、数据结构课程设计报告n维矩阵乘法 数据结构 课程设计报告 设计题目:n维矩阵乘法:A B1 专 业 计算机科学与技术 班 级 计本 学 生 学 号 指导教师 起止时间 2023.X.3-2023.X.11 学年第 I 学期 一、 具体任务 功能: 设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab1结果。 分步实施: 1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2.完成最低要求:建立一个文件,可完成2维矩阵的情况; 3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功能。 要求: 1.界面友好,函数功能要划分好 2.总体设
2、计应画一流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.据存在那么提示用户先输入相关数据。 当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A| != 0 判断矩阵是否可逆,假设矩阵的行列式 |A| = = 0 那么提示该矩阵为不可逆的;假设 |A| !=0 那么求其逆矩阵,并在终端显示其逆矩阵。 四、 算法设计思想及流程图 1抽象数据类型 ADT MatrixMulti 数据对象:D = a(I,j)|i = 1,2,3,n;j = 1,2,n;a(i,j)ElemSet,n示矩阵R system(“pause);假设B不可逆,那么返回主菜单 case 6: 从指定文件中读入矩
3、阵数据 case 0: exit(0); 结果 否 五、 源代码 #include #include #include #include #include #include #define YES 1 #define NO 0 typedef float ElemType; ElemType xxA; /矩阵A ElemType xxB; /矩阵B ElemType xxR; /矩阵R,用于存放运算结果 ElemType xxV; /矩阵V,存放逆矩阵 int n=0; /矩阵维数 int flag=-1; /标记 void swap(ElemType xa,ElemType xb) /交换记
4、录a,b的值 ElemType c; c=xa; xa=xb; xb=c; ElemType xxCreateMatrix(int n) /创立n维矩阵,返回该矩阵 int i,j; ElemType xxM; M = (ElemType xx)malloc(sizeof(ElemType x)xn); if(M = NULL) exit(1); for(i=0;id) d=fabs(Vij); /d记录绝对值最大的元素的值 /x把绝对值最大的元素在数组中的行、列坐标分别存入ISK,JSKx/ ISk=i; JSk=j; if(d+1.0 = 1.0) return 0; /所有元素都为0 i
5、f(ISk != k) /x假设绝对值最大的元素不在第k行,那么将矩阵ISK行的元素与k行的元素相交换x/ for(j=0;j=0;k-) /x根据上面记录的行ISk,列JSk信息恢复元素x/ for(j=0;j6); return (c-0); void ReadFromFile() /从指定文件读入矩阵的维数及矩阵各元素的值 int i,j; FILE xfp; if(fp=fopen(“tx.txt“,“r“)=NULL) puts(“无法翻开文件!“); system(“pause“); exit(0); fscanf(fp,“%d“,&n); /读入矩阵维数 A=CreateMatr
6、ix(n); /创立矩阵A B V R B=CreateMatrix(n); V=CreateMatrix(n); R=CreateMatrix(n); for(i=0;i0) break; else printf(“nt输入有误,请重新输入!n“); puts(“); system(“pause“); A=CreateMatrix(n); B=CreateMatrix(n); V=CreateMatrix(n); R=CreateMatrix(n); Input(A); Input(B); break; case 2: system(“cls“); if(flag=-1) puts(“nnt
7、不存在任何矩阵数据,请先输入数据“); system(“pause“); break; puts(“n“); printf(“tA = “); Print(A); puts(“n“); printf(“tB = “); Print(B); puts(“); system(“pause“); break; case 3: system(“cls“); if(flag=-1) puts(“nnt不存在任何矩阵数据,请先输入数据“); system(“pause“); break; for(;) printf(“nnt输入需要求逆的矩阵(A/B):“); h=getchar(); c=getchar
8、(); /h=getchar(); if(c=A|c=a) i=DinV(A,V); if(i=-1) puts(“nnt矩阵A的行列式等于0,不可逆!“); system(“pause“); break; printf(“tA = “); Print(A); else puts(“nnt输入有误,请重新输入!n“); break; case 4: system(“cls“); if(flag=-1) puts(“nnt不存在任何矩阵数据,请先输入数据“); system(“pause“); break; MultMatrix(A,B,R); printf(“nntAxB = “); Prin
9、t(R); puts(“); system(“pause“); break; case 5: system(“cls“); if(flag=-1) puts(“nnt不存在任何矩阵数据,请先输入数据“); system(“pause“); break; break; case 6: system(“cls“); ReadFromFile(); puts(“); system(“pause“); break; case 0: puts(“tt正常退出“); exit(0); break; return 0; 六、 运行结果 1主界菜单界面,输入0回车,退出程序;如果需要自定矩阵维数及各元素值,请
10、利用主菜单里的1号功能自行输入数据,再进行以上几种运算操作。 七、 收获及体会 通过这次课程设计,让我再次复习了线性代数里矩阵的相关知识,比方n维矩阵的求逆、矩阵可逆的充分必要条件|A| != 0、矩阵与矩阵的乘法运算、行列式求值方法等。同样的,还让我复习了大量C语言里有关数组的一些重要概念,比方多维数组的动态分配问题、数组与指针的关系等。 记得在这个学期新开设的单片机根底课上,吴涛老师曾屡次强调,让我们一定要经常锻炼自己的编程能力,他常对我们说:“编程是思维的体操。尽管我在这方面的能力 和实力非常得有限,也远远不及班上的其他同学,但我通过这次课程设计充分体会到了这句话的精华。 程序作为人体大脑思维的延伸,程序的功能也会因为大脑思维的不断完善而变得更加强大,所以我决定今后要加强在这方面的锻炼和学习,以此来鼓励自己不断前进! 八、 参考文献 数据结构C语言版 严蔚敏,吴伟民 编著 清华大学出版社 C语言程序设计 洪维恩 编著 中国铁道出版社 C语言程序设计教程 谭浩强 张基温 唐永炎 编著 高等教育出版社 工程数学线性代数 第四版同济大学应用数学系 编 高等教育出版社 计本 2023-12