




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计报告设计题目: n维矩阵乘法:a b1专 业 机电一体化工程 班 级 10机电专接本 学 生 窦海 学 号 104910252055 指导教师 高在村 起止时间 2011年5月 20一、 具体任务功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab1结果。分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,可完成2维矩阵的情况;3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功能。要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提
2、供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。二、 软件环境microsoft visual c+ 6.0三、 问题的需求分析程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。当要对矩阵作进一步操作(a*b或a*b(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|a| != 0 判断矩阵是否可逆,若矩阵的行列式 |a
3、| = = 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 = row,col row = | 1 = i = n , 1 = j = n-1 col = | 1 = i = n-1 , 1 = j 0 ?是输入矩阵维数n输入矩阵a,b输出矩阵维数nsystem(“pause”);通过键盘输入需对哪个矩阵求逆,求出相应该的逆阵,并显示求得的逆阵system(“
4、pause”);若矩阵不可逆则返回主菜单case 4:r=a*b并显示矩阵r system(“pause”);case 5:是否是r=a*b(-1)显示矩阵rsystem(“pause”);若b不可逆,则返回主菜单case 6:从指定文件中读入矩阵数据case 0:exit(0);结果否五、 源代码#include #include #include #include #include #include #define yes 1#define no 0typedef float elemtype;elemtype *a; /矩阵aelemtype *b; /矩阵belemtype *r; /
5、矩阵r,用于存放运算结果elemtype *v; /矩阵v,存放逆矩阵int n=0; /矩阵维数int flag=-1; /标记void swap(elemtype *a,elemtype *b) /交换记录a,b的值elemtype c;c=*a;*a=*b;*b=c;elemtype *creatematrix(int n) /创建n维矩阵,返回该矩阵int i,j;elemtype *m;m = (elemtype *)malloc(sizeof(elemtype *)*n);if(m = null)exit(1);for(i=0;in;i+)*(m+i) = (elemtype *)
6、malloc(sizeof(elemtype)*n);for(j=0;jn;j+)*(*(m+i)+j) = 0;return m;elemtype matrixdeterm(elemtype *m,int n) /*递归法求n维矩阵行列式的值,返回运算结果*/int i,j,k,l,s;elemtype *t1;elemtype *t2;t1=creatematrix(n);t2=creatematrix(n);elemtype u;elemtype value=0; /运算结果for(i=0;in;i+)for(j=0;jn;j+)t1ij=mij;t2ij=mij;if(n=2) /若为
7、2维矩阵,则直接运算并返回运算结果value=t200*t211-t201*t210;return value;elsefor(j=0;jn;j+) /将矩阵的行列式以第一行展开u=t10j;for(i=1,l=0;in;i+) /求矩阵行列式的余子式m(0,j)for(k=0,s=0;kn;k+)if(k=j)continue;elset2ls=t1ik;s+;l+;value=value+u*(int)pow(-1,j)*matrixdeterm(t2,n-1); /*行列式等于某一行的各个元素与其代数余子式的乘积之和*/return value;int dinv(elemtype *m,
8、elemtype *v) /*全选主元法求矩阵m的逆矩阵,结果存入矩阵v中*/int i,j,k;elemtype d;elemtype u;int *js,*is;js=(int *)malloc(sizeof(int)*n);is=(int *)malloc(sizeof(int)*n);u=matrixdeterm(m,n); /返回矩阵a的行列式值if(u=0)return -1;for(i=0;in;i+)for(j=0;jn;j+)vij=mij;for(k=0;kn;k+)d=0;for(i=k;in;i+) /找出矩阵m从mkk开始绝对值最大的元素for(j=k;jd)d=fa
9、bs(vij); /d记录绝对值最大的元素的值/*把绝对值最大的元素在数组中的行、列坐标分别存入isk,jsk*/isk=i; jsk=j;if(d+1.0 = 1.0)return 0; /所有元素都为0if(isk != k) /*若绝对值最大的元素不在第k行,则将矩阵isk行的元素与k行的元素相交换*/for(j=0;jn;j+)swap(&vkj,&viskj);if(jsk!=k) /*若绝对值最大的元素不在第k列,则将矩阵jsk列的元素与k列的元素相交换*/for(i=0;in;i+)swap(&vik,&vijsk);vkk=1/vkk; /绝对值最大的元素求倒for(j=0;j
10、n;j+) /*矩阵m第k行除元素mkk本身外都乘以mkk*/if(j!=k) vkj=vkj*vkk;for(i=0;in;i+) /*矩阵除第k行的所有元素与第k列的所有元素外,都拿本身减去mik*mkj, 其中i,j为元素本身在矩阵的位置坐标*/if(i!=k) for(j=0;jn;j+)if(j!=k) vij=vij-vik*vkj; for(i=0;i=0;k-) /*根据上面记录的行isk,列jsk信息恢复元素*/for(j=0;jn;j+)if(jsk!=k) swap(&vkj,&vjskj);for(i=0;in;i+)if(isk!=k) swap(&vik,&viis
11、k);free(is);free(js);return 0;void multmatrix(elemtype *m1,elemtype *m2,elemtype *r) /*矩阵m1乘m2 结果存入矩阵r*/int i,j,k;for(i=0;in;i+)for(j=0;jn;j+)rij=0;for(i=0;in;i+)for(j=0;jn;j+)for(k=0;kn;k+)rij=rij+m1ik*m2kj;void input(elemtype *m) /输入矩阵m的各个元素值int i,j;char str10;char c=a;if(flag=1)c=b;system(cls);pr
12、intf(nn输入矩阵%c(%d*%d)n,c,n,n);for(i=0;in;i+)for(j=0;jn;j+)scanf(%f,*(m+i)+j);flag=1;gets(str); /吸收多余的字符void print(elemtype *m) /显示矩阵m的各个元素值int i,j;printf(t);for(i=0;in;i+)for(j=0;jn;j+)printf( %.3f,mij);puts();printf(tt);int menu_select()char c;dosystem(cls);puts(tt*n维矩阵乘法器*);puts(tt| 1. 通过键盘输入各项数据 |
13、);puts(tt| 2. 显示矩阵a,b |);puts(tt| 3. 矩阵求逆,并显示逆矩阵 |);puts(tt| 4. 求矩阵运算a*b,并显示运算结果 |);puts(tt| 5. 求矩阵运算a*b(-1),并显示运算结果|);puts(tt| 6. 从文件读入矩阵a,b与维数n |);puts(tt| 0. 退出 |);puts(tt*);printf(tt请选择(0-6):);c=getchar();while(c6);return (c-0);void readfromfile() /从指定文件读入矩阵的维数及矩阵各元素的值int i,j;file *fp;if(fp=fope
14、n(tx.txt,r)=null)puts(无法打开文件!);system(pause);exit(0);fscanf(fp,%d,&n); /读入矩阵维数a=creatematrix(n); /创建矩阵a b v rb=creatematrix(n);v=creatematrix(n);r=creatematrix(n);for(i=0;in;i+) /读入矩阵afor(j=0;jn;j+)fscanf(fp,%f,&aij); for(i=0;in;i+) /读入矩阵afor(j=0;j0)break;elseprintf(nt输入有误,请重新输入!n);puts();system(pau
15、se);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不存在任何矩阵数据,请先输入数据);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)put
16、s(nnt不存在任何矩阵数据,请先输入数据);system(pause);break;for(;)printf(nnt输入需要求逆的矩阵(a/b):);h=getchar();c=getchar();/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);puts(n);printf(a(-1) = );print(v);puts();system(pause);break;else if(c=b|c=b)i=dinv(b,v)
17、;if(i=-1)puts(nnt矩阵b的行列式等于0,不可逆!);system(pause);break;printf(tb = );print(b);puts(n);printf(b(-1) = );print(v);puts();system(pause);break;else puts(nnt输入有误,请重新输入!n);break;case 4: system(cls);if(flag=-1)puts(nnt不存在任何矩阵数据,请先输入数据);system(pause);break;multmatrix(a,b,r);printf(nnta*b = );print(r);puts();
18、system(pause);break;case 5: system(cls);if(flag=-1)puts(nnt不存在任何矩阵数据,请先输入数据);system(pause);break;i=dinv(b,v);if(i=-1)puts(nnt矩阵b的行列式等于0,不可逆!);system(pause);break;multmatrix(a,v,r);printf(nna*b(-1) = );print(r);puts();system(pause);break;case 6: system(cls);readfromfile();puts();system(pause);break;case 0: puts(tt正常退出);exit(0);break;return 0;六、 运行结果 1主界面:2输入6,回车,从文本文件tx.txt中读入矩阵数据:3回车,回到主菜单界面;输入2回车,显示从文件读入的矩阵数据:4回车,回到主菜单界面;输入3回车,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川省农产品购销合同范本
- 2025企业借款协议合同范本
- 2025 果园、草地承包合同
- 房屋租赁合同范本范本
- 政府采购委托合同范本
- 市区房按揭贷款购买合同
- 租房看房协议书范本
- 2025信息技术服务购销合同范本
- 2025专利权许可合同样本
- 2025年03月浙江丽水市龙泉市事业单位公开招聘工作人员70人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 如果历史是一群喵
- 人教版小学数学六下第六单元《统计与概率》单元集体备课整体教学设计
- 工业设计项目报价单模板
- 手术前呼吸功能评估
- 针灸优势病种
- 中华八大菜系-闽菜
- 基于单片机的恒压供水系统设计(附原理图、程序清单及外文翻译)
- 《中医诊断学课件》
- MQL4命令中文详解手册
- 保安外包服务投标方案(技术标)
- 2023年浙江杭州市属事业单位统一招聘工作人员371人笔试参考题库(共500题)答案详解版
评论
0/150
提交评论