1、攀枝花学院学生课程设计(论文)课程名称 设计题目 学生姓名: 学 号: 所在院(系): 专 业: 班 级: 指 导 教 师: 职称: 年 月 日攀枝花学院教务处制攀枝花学院 数据结构 课程设计题 目 稀疏矩阵的操作1、课程设计的目的培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)基本功能要求:(1) 稀疏矩
2、阵采用三元组表示,求两个具有相同行列数的稀疏矩阵 A 和 B 的相加矩阵 C,并输出 C。(2)求出 A 的转置矩阵 D,输出 D。测试数据:0987451019672B3、主要参考文献1 数据结构 (C 语言版) ,严蔚敏,清华大学出版社,20032 数据结构题集 ,严蔚敏,清华大学出版社,20053 数据结构 (C 语言版) ,刘大有,高等教育出版社,20044 Data Structure with C+ ,William FordWilliam Topp,清华大学出版社,20034、课程设计工作进度计划第 1 天 完成方案设计与程序框图 第 2、3 天 编写程序代码第 4 天 程序调试
3、分析和结果第 5 天 课程设计报告和总结指导教师(签字) 日期 年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日注:任务书由指导教师填写。攀枝花学院 数据结构 课程设计课程设计(论文)指导教师成绩评定表题目名称 稀疏矩阵的操作评分项目 分值 得分 评价内涵01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。工作表现20% 03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。04 综合运用知识的能力 10能运用所学知识和技能去发现与解决实际问题,能正
4、确处理实验数据,能对课题进行理论分析,得出有价值的结论。05 应用文献的能力 5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06 设计(实验)能力,方案的设计能力 5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。能力水平35%08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)10 具有较强的数据收集、分析、处理、综合的能力。09插图(或图纸)质量、篇幅、设计
5、(论文)规范化程度5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。成果质量45% 11 创新 10 对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年 月 日摘要摘要本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘等操作,最后输出运算后的结果。考虑到难易程度,先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘等操作的方法,再在十字链表下实现。程序通过调试运行,结果与预期一样,初步实现了设
6、计目标。关键词:程序设计,稀疏矩阵,三元组,十字链表目录I目 录摘要 .I绪论 .11设计目的与要求 21.1 题目名称:稀疏矩阵的操作 .21.2 设计要求 21.3 设计涉及知识 22、功能设计 .22.1 需求分析 22.2 总体设计 32.3 数据结构 33功能模块图 .33.1 概要设计 43.2 系统流程图 53.3 菜单函数 64稀疏矩阵的操作的源代码及说明 74.1 矩阵的声明与结构体定义 74.2 矩阵的输出函数模块 74.3 两矩阵相加 84.4 矩阵的转置 94.5 创建矩阵 104.6 主函数模块 .125 程序运行结果 .135.1 经过调试,无错误,无警告 .135
7、.2 创建矩阵并显示登录页面即主菜单 .135.3 运行操作 .145.4 转置矩阵 A145.5 转置矩阵 B155.6 输出矩阵 R155.7 退出程序 .156 编程中遇到的困难及解决方法 .167 总结心得及良好建议 178 致谢 189 参考文献 19绪论0绪论培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。本课程设计主要实现在三元组存储结构与十字链表存储结
8、构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个稀疏矩阵 A 和 B 的和为矩阵 R,并输出 R;求出 A 的转置为矩,输 R。 设计目的与要求和功能设计21设计目的与要求1.1 题目名称:稀疏矩阵的操作1.2 设计要求实现矩阵的输入,并用并采用三元组表示。实现两个矩阵(A,B)的加法。实现对任意一个矩阵(A,B)的转置。可以输出任意矩阵(A,B,R)。 1.3 设计涉及知识注意合理地设计三元组或者十字链表,结合稀疏矩阵的压缩存储方式和特点,将每一功能模块以函数形式分别实现。在此基础上用 C/C+实
9、现其操作。2、功能设计 以三元组、十字链表为存储形式,分别实现两个稀疏矩阵的加法运算、两个稀疏矩阵的乘法运算,以及对任意稀疏矩阵的转置运算。稀疏矩阵要求可为键盘录入的任意矩阵。2.1 需求分析根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,可以在程序中提供矩阵相加,转置矩阵和矩阵输出等操作。本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的
10、地址分配。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩设计目的与要求和功能设计2阵。在对稀疏矩阵功能设计和功能模块图0进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。2.2 总体设计根据上面的需求分析,可以将这个系统的设计分为 1 矩阵相加,2 矩阵转置,3 输出矩阵。2.3 数据结构数据结构采用三元组存储的结构体(包括两个结构体),第一个结构体包括行列下标和非零元素的值,第二个结构体包括非零元素个数的最大值与矩阵的行列值。3功能模块图本系统设计的函数是由一个主函数几个子函数组成的。首先构思大局编出一个主函数,然后根据要实现的功
11、能逐步细分设计,分别解决矩阵相加,矩阵转置,矩阵输出的子函数编程中遇到的问题。首先通过结构体的定义,确定矩阵的大小和非零元素的个数。首先通过创建函数创建矩阵,输入矩阵信息,然后再逐步编写和验证其它功能。显示函数的设计利用 C 语言的循环功能(while,do_while)依次输出信息。矩阵相加是通过判断非零元素是否存在而进行下一步操作,转置是通过交换非零元素的行列下标实现。功能模块图43.1 概要设计系统功能模块图如图 1 所示:主菜单矩阵相加转置矩阵矩阵输出图 1 功能模块图功能模块图53.2 系统流程图 输入错误,重新输入编号menu()=B?menu()=A?menu()=C?菜单选项提
12、示编号不对开始开始创建矩阵(A,B)调用矩阵相加函数调用矩阵转置函数调用矩阵输出函数真真假真假真假真假是否继续?输出结果是结束图 2 系统流程图功能模块图63.3 菜单函数菜单函数首先标出稀疏矩阵运算器,然后给出用户可选择的项目,用户可以通过选择该项前的代码来实现想要实现的功能,其流程图如图 3 所示:char cc 合法?返回 c结束开始输入(A,B,C)真 假图 3 菜单函数流程图稀疏矩阵的操作的源代码及说明74稀疏矩阵的操作的源代码及说明4.1 矩阵的声明与结构体定义#include #include #define MAXSIZE 100 /非零元素的最大个数是 100#define
13、MAXRC 100 typedef struct/定义非零元素的结构体的行,列下标与非零元素的值int i,j;/行,列下标int e; /非零元素的值 Triple;/定义结构体变量 typedef struct/定义矩阵的行,列,及非零元素的个数的结构体 Triple dataMAXSIZE+1;/定义非零元素的最大个数 int mu,nu,tu;/矩阵的行,列和非零元素的个数RLSMatrix;/定义结构体变量4.2 矩阵的输出函数模块void Printf(RLSMatrix *A) /输出函数模块 /用于输出开始定义时的矩阵int arow,i=1,col;/定义循环变量 int z
14、=0;/定义输出零元素的变量/循环输出矩阵for(arow=1;arowmu;arow+) printf(“n“);/矩阵换行 for(col=1;colnu;col+) if(A-datai.i=arow/输出非零元素 else printf(“%-4d“,z); /输出零元素 稀疏矩阵的操作的源代码及说明8printf(“n“); 4.3 两矩阵相加void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *R) /两矩阵加法实现函数 int x=1;/控制列下标 int y=1;/控制行下标 int z=1;/记录 R 中的非零元素的个数 R-tu=0;/
15、先将非零元个数设置为零 R-mu=A-mu;/设置 R 的行数 R-nu=A-nu;/设置 R 的列数 if(A-mu!=B-mu | A-nu!=B-nu)/判断矩阵是否合法printf(“*你输入的矩阵不能相加,请重新开始输入合格的矩阵n*“);exit(0);if(A-munumunumunumu nu mu;i+)/循环赋值for(int j=1;jnu;j+)R-dataz.i=i; R-dataz.j=j; if(A-datax.i=ix+; y+;else if(A-datax.i=i x+;else if(B-datay.i=i y+;稀疏矩阵的操作的源代码及说明9else R
16、-dataz.e=0;/非零项赋值为零z+;R-tu=z; printf(“矩阵 A 为:n“); /输出矩阵 APrintf(A); printf(“矩阵 B 为:n“); /输出矩阵 BPrintf(B); printf(“矩阵相加结果为:n“); /输出相加矩阵Printf(R); 4.4 矩阵的转置void TSM(RLSMatrix *M,RLSMatrix T)/求稀疏矩阵的转置矩阵T.mu=M-nu;/将 M 矩阵的元素附给 T 矩阵 T.nu=M-mu; T.tu=M-tu;if(M-mununu;+col)for(int p=1;ptu;+p)if(M-datap.j=col
17、)T.dataq.i=M-datap.j;T.dataq.j=M-datap.i;T.dataq.e=M-datap.e;+q;printf(“转置矩阵是:n“);Printf(/通过 Printf 函数将转置矩阵输出/*void FTS(RLSMatrix *M,RLSMatrix T)/转置矩阵函数稀疏矩阵的操作的源代码及说明10if(A-mu=1exit(0);else if(A-mu=1exit(0);else printf(“你输入的 B 矩阵不对n“);exit(0);int numMAXSIZE,cpotMAXSIZE,q=0;T.mu=M-nu; T.nu=M-mu; T.tu
18、 = M-tu;/给 T 矩阵的变量附值if(T.tu)/判断是否有非零元素,如有就进行转置for(int col=1;colnu;+col)numcol=0;for(int t=1;ttu;+t)+numM-datat.j;/求 M 中每列含非零元素的个数cpot1=1;/求第 col 列中第一个非零元素在 b.data 中的序号for(col=2;colnu;+col)cpotcol=cpotcol-1+numcol-1;for(int p=1;ptu;p+)col=M-datap.j ; q=cpotcol;T.dataq.i=M-datap.j ;T.dataq.j = M-datap
19、.i;T.dataq.e = M-datap.e;+cpotcol;Printf(*/4.5 创建矩阵void creatjuzheng(RLSMatrix *A,RLSMatrix *B,RLSMatrix *R)int i,j,k,c,numMAXRC;/定义变量 char choice,l=y;/定义控制循环的变量 do printf(“请输入 A 矩阵的行数,列数和非零元个数,如(mu,nu,tu):“); /构造 A矩阵scanf(“%d %d %d“,/输入行列下标和非零元个数 稀疏矩阵的操作的源代码及说明11printf(“请输入 A 矩阵中非零元的行下标,列下标和值,如(i,j
20、,e):n“);/输入矩阵 A 的非零元素的数据 for(k=1;ktu;k+) /输入矩阵 A 的数据scanf(“%d %d %d“, for(k=1;kmu;k+) numk=0;/开始定义非零元三元组表 for(k=1;ktu;k+) +numA-datak.i; printf(“请输入 B 矩阵的行数,列数和非零元个数,如(mu,nu,tu):“);/输入矩阵 B 的数据 scanf(“%d %d %d“, printf(“请输入 B 矩阵中非零元的行下标,列下标和值,如(i,j,e):n“);/输入矩阵 B 的非零元素的数据 for(k=1;ktu;k+) scanf(“%d %d
21、 %d“, for(k=1;kmu;k+) numk=0; /开始定义非零元三元组表 for(k=1;ktu;k+) +numB-datak.i; while(l=y|l=Y)/循环操作稀疏矩阵getchar();while(c!=Ac=getchar();printf(“请输入要进行的操作编号: A:加法 B 转置 C 输出矩阵n“);/运行提示语 c=getchar();switch(c)case A:printf(“*正在进行矩阵的加法运算*n“);ADD(A,B,R);break;case B:printf(“输入你要转换的矩阵编号:(A,B): “);scanf(“%d“,i=1;p
22、rintf(“*正在进行矩阵的转置*n“);while(i=1)if(j=1)TSM(A,*R); i=0;/FTS(A,*R);i=0;else if(j=2)稀疏矩阵的操作的源代码及说明12TSM(B, *R); i=0;/FTS(A,*R);elseprintf(“输入有错误!“);break;case C:printf(“输入你要输出的矩阵编号(A,B,R): “);scanf(“%d“,j=1;while(j=1)if(i=1)Printf(A); j=0;else if(i=2)Printf(B); j=0;elsePrintf(R); j=0;break;default:prin
23、tf(“你的输入不正确!“); i=0;printf(“n 按 Y 或者 y 继续操作: “);scanf(“%s“,printf(“ n 按 Y 或者 y 继续输入新矩阵: “); scanf(“%s“, while(choice=Y|choice=y); 4.6 主函数模块void main() /主函数代码块 RLSMatrix *A,*B,*R;/定义三个结构体变量 printf(“*稀疏矩阵运算器*n“);/运算器提程序运行结果13示语 printf(“n“); A=(RLSMatrix*)malloc(sizeof(RLSMatrix); / 给矩阵 A 分配空间 B=(RLSMa
24、trix*)malloc(sizeof(RLSMatrix); /给矩阵 B 分配空间R=(RLSMatrix*)malloc(sizeof(RLSMatrix); /给矩阵 R 分配空间 creatjuzheng(A,B,R); 5 程序运行结果5.1 经过调试,无错误,无警告5.2 创建矩阵并显示登录页面即主菜单程序运行结果145.3 运行操作5.4 转置矩阵 A程序运行结果155.5 转置矩阵 B5.6 输出矩阵 R5.7 退出程序编程中遇到的困难及解决方法166 编程中遇到的困难及解决方法在编程的过程中遇到了很多问题,比如刚开始的时候几乎不知道该从何下手。后来通过一些简单题目的编写才有
25、了思路。在整个程序的编写过程中在很多地方都遇到了困难。例如,对一些算法的设计有很大漏洞等。后来通过翻阅很多书籍,以及同学的讨论下,在克服了重重的困难后,终于成功的运行了课程设计所要求的程序。这次数据结构课程设计是在 C 语言程序的思想下第一次整体完成的程序设计,所以还有很多的不完美的地方,希望老师予以指出和改正。这次数据结构课程设计是通过查找课本上的范例进行模仿学习自己做出来的,对于很多自己未能解决的问题通过上网百度和参考别人的部分从未使自己的更加完善,最终做到了既符合要求又近乎完美。总结心得及良好建议177 总结心得及良好建议一周的实习过去了,从刚开始的不只如何下手到最后看到自己的程序按自己
26、的想法运行,心里无限喜悦。通过那一周的实习,我认识到书上和老师教的内容是有限的,要想掌握更多的知识我们必须多动脑,多思考,不断地靠自己去学习,同时我们还应向他人请教,从而了解更多自己不知道的知识。回头看来,编写这个程序并不像原来想像的那么难。经过一周的努力我掌握了一些基本的 C 语言进行程序设计的技巧,更深的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,同时学会了一些调试一个较长程序的基本方法,提高了书写程序设计开发文档的能力(书写课程设计报告) 。这一周的实践让我受益匪浅,在此我要感谢孜孜不倦指导我们的老师,感谢在我困惑时给我帮助的同学,感谢学校给我们一个这样动手
27、动脑的机会,使我们在理论与实践相结合方面又得到了一次很好的锻炼,让我们得到很大的收获。致谢188 致谢在这次数据结构的实习过程中,多亏了陈尧老师的息心教导,帮助我们解决我们自己不能解决的问题,也使我们更加意识到数据结构的重要性,学到了一些课堂上不能学到的东西,比如面对问题时要学会思考,学会运用课本上的东西,通过老师的提问也让我知道数据结构里面的很多重点问题还有我们通常容易犯错的地方,感谢老师上学期的教导。参考文献199 参考文献1 贾宗璞、许合利,C 语言程序设计,江苏:中国矿业大学出版社,2007.62 谭浩强,C 程序设计(第四版),北京:清华大学出版社,2001.13The C Programming Language, by Brian W. Kernighan and Dennis M. Ritchie., Pubilished by Prentice-Hall in 19884C 语言编程常见问题解答, 美Paul S. R. Chishohm 等著,张芳妮、吕波译,清华大学出版社, 11996 年 12 月