对称矩阵压缩算法的实现

上传人:bei****lei 文档编号:232550696 上传时间:2023-09-21 格式:DOC 页数:28 大小:775.08KB
收藏 版权申诉 举报 下载
对称矩阵压缩算法的实现_第1页
第1页 / 共28页
对称矩阵压缩算法的实现_第2页
第2页 / 共28页
对称矩阵压缩算法的实现_第3页
第3页 / 共28页
资源描述:

《对称矩阵压缩算法的实现》由会员分享,可在线阅读,更多相关《对称矩阵压缩算法的实现(28页珍藏版)》请在装配图网上搜索。

1、数据结构课程设计设计说明书对称矩阵压缩算法的实现学生姓名学号班级成绩指导教师数学与计算机科学学院2015年1月2日课程设计任务书20142015学年第一学期专业: 网络工程 学号: 姓名: 课程设计名称: 数据结构课程设计 设 计 题 目: 对称矩阵压缩算法的实现 完 成 期 限:自 2014 年 12 月 22 日至 2015 年 1 月 2 日共 2 周设计内容及要求:矩阵是一个在科学计算与工程问题中常见的数学对象,在程序设计中这种数学对象常常采用二维数组来存储,然而,有些矩阵具有某些特殊性,如对称矩阵,若用数组存储对称矩阵其空间代价较高,为了降低对称矩阵存储代价,常常采用一维数组只存储对

2、称矩阵中的对角线及其以上或以下元素值,此过程需要进行二维数组(矩阵)下标到一维数组下标的存储变换。请用C/C+语言编写一个程序实现对称矩阵的一维数组压缩存储。设计过程以及写作要求如下:(1)要针对本题目,认真研究所设计的内容,用简明扼要的语言描述课题,给出课题的基本内容及要求;(2)根据数据结构的相关知识给出实现对任意矩阵的输入、对称性的判断、对称矩阵压缩存储的转换,及对转换后的一维数组元素以数学形式打印输出原矩阵的算法基本策略及思路;(3)给出较为详尽数据结构与算法,算法可以用流程图、伪代码等描述手段进行描述;(4)给出一个完整的算法实现的C/C+程序,算法中的各子算法要力求用函数来实现;(

3、5)对编写的程序要进行详尽的测试分析;(6)对本课题的设计工作要进行一个完整深刻的总结。最终设计成果形式为:1、 设计软件一套;2、 撰写一份课程设计说明书一份,打印并装订成册。指导教师(签字): 教研室主任(签字): 批准日期: 年 月 日数据结构 课程设计评阅书题 目对称矩阵压缩算法的实现学生姓名学 号指导教师评语及成绩成 绩: 教师签名: 年 月 日教研室意见总成绩: 室主任签名: 年 月 日摘要本课程设计是以vc+语言编程软件功能和相关数据结构的知识实现的,借助Visual C+6.0工具实现对称矩阵压缩算法功能的源代码。将矩阵以二维数组的形式存放,通过对称矩阵的压缩存储,从而达到节省

4、存储空间的目的。 关键词:VC+;对称矩阵;压缩存储;节省空间目 录1 课题描述12 设计要求22.1设计要求22.2各模块程序的伪码算法22.2各模块之间的调用关系图23 模块内的核心算法及流程图33.1构建任意矩阵33.1.1构建矩阵代码43.2判断矩阵是否对称43.2.1判断矩阵是否对称代码63.3 对对称矩阵进行压缩存储63.3.1 对对称矩阵进行压缩存储代码83.4 将存储后的矩阵按照数学形式输出83.4.1 将存储后的矩阵按照数学形式输出的代码104 详细代码115 程序测试165.1 合法输入165.1.1 菜单165.1.2构建任意矩阵165.1.3 成功构建矩阵对其进行判断是

5、否为对称矩阵175.1.4 对对称矩阵进行压缩存储185.1.5 按照数学形式输出所压缩的矩阵195.1.6 退出程序205.2 非法输入205.2.1 非法操作菜单205.2.2 n值的非法输入21总结22参考资料23 1 课题描述矩阵是很多科学与工程计算问题中研究的数学对象。在此,人们感兴趣的不是矩阵本身,而是如何存储矩阵的元,从而使矩阵的各种运算能有效的进行。通常,用高级语言编制程序时,都是用二维数组来存储矩阵元。有的程序设计语言中还提供了各种矩阵运算,用户使用时都很方便,然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素。有时为了节省存储空间,可以

6、对这类矩阵进行压缩存储。压缩矩阵:为多个值相同的元止分配一个存储空间;对零元不分配空间。开发工具:Visual C+6.02 设计要求2.1设计要求本次课程设计采用结构化程序设计方法,从整体到模块、逐步细化,模块化设计、结构化编码的算法只适合特殊矩阵中的对称矩阵,面对一般矩阵,不进行压缩存储。存储时采用的顺序存储结构主要为数组,包括一维数组和二维数组。程序中定义了一个结构体Array s,其成员为两个数组,具体设计过程如下:2.2各模块程序的伪码算法(1)构建矩阵: CreatMatrix(Array &s); 操作结果:创建任意n*n矩阵。(2)判断矩阵是否对称: JudgeMatrix(A

7、rray &s); 初始条件:矩阵M存在。 操作结果:判断M是否为对称矩阵,若不是,则重新构建,最终得到对称矩阵。(3)压缩存储: CompMatrix(Array &s); 初始条件:矩阵M为对称矩阵。 操作结果:将M压缩存储到一维数组中。(4)输出所压缩的对称矩阵: OutputMatrix(Array &s); 初始条件:矩阵M已被压缩存储到一维数组中。 操作结果:将M按照数学形式输出。2.2各模块之间的调用关系图各模块之间的调用关系如图2.1所示。main CreatMatrix JudgeMatrix CompMatrix OutputMatrix CreatMatrix图2.1 各

8、模块之间的调用关系3 模块内的核心算法及流程图3.1构建任意矩阵在构建任意n*n矩阵这个模块中,利用了二维数组来接收所构建矩阵的元。CreatMatrix()函数:在构建矩阵时,首先要得到n值,将n值带入构建矩阵中,而输入部分用for循环控制输入格式及元素个数,输入前已规定建立任意矩阵并且元素个数为n*n个,接收时以二维数组的形式来存储从键盘输入的任意元素。输出所构建的矩阵时仍用for循环来输出。输入流程图如图3.1所示,输出流程图如图3.2所示,其中n为行下表或列下标。 开始 开始 输入n值 i=1 行下标初始化为1 n是非零自然数 N 判断非法输入 n0或者n为字符 判断i值与 Y i=n

9、 行下标 输入矩阵 系统提示 N n值的关系 Y i=1 行下标初始化为1 j=1 列下标初始化为1 N i=n 判断i值与行下标n值的关系 Y j=n 判断 j值 j=1 列下标初始化为1 N 与列下标 n值的关系 Y j=n 判断j值与列下标 输出元素 NY n值的关系 s.Mij 存入元素 j+ j+ i+ i+ 结束 结束 图3.1输入流程图 图3.2输出流程图3.1.1构建矩阵代码int CreatMatrix(Array &s)/构建任意矩阵int i,j;printf(t请输入您需要构建n阶矩阵中的n值n);scanf(%d,&n);if(n0n);scanf(%d,&n);ff

10、lush(stdin);printf(t请输入数组中各元素,输入时请注意:s.Mij=s.Mjin);for(i=1;i=n;i+)for(j=1;j=n;j+)scanf(%d,&s.Mij);printf(tt您构建的矩阵为:n);printf(n);for(i=1;i=n;i+)for(j=1;j=n;j+)printf(t%2d,s.Mij); printf(n);return ok;3.2判断矩阵是否对称由于矩阵的压缩只针对对称矩阵,因此在创建任意矩阵后要判断是否符合压缩要求。JudgeMatrix()函数:函数包括两个小部分,判断部分和判断结果输出部分。在对称矩阵中,Mij=Mji

11、为判断矩阵是否对称的依据,因此,要判断第一步输入的矩阵是否是对称矩阵,就是要判断这一条件是否成立,如果成立,则程序结束,若不成立,则调用函数CreatMatrix重新输入,构建矩阵并再次判断,直到输入的矩阵为对称矩阵结束。判断流程图如图3.3所示,判断结果流程图如图3.4所示。 开始 开始 i=1 行下标初始化为1 调用判断 函数 N i=n 判断i值与行下 得到k值 标n值的关系 Y k=0 j=1 列下标初始 N 化为1 Y N 对称矩阵 构建的不j=n 判断j值与 构建成功 是对称矩阵 列下标n值 Y 的关系 调用 CreatMatrix s.Mij!=s.Mji 函数 沿对称线元素不对

12、称 矩阵构建成功N Y k+ 结束j+ 图3.4 判断结果流程图 i+ 结束 图3.3 判断流程图3.2.1判断矩阵是否对称代码int JudgeMatrix(Array s)/判断矩阵是否为对称矩阵int i,j,k;k=0;for(i=1;i=n;i+)for(j=1;j=n;j+)if(s.Mij!=s.Mji)k+;printf(tt判断得到不相等元素的对数k=%d,k);printf(n);if(k=0)printf(n);printf(ttMij=Mjin);printf(ntt对称矩阵构建正确!请您选择其他服务!n);elseprintf(n);printf(tt您构建的矩阵不是

13、对称矩阵);return 1;return 0;3.3 对对称矩阵进行压缩存储当判断得到对称矩阵后,便可对其进行压缩存储,将一维数组作为对称矩阵的存储结构从而实现存储过程。CompMatrix()函数:此函数功能是对对称矩阵进行压缩存储,即就是将二维数组压缩存储到一维数组中,压缩存储的元素为下三角元,再将压缩后的数组元素进行输出。压缩部分:通过赋值语句s.mk=s.Mij,将矩阵进行压缩存储。压缩流程图如图3.5所示,输出流程图如图3.6所示 开始 开始 i=1,k=0 初始化行下标i=1, 压缩时元素个数k一维数组下标k=0 N i=n 判断行下标 kn*(n+1)/2 i值与 N值的 下三

14、角元素个数 Y 关系 N 初始化 Y j=1 列下标j 输出压缩后矩阵元素s.Mk N j=i 列下标 与行下标 Y 的比较 结束 s.mk=s.Mij 图3.6 输出流程图 下三角元素赋值给 s.mk k+j+i+ 结束 图3.5 压缩流程图3.3.1 对对称矩阵进行压缩存储代码int CompMatrix(Array &s)/对对称矩阵进行压缩存储int i,j,k=0;for(i=1;i=n;i+)for(j=1;j=i;j+)s.mk=s.Mij;k+;printf(tt压缩后的矩阵存入一维数组后各元素为:n);printf(n);for(k=0;k=j时,k=i*(i-1)/2+j-

15、1;当ij时,k=j*(j-1)/2+i-1。赋值流程图如图3.7所示,输出流程图如图3.8所示。 开始 开始 i=1 初始化i=1i=1 初始化i=1 NN 判断i值与 i=n 判断i值与 i=n 行下标n值 行下标n值的的关系Y 关系Y j=1 初始化j=1 j=1 初始化 j=1 N 判断列下 判断列下标j j=i 标j值 j=n 与n值的 与行下标 大小关系 Y i值得大小Y k=i*(i-1)/2+j-1 输出矩阵 k=j*(j-1)/2+i-1 j+ s.Mij=s.mki+ j+ 结束 i+ 图3.8 输出流程图 结束 图3.7 赋值流程图 3.4.1 将存储后的矩阵按照数学形式

16、输出的代码int OutputMatrix(Array s)/按照数学形式输出矩阵int i,j,k=0;for(i=1;i=n;i+)for(j=1;j=j)k=i*(i-1)/2+j-1;s.Mij=s.mk;elsek=j*(j-1)/2+i-1;s.Mij=s.mk;printf(tt您压缩存储的矩阵按照数学形式输出为:n);printf(n);for(i=1;i=n;i+)for(j=1;j=n;j+)printf(t%2d,s.Mij);printf(n);return ok;4 详细代码#include#include#include#define OVERFLOW -2#def

17、ine UNDERFLOW -1#define ok 1typedef structint M100100;int m100;Array;Array s;int n;int CreatMatrix(Array &s)/构建任意矩阵int i,j;/printf(tt请输入数组中各元素,输入时请注意:s.Mij=s.Mjin);printf(t请输入您需要构建n阶矩阵中的n值n);scanf(%d,&n);if(n0n);scanf(%d,&n);fflush(stdin);printf(t请输入数组中各元素,输入时请注意:s.Mij=s.Mjin);for(i=1;i=n;i+)for(j=1

18、;j=n;j+)scanf(%d,&s.Mij);printf(tt您构建的矩阵为:n);printf(n);for(i=1;i=n;i+)for(j=1;j=n;j+)printf(t%2d,s.Mij);printf(n);return ok;int JudgeMatrix(Array s)/判断矩阵是否为对称矩阵int i,j,k;k=0;for(i=1;i=n;i+)for(j=1;j=n;j+)if(s.Mij!=s.Mji)k+;printf(tt判断得到不相等元素的对数k=%d,k);printf(n);if(k=0)printf(n);printf(ttMij=Mjin);pr

19、intf(ntt对称矩阵构建正确!请您选择其他服务!n);elseprintf(n);printf(tt您构建的矩阵不是对称矩阵);return 1;return 0;int CompMatrix(Array &s)/对对称矩阵进行压缩存储int i,j,k=0;for(i=1;i=n;i+)for(j=1;j=i;j+)s.mk=s.Mij;k+;printf(tt压缩后的矩阵存入一维数组后各元素为:n);printf(n);for(k=0;kn*(n+1)/2;k+)printf(%2d,s.mk);return ok;int OutputMatrix(Array s)/按照数学形式输出矩

20、阵int i,j,k=0;for(i=1;i=n;i+)for(j=1;j=j)k=i*(i-1)/2+j-1;s.Mij=s.mk;elsek=j*(j-1)/2+i-1;s.Mij=s.mk;printf(tt您压缩存储的矩阵按照数学形式输出为:n);printf(n);for(i=1;i=n;i+)for(j=1;j=n;j+)printf(t%2d,s.Mij);printf(n);return ok;int menu_select() /菜单char c;doprintf(tt*n);printf(tt* 对称矩阵压缩算法的实现 *n);printf(tt* 1.构建任意N*N个元素

21、的矩阵 *n);printf(tt* 2.判断所建矩阵是否为对称矩阵 *n);printf(tt* 3.对对称矩阵进行压缩存储 *n);printf(tt* 4.按照数学形式输出所压缩的矩阵 *n);printf(tt* 5.退出程序 *n);printf(tt*n);printf(tt*请您输入选项1-5*n);fflush(stdin);c=getchar();while(c5);return(c); /返回选择void main() /主函数char n=1;int m;for(;)switch(menu_select() )case 1:printf(n);printf(tttn);p

22、rintf(n);CreatMatrix(s);printf(n);printf(tt您已经成功构建*任意*矩阵!请您选择其他服务!n);printf(n);printf(ttt);system(pause);break;case2:printf(n);printf(tttn);printf(n);m=JudgeMatrix(s);printf(n);if(m=1)CreatMatrix(s);printf(n);printf(ttt);system(pause);break;case3:printf(n);printf(tttn);printf(n);printf(tt只存储其下三角各元素:

23、n);printf(n);CompMatrix(s);printf(n);printf(ttt);system(pause);break;case4:printf(n);printf(tttn);printf(n);OutputMatrix(s);printf(n);printf(ttt);system(pause);break;case5:printf(n);printf(ttt祝您好运!n);printf(ttt);exit(0);5 程序测试5.1 合法输入5.1.1 菜单为了使程序界面能够美化,使用* *对其进行框圈,并且使用t使其跳到下一个制表位置,菜单的使用,使程序的操作简单明了,

24、如图5.1所示。图5.1 菜单5.1.2构建任意矩阵在对矩阵进行构建时,先确定矩阵的阶数n,然后对矩阵中的元素进行录入,录入时用空格键区分两个数字,即使输入元素超过n*n个,也只取前n*n个元素,并将其以矩阵的形式输出,如图5.2所示。图5.2 构建任意矩阵5.1.3 成功构建矩阵对其进行判断是否为对称矩阵该矩阵是否为对称矩阵,是通过k值进行判断,对于上述矩阵,对角线为1、7、3、9、5;如若对称则s.Mij=s.Mji,但通过矩阵的输出,我们发现(6、2)(1、3)(6、4)(1、5)(2、8)(7、9).10组数据中,没有一组内的数据相同,则不相等的元素数为k=20.所以该矩阵不是对称矩阵

25、。如图5.3所示图5.3 矩阵的对称判断(不对称矩阵)在矩阵输入时,必须是对称矩阵才可以进行第三步第四步操作,否则在判断对称矩阵不是对称矩阵之后,系统提示重新输入数据,在输入并对其判断为对称矩阵之后,该矩阵是对称矩阵,因为对角线为1、3、5、7、9;如若对称则s.Mij=s.Mji,通过矩阵的输出,我们发现(2,2)(3,3)(4,4)(4,4)(5,5)(6,6).10组数据中,括号内的元素都相同,则不相等的元素数为k=0.所以该矩阵是对称矩阵,如图所示5.4。图5.4 矩阵的对称判断(对称矩阵)5.1.4 对对称矩阵进行压缩存储对对称矩阵进行压缩存储,其存储的元素为下三角(包括对角线)中的

26、元,即1、2、3、3、4、5、4、5、6、7、5、6、7、8、9,存储元素的个数为k=n*(n+1)/2,即15,如图5.5所示。图5.5 对称矩阵的压缩5.1.5 按照数学形式输出所压缩的矩阵矩阵是很多科学与工程计算问题中研究的数学对象,因此,程序编写的最终目的是使其能够以数学形式输出,方便人们的研究,如图5.6所示。图5.6 数学形式输出矩阵5.1.6 退出程序退出程序按钮使得程序更加完整,礼貌的结束语,使得程序更加文明,如图5.7所示。图5.7 退出程序5.2 非法输入5.2.1 非法操作菜单在程序操作过程中,会因程序操作不当等各种原因,而导致程序无法进行,在对程序进行修改之后,使得非法

27、操作程序得到相应的解决,也让程序更加完善。在对程序菜单进行操作时,例如,输入的选项值不在菜单中这一非法操作后,程序会重新弹出菜单栏,重新选择选择以便程序能够完整的进行下去。如图5.8所示图5.8 非法操作菜单5.2.2 n值的非法输入在程序进行的过程中,测试者会因外界或其他因素的影响,而导致程序在控制方面出现问题,如在输入n值为-1的情况下,程序无法执行,如若跳出窗口,则会使得之前的测试无法完整的呈现,此时,若程序中增加提示语言重新输入n值,则会使程序的测试更加连贯完整,如图5.9所示。图5.9 n值的非法输入总结在本次课程设计中,因自身实际操作能力的不足,在编程过程中出现了很多的错误,通过测

28、试提示以及小组成员的帮助下,使得程序能够完整的运行。在实验过程中,通过对课本对称矩阵知识的了解并配合所查的资料,使得自己对对称矩阵的输入,判断,压缩存储以及以数学形式的输出有了更深的理解,通过不断的尝试与改正,能够让任意n阶矩阵实现以上操作。在整个课设过程中,我深刻的认识到自己的不足,对C语言的掌握不够精通,对其中很多算法一知半解,运用不够熟练。逻辑思维能力不够清晰,虽然知道各大模块,但是模块里的算法的逻辑顺序还是很容易混淆,使得程序在运行过程中频频出错。通过本次课程设计,我认识到掌握一门语言不仅需要熟悉大量的基础知识,还要多加练习加强实践操作,只有在不断发现问题的过程中才能认识到自己的不足。程序的编写是需要很多的知识才能最终完成。不管做什么任务,团队学习和互相帮助是非常重要的,在团队的帮助下,可以汇聚更多的想法和办法,有利于任务的顺利完成。学习是无止境的,不管遇到什么难题,一定要查阅相关资料来解决问题,通过查阅资料,也可以丰富自己的知识,对今后的学习也会有所帮助。参考资料1.谭浩强,C程序设计(第三版).清华大学出版社2.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社22

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