数据结构课程设计矩阵的运算.doc

上传人:gfy****yf 文档编号:46377353 上传时间:2021-12-13 格式:DOC 页数:16 大小:238KB
收藏 版权申诉 举报 下载
数据结构课程设计矩阵的运算.doc_第1页
第1页 / 共16页
数据结构课程设计矩阵的运算.doc_第2页
第2页 / 共16页
数据结构课程设计矩阵的运算.doc_第3页
第3页 / 共16页
资源描述:

《数据结构课程设计矩阵的运算.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计矩阵的运算.doc(16页珍藏版)》请在装配图网上搜索。

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

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

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

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

5、则输出的结果为一 个两行三列的矩阵,其中第一行第一列数据为-10,其余为0. 算法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 在对其进行更改,最后完成了此项的工作. 2

7、、就是对于矩阵的乘法运算和逆运算,掌握的不够熟练,先是通过书籍对于矩阵的乘 法和逆运算得到更深的了解,然后通过一步步写程序最后实现了矩阵的乘法运算和逆运算. 四、 总结 通过此次课程设计,让我对于编程有了更深的认识,老师的精心指导让我学会到了很 多,不仅仅是代码,最主要的让我的思维开阖了很多,在这个过程中,通过不断的尝试,不 断的修改,最终克服了困难,完成了自己的任务,心里有种无比的喜悦,但同时又感觉到了 自己的知识面的狭隘,还有好多知识的海洋还没有畅游,等待自己将是一回更大的考脸. 对于现在的自己,对学习程序还是有很大的兴趣,它让我体验到了很多的快乐,我要 进步跟进现在的课程,努力去发

8、展自己,按照老师说的最主要的是具有了编程的思想,则具 有了编程的能力,我想我可以成功完成自己的目标。 五、 附录一主要源程序代码及运行结果 1、主要源程序代码: # include # define max 100 # define maxsize 100 typedef float elemtype; typedef struct { float b[max] [max]; int i;〃矩阵的行数 int j;//矩阵的列数 } tsmatrix; typedef struct { int i, j;//该非家元的行下标和列下标 elemty

9、pe e; }triple; typedef struct { triple data [maxsize+1]; //非零元三元组,data [0]未用 int mu, nu, tu; //矩阵的行数、列数和非零元个数 }sqlist ; void zhuanzhi (sql ist si, tsmatrix 412) //矩阵的转置 { sql ist s2; int col, t9, p, q, al, bl; int num[100], copt [100]; s2. mu=sl・ mu; s2・ nu=sl・ nu; s2・ tu=sl・ tu; if(s2. tu>

10、0) { for (col=l; col<=sl ・nu;++col) num [col] =0; for (t9=l; t9<=sl. tu; ++t9) ++num[sl. data [t9]. j]; //求si中每一列含非零元个数 copt [1]=1; //求第col列中第一个非零元在s2. data中序号 for (col=2; col<=sl・ nu; ++col) copt [col]=copt[col-l]+num[col-l]; for (p=l; p<=sL tu; ++p) { col=sl- data [p]. j; q=copt [col];

11、s2・data [q]・ i=sl・data[q]・ j; s2・ data [q]・ j=sl・data[q]・ i; s2. data [q]. e=sl. data [q]. e; ++copt [col]; 12. b[s2. data [q]・ i] [s2. data [q]. j]=s2. data [q)・ e;} printf ("转置后的数据是:\nn); pr intf (R♦♦♦♦♦♦♦♦#♦>♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\nn); for (al=l; al<=sl. nu; al++) { for (b 1=1; bl<=sl. m

12、u; bl++) {printf C%10. 3f\ 12.b[al] [bl]); printf ("\tR);} printf (R\n"); ) printf(R♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ printf ("\n"); } } void jiafa (tsmatrix 14, tsmatrix 15) //矩阵的加法 (tsmatrix 16; for (int t=0; t<14. i; t++) { for (int 11=0; tl<14. j; tl++) 16.b[t] [tl]=14.b[t] [tl]+

13、15.b[t] [tl];} printf ("矩阵加完后的结果:\nw); printf(*拿拿拿拿••拿■拿••■拿拿拿拿拿*************\n"); for (int t2=0; t2<14. i; t2++) { for (int t3=0; t3<14. j; t3++) {printf ("%10. 3f\16.b[t2] [t3]); printf("\tR);) printf ("\n");} printf } , void jianfa (tsmatrix 14, tsmatrix 15) //矩阵的减法 {tsmatrix 16; for

14、(int t=0; t<14・i;t++) { for (int tl=0; tl<14. j; tl++) 16.b[t] [tl]=14.b[t] [tl]-15.b[t] [tl];} printf C矩阵相减后的结果:\nH); printf for (int t2=0; t2<14. i; t2++) { for (int t3=0; t3<14. j; t3++) {printf (n%10. 3f\ 16.b[t2] [t3]); printf("\t");} printf ("\nR);} printf(R♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦

15、♦♦♦\nn); } , void chengfa (tsmatrix 14, tsmatrix 15) //矩阵的乘法 { tsmatrix 16; for (int t=0; t<14. i; t++) 4 for (int 11=0; tl<15. j; 11++) { 16. b[t] [tl]=0; for (int k=0; k<14. j; k++) 16. b[t] [tl]+=14. b[t] [k]*15. b[k] [tl];} printf (*•矩阵乘完后的结果:\nn); pr intf for (int t2=0; t2<14. i; t

16、2++) { for (int t3=0; t3<15. j; t3++) {printf C%10. 3f\16.b[t2] [t3]); printf (R\tR);) printf ("\n");} printf } , void niyunsuan( tsmatrix s)〃矩阵的逆运算 { tsmatrix si; float t, x; int k, i, j; for (i=0; i

17、 i+i) si. b[i] [j]=L 0; else si. b[i] [j]=0. 0; } for (i=0; i

18、si. b[i] [j]=sl. b[i] (j]/t;} float y=l・ 0; for (i=0; i

19、\s.b[i] [j]); printf (H\nn); }}} void main0 { tsmatrix 1, 11, 13; sql ist s; int m,n,ml,nl,n4,n5, t, tl, t2, t3, t4, t5, t6, t7, t8; do{ printf(n请输入你要进行的操作:\nw); printf(w>♦>>###♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\nw); printf(R矩阵转置运算请按l\n矩阵的加法运算詔按2\n矩阵的乘法运算请按3\n 矩阵的减法运算请按4\n矩阵的逆运算请按5\n结束请按0: \nn); print

20、f (R**>>**********************\nn); scanf (n%dH, &ml); if (ml=l) { printf 0您选择进行的操作是矩阵的转置运算\n\nn); printf("请输入你要转置矩阵的行数、列数和非家元的个数\nn); scanf C%d-,&tl); scanf ("%d\&t2); scanf C%d\&t3); s. mu=tl; s. nu=t2; s. tu=t3; printf C请输入你要转置矩阵非零元的行下标、列下标(从【1]【1]开始由左至右由上 到下)及其数据(按行逐个输入)\十); for (t4

21、=l; t4<=s. tu; t4++) {scanf (w%d\&t5); scanf ("%dn,&t6); s. data [t4] • i=t5; s. data [t4]• j=t6; scanf&s.data[t4].e);} for (t7-l; t7<=s. nu; t7++) { for (t8=l; t8<=s. mu; t8++) ll.b[t7] [t8]=0. 0; } zhuanzhi (s, 11); } if (ml =2) I printf (*•您选择进行的操作是矩阵的加法运算\n\nn); printf (*请输入矩阵的行数和列

22、数:\nn); scanf &n); scanf ("%dn, &m); 1. i=n; 1. 13. i=n; 13.仙; printf printf (n请输入第一个%d#%d列的矩阵\n〔 1. i, 1. j); { for (t=0; t

23、"请输入第二个%d #%d 列的矩阵\n\13. i, 13. j); for (n4=0; n4

24、 1・ j=m; printf(*拿■拿■拿■拿■拿■拿■・*****************\n"); printf (-请输入第一个%d行%d列的矩阵\nw, 1. i, 1. j); { for (t=0; t

25、(!", &ml); 13. i=nl; 13. j=ml; printf(用■拿拿•・・・・・・・・・・・■・*************\n"); printf ("请输入第二个%d行%宀列的矩阵\n[ 13. i,13. j); for (n4=0; n4<13. i; n4++) { for (n5=0; n5<13. j; n5++) scanf (r%f", &13. b[n4] [n5]);} printf\nw); chengfa (I, 13); } if (ml=4) printf J您选择进行的操作是矩阵的减法运算\n\nw); printf (冃请

26、输入矩阵的行数和列数:\nn); scanf C%cT, &n); scanf (R%dn,&m); 1. i=n; 1. j=m; 13. i=n; 13. j=m; pr intf(用■拿■拿拿拿拿拿拿拿拿拿拿拿拿拿拿*************\n"); printfC请输入第一个%d行%d列的矩阵\十,1. i, 1. j); { for (t=0; t

27、♦♦♦♦♦♦♦♦♦♦♦♦♦♦\nM)J printf ("请输入第二个%d行%(1列的矩阵\n\13. i,13. j); for (n4=0; n4<13. i;n4++) { for(1)5=0; n5<13. j; n5++) scanf &13. b[n4] [n5]);) pr intf(n\nn); jianfa (1, 13); } if (ml=5) { printf C您选择进行的操作是矩阵的逆运算\n\nn); printf 0请输入矩阵的维数(即行和列相等的矩阵):\nn); scanf ("%d", &n); 1. i=n; 1. j=n; pr

28、intf\nn)j printf (n请输入%d e%d列的矩阵\岸,1. i, L j); { for (t=0; t

29、 (2) .矩阵的转置运算: ■弋:\8虚结均\Microsoft Visual Studio\Common\MSDev98\Bin\Debug\sfd.exe* 4 * * T 2 3 4 七 1按按按5 按WOI円青枝 - 尚 - 算运运-務畀十 运法法法运e:1 置黑醤按十 齧的的的请一 迈电距矩題田Q亠 b-t丿vl^Y^A/V^AZv-t?-T4 请输入你要转置矩阵的行数.列数和非零元的个数 *囂和以養賈更矩阵非零元的行下标、列下标〈从[1】⑴开始由左至右由上到下〉及其数据< 穆翳的数

30、据是: 0・000 0・000 32.000 0.000 (3) .矩阵的加法运算: t-- * 旳* 2 3 4 操 I 1S 対*安青青青安 AFkk4nT 1 s 1 > T 4XJ 行" 进I篦运运賈 要“运法法法运0: 你“1加乘减逆按 入3转的的的的请 覚束 餐选择进行的操作是矩阵的加法运算 请输入矩阵的行数和列数: 2 2 请输入第一个2行2列的矩阵 -怜祷■<* 青输入第二个2行2列的矩阵 矩阵加完后的结果: (4) .矩阵的减法运算: 0 •G:\Jti^\Microsoft Visual Studio\Common\MSDev98\Bin\

31、Debug\sfd.exe" fl 2 3 4He 1H5 卄 的*按请请请按卄 行卄请宴B詈卄 进卄尊运运运算卄 要卄运法法法运0:卄 你卄W紮减專卄 A卄转的的的的请卄 <卄^&^^&束十 胥 咲矩矩矩矩 " 您选择进行的操作是矩陈的减法运算 请输入柜陈的行数和列数: 2 2 青输入第一个2行2列的矩阵 ・2 1 2 请输入第二个2行2列的矩阵 1 3 1 3 矩陆相减后的结果: F・*呉*礙■禅■昨昨忙・舟怀舅■怖賀■耳■袄* 怔員■悴怪祯・* 昨植・*禅■祈■覺慨 0.000 -1.000 0.000 -1.000 (5

32、).矩阵的乘法 m 2 3 4 "1枝琴5 W璽里冃土口亦 “请篡B善 *茸运运运算 F -套法法运0: -置加乘减零 “書的的的请 MM辞“:;1斗鋒薛一出 *反叵叵叵乍=o 鶴矩阵的行诙可进行计鄭 b输入第一个矩阵的行数和列数: 2 3 请输入第一个2行3列的矩阵 12 3 2 3 4 ■ ■舅开資 禅 H.HII舅餐 ■舅”开貝耳 修输入第二个矩阵的行数和列数: 3 2 情输入第二个3行2列的矩阵 1 2 2 2 P 1 MXMMXKMMMXMMXXMMMXXMXMXMMXMMMM 矩阵乘完后的结果, 14.00W 9・mw 20.000 14

33、.000 (6).矩阵的逆运算: 2 3 4 15 按至冃壬冃请按 请liBiMi请 算运运运算 运峯袪运0: 技 吐晞的的的请 拒拒矩拒jg 口 您选择进行的操作是矩阵的逆运算 *G:\S^SI3\M icrosoft Visual Studio\Common\MSDev98\Bin\Debug\sfd.exe* 请输入矩阵的维数〈即行和列相等的矩阵〉: 3 请输入3行3列的矩阵 1 2 3 2 2 1 3 4 3 矩阵逆运算后的结果: 1.000 3.000 -2.00(1 -1.500 -3.000 2.500 1.008 1.000 -1.000 (

34、7).矩阵可以循环运算: 13 渐入矩脖的维姝即行和列相尊的矩阵” 选择进行的撫作是矩阵的逆运算 >G:\J?S?8?3\Microsoft Visual Studio\Comfnon\MSDev98\Bin\Debug\sfd.exe* 请输入你要进行的握作: 2 3 4 11^5 按请请请按 B运运运诵和 运法法法运0:KK InM-K- 番的的的请“ 束-M-M -n 二n = n = n = n-bFTM- f 8 2 3 4 操 3 lts5 的*安请请 行咲适11S.掛 进MM"昇运运运茸 要“运法法法运0: 你I直加乘按 入W转的的的的谴 输“&束 六、指导老师评语及成绩

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

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!