数据结构课程设计矩阵的运算_第1页
数据结构课程设计矩阵的运算_第2页
数据结构课程设计矩阵的运算_第3页
数据结构课程设计矩阵的运算_第4页
数据结构课程设计矩阵的运算_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构课程设计报告题 目:专 业:班 级:学 号:姓 名:指导老师:时 间:一、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义, 用 typedef struct 来实现,根据所设计的问题在 结构体里面定义数据类型及其变量, 用 define 定义数组的大小,然后利用 typedef 来 实现对于变量的未知类型确定正确的类型。2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元 组顺序表)来存储,有的用二维数组来储存。3、转置的过程中利用的是快速转置的方法,附设了 num和cpot两个辅助变量。4、矩阵的

2、加法、减法、乘法、逆运算的基本算法方式。5、通过调用每个函数,来实现每个算法的功能。二、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑, 要运用快速转置的方法实现, 必须用三元组顺序表来储存数据,所以在第一个结构体中存在int类型的行数(mU列数(nu)以及非零 元素的个数( tu );然后第二个结构体中分别有非零元素的行下标( i )、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结 构体类型。2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩 阵的行数、列数和一个二维数组(用 float 来定义类型)。3、在 main 函数里

3、面, 来实现对于数据的输入操作, 利用 if 语句进行选择来执行操作,利用dowhile语句来实现功能的循环操作。4、分五个函数调用分别来实现转置、加法、乘法、和逆运算,每个里面都有最终输 出结果的方式。算法 1:矩阵的转置输入:mu中存放矩阵的行数,tu存放矩阵的列数,i接收行下标的数值,j接收列 下标的数值,e来存储数据。输出:转置后的新矩阵。输入两行两列数据,在第二行第一列中有个数据为 12,其余都为 0,则输出的结果 为第一行第二列数据为 12,其余为 0。算法 2:矩阵的加法运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。 输出:矩阵加完后的另一个新矩阵。

4、输入两个两行三列的矩阵, 在第一个矩阵里面第一行第一列有个数据 20,其余为 0, 在第二个矩阵里面第一行第二列中有个数据 30,其余为 0,则输出的结果为一个两 行三列的矩阵,其中第一行第一列数据为 20,第一行第二列数据为 30,其余为 0。算法 3:矩阵的减法运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。 输出:矩阵相减后的另一个新矩阵。输入两个两行三列的矩阵, 在第一个矩阵里面第一行第一列有个数据 20,其余为 0, 在第二个矩阵里面第一行第一列中有个数据 30,其余为 0,则输出的结果为一个两 行三列的矩阵,其中第一行第一列数据为 -10,其余为 0。算

5、法 4:矩阵的乘法运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。 输出:矩阵加完后的另一个新矩阵。输入两行两列的矩阵,第一个矩阵里面第一行第一列有个数据 2 第二列有个数据 3, 其余为 0,在第二个矩阵里面第一行第一列有个数据 2第二列中有个数据 3,其余为 0,则输出的结果为一个两行两列的矩阵,其中第一行第一列数据为 4,第二列为 6, 第一行第二列数据为 30,其余为 0。算法五:矩阵的逆运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。 输出:矩阵进行逆运算完后的另一个新矩阵。输入三行三列的矩阵,第一个矩阵里面第一行第一列有个数据

6、 3 个数据分别为 1, 2,3;第二行的数据分别为 2, 2, 1;第三行的暑假分别为 3, 4, 3;则输出的结果为 三行三列矩阵, 其中第一行的数据为 1, 3, -2;第二行的数据分别为 -1.5 , -3, 2.5; 第三行的数据分别为 1, 1, -1。三、课程设计中遇到的难点及解决办法1、在转置的过程中,要求把转置后的矩阵输出出来,因为用的是三元组顺序表的存储 形式,所以不知道怎么去实现,然后通过进一步思考,运用先把一个矩阵存入零元素,然后 在对其进行更改,最后完成了此项的工作。2、就是对于矩阵的乘法运算和逆运算,掌握的不够熟练,先是通过书籍对于矩阵的乘法和逆运算得到更深的了解,

7、然后通过一步步写程序最后实现了矩阵的乘法运算和逆运算四、总结通过此次课程设计, 让我对于编程有了更深的认识, 老师的精心指导让我学会到了很多, 不仅仅是代码,最主要的让我的思维开阔了很多,在这个过程中,通过不断的尝试,不断的 修改,最终克服了困难,完成了自己的任务,心里有种无比的喜悦,但同时又感觉到了自己 的知识面的狭隘,还有好多知识的海洋还没有畅游,等待自己将是一回更大的考验。对于现在的自己,对学习程序还是有很大的兴趣,它让我体验到了很多的快乐,我要进 步跟进现在的课程,努力去发展自己,按照老师说的最主要的是具有了编程的思想,则具有 了编程的能力,我想我可以成功完成自己的目标。五、附录主要源

8、程序代码及运行结果1、主要源程序代码 :# include <stdio.h># define max 100# define maxsize 100typedef float elemtype;typedef struct float bmaxmax;int i;/ 矩阵的行数int j;/ 矩阵的列数 tsmatrix;typedef struct int i,j;/ 该非零元的行下标和列下标elemtype e;triple;typedef struct triple datamaxsize+1;/ 非零元三元组 ,data0 未用int mu,nu,tu;/ 矩阵的行数、列

9、数和非零元个数sqlist ;void zhuanzhi(sqlist s1,tsmatrix &l2)/ 矩阵的转置 sqlist s2;int col,t9,p,q,a1,b1;int num100,copt100;s2.mu=s1.mu;s2.nu=s1.nu;s2.tu=s1.tu;if(s2.tu>0) for(col=1;col<=s1.nu;+col) numcol=0;for(t9=1;t9<=s1.tu;+t9)+nums1.datat9.j;/求 s1 中每一列含非零元个数copt1=1;/ 求第 col 列中第一个非零元在 s2.data 中序号

10、for(col=2;col<=s1.nu;+col) coptcol=coptcol-1+numcol-1;for(p=1;p<=s1.tu;+p) col=s1.datap.j;q=coptcol;s2.dataq.i=s1.dataq.j; s2.dataq.j=s1.dataq.i;s2.dataq.e=s1.dataq.e;+coptcol;l2.bs2.dataq.is2.dataq.j=s2.dataq.e;printf(" 转置后的数据是 :n");printf("*for(a1=1;a1<=s1.nu;a1+) for(b1=1;

11、b1<=s1.mu;b1+) printf("%10.3f",l2.ba1b1); printf("t"); printf("n");矩阵的加法printf("printf("n");void jiafa(tsmatrix l4, tsmatrix l5)/ tsmatrix l6;for(int t=0; t<l4.i;t+) for(int t1=0;t1<l4.j;t1+)l6.btt1=l4.btt1+l5.btt1; printf(" 矩阵加完后的结果 :n"

12、;);printf("f*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l4.j;t3+) printf("%10.3f",l6.bt2t3);printf("t");printf("n");printf("f*n");void jianfa(tsmatrix l4, tsmatrix l5)/ tsmatrix l6;for(int t=0; t<l4.i;t+)矩阵的减法 for(int t1=0;t1<l4.j;t1+

13、)l6.btt1=l4.btt1-l5.btt1; printf(" 矩阵相减后的结果 :n");printf("f*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l4.j;t3+)printf("%10.3f",l6.bt2t3);printf("t");printf("n");printf("f*n");void chengfa(tsmatrix l4, tsmatrix l5)/矩阵的乘法 tsmatrix l

14、6;for(int t=0;t<l4.i;t+)for(int t1=0;t1<l5.j;t1+) l6.btt1=0;for(int k=0;k<l4.j;k+)l6.btt1+=l4.btk*l5.bkt1;printf(" 矩阵乘完后的结果 :n");printf("*n");for(int t2=0; t2<l4.i;t2+) for(int t3=0;t3<l5.j;t3+)printf("%10.3f",l6.bt2t3);printf("t");printf("

15、n"); printf("*n");矩阵的逆运算void niyunsuan( tsmatrix s)/ tsmatrix s1;float t,x;int k,i,j; for(i=0;i<s.i;i+)for(j=0;j<(2*s.i);j+) if(j<s.i) s1.bij=s.bij;else if(j=s.i+i) s1.bij=1.0;else s1.bij=0.0;for(i=0;i<s.i;i+) for(k=0;k<s.i;k+)if(k!=i) t=s1.bki/s1.bii;for(j=0;j<(2*s.

16、i);j+) x=s1.bij*t;s1.bkj=s1.bkj-x; for(i=0;i<s.i;i+) t=s1.bii;for(j=0;j<(2*s.i);j+)s1.bij=s1.bij/t; float y=1.0;for(i=0;i<s.i;i+) y=y*s1.bii;if(y=0.0)printf(" 对不起,您输入的矩阵没有逆矩阵 "); else for(i=0;i<s.i;i+)for(j=0;j<s.i;j+)s.bij=s1.bij+s.i; printf(" 矩阵逆运算后的结果 :n");for(i

17、=0;i<s.i;i+) for(j=0;j<s.i;j+) printf("%10.3f",s.bij); printf("n");void main() tsmatrix l,l1,l3; sqlist s;int m,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;do printf(" 请输入你要进行的操作: n");printf("f*n");8printf(" 矩阵转置运算请按 1n 矩阵的加法运算请按 2n 矩阵的乘法运算请按 3n矩阵的减法运算请

18、按 4n 矩阵的逆运算请按 5n 结束请按 0:n");scanf("%d",&m1);if(m1=1) printf(" 您选择进行的操作是矩阵的转置运算 nn"); printf(" 请输入你要转置矩阵的行数、列数和非零元的个数 n"); scanf("%d",&t1);scanf("%d",&t2);scanf("%d",&t3);s.mu=t1;s.nu=t2;s.tu=t3;printf(" 请输入你要转置矩阵非零

19、元的行下标、列下标 ( 从 11 开始由左至右由上到 下)及其数据 (按行逐个输入 )n");for(t4=1;t4<=s.tu;t4+)scanf("%d",&t5);scanf("%d",&t6);s.datat4.i=t5;s.datat4.j=t6; scanf("%f",&s.datat4.e); for(t7=1;t7<=s.nu;t7+) for(t8=1;t8<=s.mu;t8+)l1.bt7t8=0.0; zhuanzhi(s,l1);if(m1=2)printf(

20、" 您选择进行的操作是矩阵的加法运算 nn"); printf(" 请输入矩阵的行数和列数 :n");scanf("%d",&n);scanf("%d",&m);l.i=n;l.j=m;l3.i=n;l3.j=m;printf("*n");printf(”请输入第一个出亍(列的矩阵n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1);printf

21、("*n");printf("*n");printf("请输入第二个出亍4列的矩阵n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+)scanf("%f",&l3.bn4n5);printf("*n");jiafa(l,l3);if(m1=3)printf(" 您选择进亍的操作是矩阵的乘法运算 n( 只有当第一个矩阵的列数等于第二个 矩阵的亍数方可进亍计算 )nn");printf("

22、 请输入第一个矩阵的亍数和列数 :n");scanf("%d",&n); scanf("%d",&m);l.i=n;l.j=m;printf("*n");printf("请输入第一个出亍(列的矩阵n",l.i,l.j); for(t=0;t<l.i;t+) for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1); printf("*n"); printf("*n");printf(&qu

23、ot; 请输入第二个矩阵的亍数和列数 :n"); scanf("%d",&n1);scanf("%d",&m1);l3.i=n1;l3.j=m1; printf("*n");printf("请输入第二个出亍4列的矩阵n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+) scanf("%f",&l3.bn4n5); printf("*n");chengfa(l,l3);

24、if(m1=4)printf(" 您选择进亍的操作是矩阵的减法运算 nn"); printf(" 请输入矩阵的亍数和列数 :n");scanf("%d",&n); scanf("%d",&m);l.i=n;l.j=m; l3.i=n;l3.j=m; printf("*n");printf(”请输入第一个出亍(列的矩阵n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+) scanf("%f",

25、&l.btn1); printf("*n"); printf("*n");printf("请输入第二个出亍4列的矩阵n",l3.i,l3.j);for(n4=0;n4<l3.i;n4+) for(n5=0;n5<l3.j;n5+) scanf("%f",&l3.bn4n5); printf("*n");jianfa(l,l3);if(m1=5)printf(" printf("您选择进亍的操作是矩阵的逆运算 nn"); 请输入矩阵的维数

26、(即亍和列相等的矩阵 ):n");scanf("%d",&n);l.i=n;l.j=n;printf("*n");printf(" 请输入出亍(列的矩阵n",l.i,l.j); for(t=0;t<l.i;t+)for(n1=0;n1<l.j;n1+)scanf("%f",&l.btn1);printf("*n");niyunsuan(l);while(m1!=0);2、运亍结果(如下图) :(1)、执亍的首界面:"G:oft Visual Stu

27、dioCommonMSDev9SBinDebug5fdrexepi=i回*&.冃士冃主冃闵 ffiwlai詈 算运运运"昇 运屢法运0: 置加乘减逆按 番的SS请束ff-5-6_H-l;l£-p9(2) 、矩阵的转置运算:I ' *G:谓l掲结羁Mkrsoft 甘i$ual Stud i oCom mo nM Dev98 Bi rXDebugVd .exe"CZI口2 3 4-5 按请请请按 请slB用 St运运运"畀 运法法法运0! 置加癇欝拯 書的的的请束您选择进行的操作是矩阵的转置迂算请输入你要转置矩阵的行数、列数和非零元的个数巒入

28、擁寰转置矩阳淒元的行下标、列下标(从1H11开始由左至右由上到下及苴数据 彳亍逐储入2 32置后的数据是:B.0000.000(3) 、矩阵的加法运算:I 'G邈揭结扇制icrosoft Visual StudioComnnorM SDevS8EinDebugsfd.exe"= 同 S32 3 4 1按按按- 按朗朗圍按i 请ffissis 算运运运算 运法法法运0: 置加乘减逆按 的的的请 -pH-pH-H_41n-11(4) 、矩阵的减法运算: *6;徵据结斑Micro5oft Visual StudioComnnonM5Dev986inDebugsfd.axam请输入你

29、要进行的请请按 请»>&用 "昇运运运"畀 话法法法运0: 置加乘诚逆按的的的请-EE-E-o-Edr-rT4勒选择进行的操作杲矩阵的减注运算 k输入矩阵的行数和列数:B 2情输入第一个2行2列的矩阵1 21 2请输入第二个2行?列的矩阵1 3£ 3矩阵相减后的结果:(5) 、矩阵的乘法S3二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 二 *2 3 4 按请请请按 请»»詈 "畀运运运"畀 运法法法运0: 置加乘诚逆按 的的的请 5一一P6一一p-pTh-rr 刃刃刃- -15聲练矩阵的行数方可进行计算幘输入

温馨提示

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

评论

0/150

提交评论