软件开发基础报告_第1页
软件开发基础报告_第2页
软件开发基础报告_第3页
软件开发基础报告_第4页
软件开发基础报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、中国矿业大学徐海学院软件开覆基础实践报姓 名:学 号:专 业:计算机科学与技术指导教师:职称:2012年6月17徐州姓名/学号:班级:一、程序来源:网络二、程序项目名称:矩阵乘法三、程序原理:程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态 分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素 值;也可以通过文件读入矩阵的各项数据(维数及各元素值)当要对矩阵作进一步操作(A*B或A*BN-1)时,先判断内存中是否已 经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A| != 0判断矩 阵是否可逆,若矩阵

2、的行列式|A| = = 0则提示该矩阵为不可逆的;若|A| !=0则求其逆矩阵,并在终端显示其逆矩阵。四、程序功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a, b的内容,并 输出两个矩阵,输出ab 一结果。五、程序内容(输入输出):1 .初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2 .完成最低要求:建立一个文件,可完成2维矩阵的情况;3 .进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功六、数据流分析(定义的变量,类型,数组,类型,结构体):数据对象:D = a(I,j)|i= 1,2,3,n;j = 1,2,n;a(i,j) ElemSet,n 为矩

3、阵维数数据关系:R = Row,ColRow= <a(i,j),a(i,j+1)>|1 <= i <= n , 1 <= j <= n-1Col = <a(i,j),a(i+1,j)>|1 <= i <= n-1 , 1 <= j <= n七、程序代码分析(每个函数和代码模块的功能作用分析):1 .抽象数据类型ADTMatrixMulti 数据又寸象:D = a(I,j)|i= 1,2,3,n;j = 1,2,n;a(i,j) ElemSet,n 为矩阵维数数据关系:R = Row,ColRow= <a(i,j),a

4、(i,j+1)>|1 <= i <= n , 1 <= j <= n-1Col = <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的各个元素值。R

5、eadFromFile();操作结果:从文件读入矩阵的相关数据。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 .矩阵求逆算法设计思想算法采用高斯-约旦法(全选主元)求逆,主要思想如下:首先

6、,对于k从0到n-1作如下几步: 从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元 素所在的行号与列号,再通过行交换和列交换将它交换到主元素位置上。这 一步称为全选主元。 主元求倒:M(k,k) = 1 / M(k,k) M(k,j)=M(k,j) * M(k,k) ;j= 0,1,,n-1;j!= k M(i,j)=M(i,j) - M(i,k)*M(k,j) ; i,j = 0,1,,n-1;i,j!=k M(i,k)=- M(i,k) * M(k,k),i =0,1 ,n-1; i != k最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复原则如下: 在全

7、选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交 换来恢复。3 .矩阵行列式求值运算算法设计思想利用行列式的性质:行列式等于它的任一行(列)各元素与其对应的代数余子式乘积,即D = Ea(i,k)*A(i,k);k = 1,2,n;D = Ea(k,j)*A(k,j);k = 1,2,,n;再利用函数的递归调用法实现求其值。4 .各函数间的调用关系八、控制流分析(源程序整体流程图):九、源代码优点,好处: 可以当作简单的矩阵计算器使用,具有一定的容错性十、总结及心得体会:课程设计结束了,带给我很多的收获。C程序设计、数据结构已经学完了,有许多知识都存在似懂非懂的现象,这

8、种现象通过实际的上机操作,实际应用,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。通过课程设计,明白到了原来开发一个项目,是需要考虑到很多方面的问题的,这些都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来,更加得心应手。 我们要不断发现问题、提出问题,解决问题。卜一、对源程序过程及方法、手段的改进建议:1.主界面:2.输入6,回车,从文本文件tx.txt中读入矩阵数据:3.回车,回到主菜单界面;输入 2回车,显示从文件读入的矩阵数据:4.回车,回到主菜单界面;输入 3回车,对指定矩阵求逆:(由于这里矩阵A是不可逆的, 因此仅以矩阵B为例)5

9、.回车,回到主菜单界面;输入 4回车,求矩阵运算A*B :、旅华宴看也注6.回车回到主菜单界面,输入5回车,求A*BA(-1)的值:7.回车回到主菜单界面,输入0回车,退出程序;如果需要自定矩阵维数及各元素值,请 利用主菜单里的1号功能自行输入数据,再进行以上几种运算操作。报告评分:指导教师签字:源代码#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<malloc.h>#include<string.h>#defineY

10、ES 1#define NO 0typedeffloat ElemType;ElemType*A;/矩阵AElemType*B;矩阵BElemType*R;/矩阵R,用于存放运算结果ElemType*V;/矩阵V,存放逆矩阵int n=0;/矩阵维数int flag=-1;/标记void swap(ElemType*a,ElemType*b) /交换记录 a,b 的值ElemTypec;c=*a;*a=*b;*b=c;ElemType*CreateMatrix(int n) 创建 n 维矩阵,返回该矩阵 int i,j;ElemType *M;M = (ElemType *)malloc(si

11、zeof(ElemType *)*n);if(M = NULL)exit(1);for(i=0;i<n;i+) *(M+i) = (ElemType*)malloczeof(ElemType)*n);for(j=0;j<n;j+)*(*(M+i)+j) =0; return M;ElemTypeMatrixDeterm(ElemType *M,int n)/*递归法求n维矩阵行列式的值,返回运算结果*/(int i,j,k,l,s;ElemType*T1;ElemType*T2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;Elem

12、Typevalue=0;/运算结果for(i=0;i<n;i+)(for(j=0;j<n;j+)(T1ij=Mij;T2皿=Mij;if(n=2)/若为2维矩阵,则直接运算并返回运算结果(value=T200*T211-T201*T210; return value; else( for(j=0;j<n;j+)/将矩阵的行列式以第一行展开(u=T10j;for(i=1,l=0;i<n;i+)求矩阵行列式的余子式M(0,j)(for(k=0,s=0;k<n;k+)(if(k=j) continue;else (T2ls=T1ik;s+; l+;value=value

13、+u*(int)pow(-1,j)*MatrixDeterm(T2,n-1);*/*行列式等于某一行的各个元素与其代数余子式的乘积之和 return value;int DinV(ElemType *M,ElemType *V)/*全选主元法求矩阵M的逆矩阵,结果存入矩阵V中*/(int i,j,k;ElemTyped;ElemTypeu;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

14、=0;i<n;i+)for(j=0;j<n;j+)Vij=Mij;for(k=0;k<n;k+)(d=0;for(i=k;i<n;i+)/找出矩阵M从Mkk开始绝对值最大的元素(for(j=k;j<n;j+)(if(fabs(Vij)>d)(d=fabs(Vij);/d记录绝对值最大的元素的值/*把绝对值最大的元素在数组中的行、列坐标分别存入ISK,JSK*/ISk=i;JSk=j;)if(d+1.0 = 1.0)return 0;/所有元素都为0if(ISk != k)/*若绝对值最大的元素不在第k行,则将矩阵ISK行的元素与k行的元 素相交换*/swap

15、(&Vkj,&VISkj);if(JSk!=k)/*若绝对值最大的元素不在第k列,则将矩阵JSK列的元素与k列的元 素相交换*/for(i=0;i<n;i+)swap(&Vik,&ViJSk);Vkk=1/Vkk;/绝对值最大的元素求倒for(j=0;j<n;j+)/*矩阵M第k行除元素Mkk本身外都乘以Mkk*/if(j!=k)Vkj=Vkj*Vkk;for(i=0;i<n;i+)/*矩阵除第k行的所有元素与第k列的所有元素外,都拿本身减去Mik*Mkj,其中i,j为元素本身在矩阵的位置坐标*/if(i!=k)for(j=0;j<n;j

16、+)if(j!=k)Vij=Vij-Vik*Vkj;for(i=0;i<n;i+)/*矩阵M第k列除元素Mkk本身外都乘以-Mkk*/if(i!=k)Vik=-Vik*Vkk;for(k=n-1;k>=0;k-)/*根据上面记录的行ISk,列JSk信息恢复元素*/for(j=0;j<n;j+)if(JSk!=k)swap(&Vkj,&VJSkj);for(i=0;i<n;i+)if(ISk!=k)swap(&Vik,&ViISk);free(IS);free(JS);return 0;void MultMatrix(ElemType *M

17、1,ElemType *M2,ElemType *R)/*矩阵M1乘M2结果存入矩阵R*/int i,j,k;for(i=0;i<n;i+)for(j=0;j<n;j+) ( Rij=0;) ) for(i=0;i<n;i+) (for(j=0;j<n;j+)(for(k=0;k<n;k+) (Rij=Rij+M1ik*M2kj; ) ) ) )void Input(ElemType*M)/输入矩阵M的各个元素值(int i,j;charstr10;charc='A'if(flag=1)c='B'system("cls&q

18、uot;);printf("nn 输入矩阵 c(%d*%d)n”,c,n,n);for(i=0;i<n;i+)(for(j=0;j<n;j+)(scanf("%f",*(M+i)+j); ) ) flag=1;gets(str);吸收多余的字符)void Print(ElemType*M)/显示矩阵M的各个元素值(int i,j;printf("t");for(i=0;i<n;i+) ()puts("");printf("tt");) int Menu_Select() (charc;d

19、osystem("cls");puts("tt* puts("tt| puts("tt| puts("tt| puts("tt| puts("tt| puts("tt| puts("tt| puts("tt*n维矩阵乘法器 *"1.2.3.4.5.6.通过键盘输入各项数据显示矩阵A,B矩阵求逆,并显示逆矩阵求矩阵运算A*B,并显示运算结果);|");|");|");|");求矩阵运算A*BA(-1),并显示运算结果|");从文

20、件读入矩阵A,B与维数n0.退出*");|");|");printf("tt 请选择(0-6):"); c=getchar();while(c<,0'|c>'61);return (c-'0');void ReadFromFile()/从指定文件读入矩阵的维数及矩阵各元素的值int i,j;FILE *fp;if(fp=fopen("tx.txt","r")=NULL) puts("无法打开文件!"); system("pause&

21、quot;);exit(0);fscanf(fp,"%d",&n);/读入矩阵维数A=CreateMatrix(n);创建矩阵 A B V RB=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);for(i=0;i<n;i+)读入矩阵 A(for(j=0;j<n;j+)(fscanf(fp,"%f",&Aij);)for(i=0;i<n;i+)读入矩阵 A(for(j=0;j<n;j+)(fscanf(fp,"%f",&Bij);)p

22、uts("nn读文件成功");fclose(fp);flag=1;) int main()(int i;charc,h;charstr10;for(;)(switch(Menu_Select()(case1: flag=-1;for(;)(system("cls");printf("nnt 矩阵维数 n:");scanf("%d",&n);gets(str);if(n>0)break;else (printf("nt输入有误,请重新输入!n"); puts(""

23、);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("nnt不存在任何矩阵数据,请先输入数据");system("pause");break;)puts("n");printf("tA =");Print(A);puts(&qu

24、ot;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=

25、9;A'|c='a')i=DinV(A,V);if(i=-1)puts("nnt矩阵A的行列式等于0,不可逆!");system("pause"); break;) printf("tA ="); Print(A); puts("n");printf("AA(-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);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论