数据结构课程设计报告n维矩阵乘法_第1页
数据结构课程设计报告n维矩阵乘法_第2页
数据结构课程设计报告n维矩阵乘法_第3页
数据结构课程设计报告n维矩阵乘法_第4页
数据结构课程设计报告n维矩阵乘法_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构课程设计报告n维矩阵乘法数据结构课程设计报告设计题目:n维矩阵乘法:AB1专计算机科学与技术计本学指导教师起止时间2007.X.3-2007.X.11学年第学期一、具体任务功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab1结果。分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,可完成2维矩阵的情况;3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功能。要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得

2、起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。二、软件环境MicrosoftVisualC+6.0三、问题的需求分析程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。当要对矩阵作进一步操作(AxB或AxB(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A|!=判断矩阵是否可逆,若矩阵的行列式|A|则提示该矩阵为不可逆的;若|A|!=0则求其逆矩阵

3、,并在终端显示其逆矩阵。四、算法设计思想及流程图1抽象数据类型ADTMatrixMulti数据对象:Da(I,j)|i1,2,3,n;j1,2,n;a(i,j)ElemSet,n为矩阵维数数据关系:Row,ColRow|=n-1Col|=n-1=输入矩阵维数n输入矩阵A,B输出矩阵维数nsystem(“pause”);通过键盘输入需对哪个矩阵求逆,求出相应该的逆阵,并显示求得的逆阵system(“pause”);若矩阵不可逆则返回主菜单case4:R=AxB并显示矩阵Rsystem(“pause”);case5:R=AxB(-1)显示矩阵Rsystem(“pause”);若B不可逆,则返回主菜

4、单case6:从指定文件中读入矩阵数据case0:exit(0);结果否五、源代码#include#include#include#include#include#include#defineYES#defineNOtypedeffloatElemType;ElemTypexxA;/矩阵AElemTypexxB;/矩阵BElemTypexxR;/矩阵R,用于存放运算结果ElemTypexxV;/矩阵V,存放逆矩阵intn=0;/矩阵维数intflag=-1;/标记voidswap(ElemTypexa,ElemTypexb)/交换记录a,b的值ElemTypec;c=xa;xa=xb;xb=c

5、;ElemTypexxCreateMatrix(intn)/创建n维矩阵,返回该矩阵inti,j;ElemTypexxM;(ElemTypexx)malloc(sizeof(ElemTypex)xn);if(M=NULL)exit(1);for(i=0;in;i+)x(M+i)(ElemTypex)malloc(sizeof(ElemType)xn);for(j=0;jn;j+)x(x(M+i)+j)0;returnM;ElemTypeMatrixDeterm(ElemTypexxM,intn)/x递归法求n维矩阵行列式的值,返回运算结果x/inti,j,k,l,s;ElemTypexxT1;

6、ElemTypexxT2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;ElemTypevalue=0;/运算结果for(i=0;in;i+)for(j=0;jn;j+)T1ij=Mij;T2ij=Mij;if(n=2)/若为2维矩阵,则直接运算并返回运算结果value=T200xT211-T201xT210;returnvalue;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

7、;elseT2ls=T1ik;s+;l+;value=value+ux(int)pow(-1,j)xMatrixDeterm(T2,n-1);/x行列式等于某一行的各个元素与其代数余子式的乘积之和x/returnvalue;intDinV(ElemTypexxM,ElemTypexxV)/x全选主元法求矩阵M的逆矩阵,结果存入矩阵V中x/inti,j,k;ElemTyped;ElemTypeu;intxJS,xIS;JS=(intx)malloc(sizeof(int)xn);IS=(intx)malloc(sizeof(int)xn);u=MatrixDeterm(M,n);/返回矩阵A的行

8、列式值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=fabs(Vij);/d记录绝对值最大的元素的值/x把绝对值最大的元素在数组中的行、列坐标分别存入ISK,JSKx/ISk=i;JSk=j;if(d+1.0=1.0)return0;/所有元素都为0if(ISk!=k)/x若绝对值最大的元素不在第k行,则将矩阵ISK行的元素与k行的元素相交换x/for(j=0;jn;j+)swap(&Vkj,&VISkj);

9、if(JSk!=k)/x若绝对值最大的元素不在第k列,则将矩阵JSK列的元素与k列的元素相交换x/for(i=0;in;i+)swap(&Vik,&ViJSk);Vkk=1/Vkk;/绝对值最大的元素求倒for(j=0;jn;j+)/x矩阵M第k行除元素Mkk本身外都乘以Mkkx/if(j!=k)Vkj=VkjxVkk;for(i=0;in;i+)/x矩阵除第k行的所有元素与第k列的所有元素外,都拿本身减去MikxMkj,其中i,j为元素本身在矩阵的位置坐标x/if(i!=k)for(j=0;jn;j+)if(j!=k)Vij=Vij-VikxVkj;for(i=0;i=0;k-)/x根据上面

10、记录的行ISk,列JSk信息恢复元素x/for(j=0;jn;j+)if(JSk!=k)swap(&Vkj,&VJSkj);for(i=0;in;i+)if(ISk!=k)swap(&Vik,&ViISk);free(IS);free(JS);return0;voidMultMatrix(ElemTypexxM1,ElemTypexxM2,ElemTypexxR)/x矩阵M1乘M2结果存入矩阵Rx/inti,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+M1ikxM

11、2kj;voidInput(ElemTypexxM)/输入矩阵M的各个元素值inti,j;charstr10;charc=A;if(flag=1)c=B;system(“cls“);printf(“nn输入矩阵%c(%dx%d)n“,c,n,n);for(i=0;in;i+)for(j=0;jn;j+)scanf(“%f“,x(M+i)+j);flag=1;gets(str);/吸收多余的字符voidPrint(ElemTypexxM)/显示矩阵M的各个元素值inti,j;printf(“t“);for(i=0;in;i+)for(j=0;jn;j+)printf(“%.3f“,Mij);pu

12、ts(“);printf(“tt“);intMenu_Select()charc;dosystem(“cls“);puts(“ttxxxxxxxxxxxxxn维矩阵乘法器xxxxxxxxxxxxx“);puts(“tt|1.通过键盘输入各项数据|“);puts(“tt|2.显示矩阵A,B|“);puts(“tt|3.矩阵求逆,并显示逆矩阵|“);puts(“tt|4.求矩阵运算AxB,并显示运算结果|“);puts(“tt|5.求矩阵运算AxB(-1),并显示运算结果|“);puts(“tt|6.从文件读入矩阵A,B与维数n|“);puts(“tt|0.退出|“);puts(“ttxxxxxx

13、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“);printf(“tt请选择(0-6):“);c=getchar();while(c6);return(c-0);voidReadFromFile()/从指定文件读入矩阵的维数及矩阵各元素的值inti,j;FILExfp;if(fp=fopen(“tx.txt“,“r“)=NULL)puts(“无法打开文件!“);system(“pause“);exit(0);fscanf(fp,“%d“,&n);/读入矩阵维数A=CreateMatrix(n);/创建矩阵AB=CreateMatrix(n);V=CreateMatrix(

14、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(“pause“);A=CreateMatrix(n);B=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);Input(A);Input(B);break;case2:system(“cls“);if(flag=-1)puts(“n

15、nt不存在任何矩阵数据,请先输入数据“);system(“pause“);break;puts(“n“);printf(“tA“);Print(A);puts(“n“);printf(“tB“);Print(B);puts(“);system(“pause“);break;case3:system(“cls“);if(flag=-1)puts(“nnt不存在任何矩阵数据,请先输入数据“);system(“pause“);break;for(;)printf(“nnt输入需要求逆的矩阵(A/B):“);h=getchar();c=getchar();/h=getchar();if(c=A|c=a

16、)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;elseif(c=B|c=b)i=DinV(B,V);if(i=-1)puts(“nnt矩阵B的行列式等于0,不可逆!“);system(“pause“);break;printf(“tB“);Print(B);puts(“n“);printf(“B(-1)“);Print(V);pu

17、ts(“);system(“pause“);break;elseputs(“nnt输入有误,请重新输入!n“);break;case4:system(“cls“);if(flag=-1)puts(“nnt不存在任何矩阵数据,请先输入数据“);system(“pause“);break;MultMatrix(A,B,R);printf(“nntAxB“);Print(R);puts(“);system(“pause“);break;case5:system(“cls“);if(flag=-1)puts(“nnt不存在任何矩阵数据,请先输入数据“);system(“pause“);break;i=

18、DinV(B,V);if(i=-1)puts(“nnt矩阵B的行列式等于0,不可逆!“);system(“pause“);break;MultMatrix(A,V,R);printf(“nnAxB(-1)“);Print(R);puts(“);system(“pause“);break;case6:system(“cls“);ReadFromFile();puts(“);system(“pause“);break;case0:puts(“tt正常退出“);exit(0);break;return0;六、运行结果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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论