版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1数据结构课程设计报告n维矩阵乘法数据结构课程设计报告设计题目:n维矩阵乘法:AB-1专业计算机科学与技术班级计本学生学号指导教师起止时间20XX.X.3-20XX.X.11学年第I学期一、具体任务功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab-1结果。分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,可完成2维矩阵的情况;3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功能。要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。二、软件环境MicrosoftVisualC++6.0三、问题的需求分析程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。当要对矩阵作进一步操作(AxB或AxB^(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A|!=0判断矩阵是否可逆,若矩阵的行列式|A|==0则提示该矩阵为不可逆的;若|A|!=0则求其逆矩阵,并在终端显示其逆矩阵。四、算法设计思想及流程图1.抽象数据类型ADTMatrixMulti{数据对象:D={a(I,j)|i=1,2,3,…,n;j=1,2,…,n;a(i,j)∈ElemSet,n为矩阵维数}数据关系:R={Row,Col}Row={a(i,j),a(i,j+1)|1=i=n,1=j=n-1}Col={a(i,j),a(i+1,j)|1=i=n-1,1=j=n}基本操作:Swap(a,b);初始条件:记录a,b已存在。操作结果:交换记录a,b的值。CreateMatrix(n);操作结果:创建n维矩阵,返回该矩阵。Input(M);初始条件:矩阵M已存在。操作结果:从终端读入矩阵M的各个元素值。Print(M)初始条件:矩阵M已存在。操作结果:在终端显示矩阵M的各个元素值。ReadFromFile();操作结果:从文件读入矩阵的相关数据。Menu_Select();操作结果:返回菜单选项。MultMatrix(M1,M2,R);初始条件:矩阵M1,M2,R已存在。操作结果:矩阵M1,M2作乘法运算,结果放在R中。DinV(M,V);初始条件:矩阵M,V已存在。操作结果:求矩阵M的逆矩阵,结果放入矩阵V中。MatrixDeterm(M,n);初始条件:矩阵M已存在。操作结果:求矩阵M的行列式的值。}ADTMatrixMulti2.矩阵求逆算法设计思想算法采用高斯-约旦法(全选主元)求逆,主要思想如下:首先,对于k从0到n-1作如下几步:①从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元素所在的行号与列号,再通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。②主元求倒:M(k,k)=1/M(k,k)③M(k,j)=M(k,j)xM(k,k);j=0,1,…,n-1;j!=k④M(i,j)=M(i,j)–M(i,k)xM(k,j);i,j=0,1,…,n-1;i,j!=k⑤M(i,k)=-M(i,k)xM(k,k),i=0,1…,n-1;i!=k最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复原则如下:在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。3.矩阵行列式求值运算算法设计思想利用行列式的性质:行列式等于它的任一行(列)各元素与其对应的代数余子式乘积,即D=∑a(i,k)xA(i,k);k=1,2,…,n;D=∑a(k,j)xA(k,j);k=1,2,…,n;再利用函数的递归调用法实现求其值。4.各函数间的调用关系Main()ReadFromFile()DinV()Swap()Print()Menu_Select()MatrixDeterm()CreateMatrix()MultMatrix()Input()5.流程图否否是否是是否是否否是开始switch(Menu_Select())case1:case3:case2:n0?是输入矩阵维数n输入矩阵A,B输出矩阵维数nsystem(“pause”);通过键盘输入需对哪个矩阵求逆,求出相应该的逆阵,并显示求得的逆阵system(“pause”);若矩阵不可逆则返回主菜单case4:R=AxB并显示矩阵Rsystem(“pause”);case5:是否是R=AxB^(-1)显示矩阵Rsystem(“pause”);若B不可逆,则返回主菜单case6:从指定文件中读入矩阵数据case0:exit(0);结果否五、源代码#includeconio.h#includestdio.h#includestdlib.h#includemath.h#includemalloc.h#includestring.h#defineYES1#defineNO0typedeffloatElemType;ElemTypexxA;//矩阵AElemTypexxB;//矩阵BElemTypexxR;//矩阵R,用于存放运算结果ElemTypexxV;//矩阵V,存放逆矩阵intn=0;//矩阵维数intflag=-1;//标记voidswap(ElemTypexa,ElemTypexb)//交换记录a,b的值{ElemTypec;c=xa;xa=xb;xb=c;}ElemTypexxCreateMatrix(intn)//创建n维矩阵,返回该矩阵{inti,j;ElemTypexxM;M=(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;ElemTypexxT2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;ElemTypevalue=0;//运算结果for(i=0;in;i++){for(j=0;jn;j++){T1[i][j]=M[i][j];T2[i][j]=M[i][j];}}if(n==2)//若为2维矩阵,则直接运算并返回运算结果{value=T2[0][0]xT2[1][1]-T2[0][1]xT2[1][0];returnvalue;}else{for(j=0;jn;j++)//将矩阵的行列式以第一行展开{u=T1[0][j];for(i=1,l=0;in;i++)//求矩阵行列式的余子式M(0,j){for(k=0,s=0;kn;k++){if(k==j)continue;else{T2[l][s]=T1[i][k];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的行列式值if(u==0)return-1;for(i=0;in;i++)for(j=0;jn;j++)V[i][j]=M[i][j];for(k=0;kn;k++){d=0;for(i=k;in;i++)//找出矩阵M从M[k][k]开始绝对值最大的元素{for(j=k;jn;j++){if(fabs(V[i][j])d){d=fabs(V[i][j]);//d记录绝对值最大的元素的值/x把绝对值最大的元素在数组中的行、列坐标分别存入IS[K],JS[K]x/IS[k]=i;JS[k]=j;}}}if(d+1.0==1.0)return0;//所有元素都为0if(IS[k]!=k)/x若绝对值最大的元素不在第k行,则将矩阵IS[K]行的元素与k行的元素相交换x/for(j=0;jn;j++)swap(V[k][j],V[IS[k]][j]);if(JS[k]!=k)/x若绝对值最大的元素不在第k列,则将矩阵JS[K]列的元素与k列的元素相交换x/for(i=0;in;i++)swap(V[i][k],V[i][JS[k]]);V[k][k]=1/V[k][k];//绝对值最大的元素求倒for(j=0;jn;j++)/x矩阵M第k行除元素M[k][k]本身外都乘以M[k][k]x/if(j!=k)V[k][j]=V[k][j]xV[k][k];for(i=0;in;i++)/x矩阵除第k行的所有元素与第k列的所有元素外,都拿本身减去M[i][k]xM[k][j],其中i,j为元素本身在矩阵的位置坐标x/if(i!=k)for(j=0;jn;j++)if(j!=k)V[i][j]=V[i][j]-V[i][k]xV[k][j];for(i=0;in;i++)/x矩阵M第k列除元素M[k][k]本身外都乘以-M[k][k]x/if(i!=k)V[i][k]=-V[i][k]xV[k][k];}for(k=n-1;k=0;k--)/x根据上面记录的行IS[k],列JS[k]信息恢复元素x/{for(j=0;jn;j++)if(JS[k]!=k)swap(V[k][j],V[JS[k]][j]);for(i=0;in;i++)if(IS[k]!=k)swap(V[i][k],V[i][IS[k]]);}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++){R[i][j]=0;}}for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++){R[i][j]=R[i][j]+M1[i][k]xM2[k][j];}}}}voidInput(ElemTypexxM)//输入矩阵M的各个元素值{inti,j;charstr[10];charc='A';if(flag==1)c='B';system(“cls“);printf(“\n\n输入矩阵%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“,M[i][j]);}puts(““);printf(“\t\t“);}}intMenu_Select(){charc;do{system(“cls“);puts(“\t\txxxxxxxxxxxxxn维矩阵乘法器xxxxxxxxxxxxx“);puts(“\t\t|1.通过键盘输入各项数据|“);puts(“\t\t|2.显示矩阵A,B|“);puts(“\t\t|3.矩阵求逆,并显示逆矩阵|“);puts(“\t\t|4.求矩阵运算AxB,并显示运算结果|“);puts(“\t\t|5.求矩阵运算AxB^(-1),并显示运算结果|“);puts(“\t\t|6.从文件读入矩阵A,B与维数n|“);puts(“\t\t|0.退出|“);puts(“\t\txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“);printf(“\t\t请选择(0-6):“);c=getchar();}while(c'0'||c'6');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);//创建矩阵ABVRB=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);for(i=0;in;i++)//读入矩阵A{for(j=0;jn;j++){fscanf(fp,“%f“,A[i][j]);}}for(i=0;in;i++)//读入矩阵A{for(j=0;jn;j++){fscanf(fp,“%f“,B[i][j]);}}puts(“\n\n读文件成功“);fclose(fp);flag=1;}intmain(){inti;charc,h;charstr[10];for(;;){switch(Menu_Select()){case1:flag=-1;for(;;){system(“cls“);printf(“\n\n\t矩阵维数n:“);scanf(“%d“,n);gets(str);if(n0)break;else{printf(“\n\t输入有误,请重新输入!\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\n\t不存在任何矩阵数据,请先输入数据“);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(“\n\n\t不存在任何矩阵数据,请先输入数据“);system(“pause“);break;}for(;;){printf(“\n\n\t输入需要求逆的矩阵(A/B):“);h=getchar();c=getchar();//h=getchar();if(c=='A'||c=='a'){i=DinV(A,V);if(i==-1){puts(“\n\n\t矩阵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(“\n\n\t矩阵B的行列式等于0,不可逆!“);system(“pause“);break;}printf(“\tB=“);Print(B);puts(“\n“);printf(“B^(-1)=“);Print(V);puts(““);system(“pause“);break;}elseputs(“\n\n\t输入有误,请重新输入!\n“);}break;case4:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);system(“pause“);break;}MultMatrix(A,B,R);printf(“\n\n\tAxB=“);Print(R);puts(““);system(“pause“);break;case5:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);system(“pause“);break;}i=DinV(B,V);if(i==-1){puts(“\n\n\t矩阵B的行列式等于0,不可逆!“);system(“pause“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国煤炭检测实验分析仪器行业全国市场开拓战略制定与实施研究报告
- 2025-2030年中国燃料电池电堆行业商业模式创新战略制定与实施研究报告
- 新形势下物业管理行业可持续发展战略制定与实施研究报告
- 2025-2030年中国有限服务酒店行业开拓第二增长曲线战略制定与实施研究报告
- 2025-2030年中国温度控制器行业并购重组扩张战略制定与实施研究报告
- 2025-2030年中国汗蒸馆行业开拓第二增长曲线战略制定与实施研究报告
- 市政道路工程监理竣工质量评估报告
- 学校修建综合楼申请报告
- 四年级数学(小数加减运算)计算题专项练习与答案
- 皮草面料知识培训课件
- 银行反恐应急预案及方案
- 关于推某某同志担任教育系统实职领导职务的报告(职务晋升)
- 2023消防安全知识培训
- 邻近铁路营业线施工安全监测技术规程 (TB 10314-2021)
- Exchange配置与规划方案专项方案V
- 三年级上册脱式计算练习200题及答案
- 新生儿腭裂护理查房课件
- 二年级下册科学课程纲要
- 前交叉韧带重建术后康复训练
- 河南近10年中考真题数学含答案(2023-2014)
- 八年级上学期期末家长会课件
评论
0/150
提交评论