1、稀疏矩阵的操作课程设计摘 要随着科学技术的飞速发展,人类的生活工作方式发生了很大的改变,工作效率随着高科技的加入有了质的提高,特别是信息技术和网络技术的迅速发展和广泛应用,对社会的政治,经济,军事,文化等领域产生越来越深刻的影响。现代生活各个方面都离不开计算机技术,而C是国际上广泛流行的通用程设语言,在计算机的研究和应用中以展现强大的生命力。C功能强大,使用灵活,既具有高级语言的特点,又具有低级语言的些特点;它既可用于编写系统软件又可用于编写应用软件。本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。在程序设计中,采
2、用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法。程序通过调试运行,结果与预期一样,初步实现了设计目标。关键词:稀疏矩阵,三元组,链表1 课程设计的目的和意义通过本课程设计教学所要达到的目的是:培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。2 需求分析2.1需求概述1.问题描述设计程序用十字链表实现稀疏矩阵的加、乘、转置。基本功能要求:(1)稀
3、疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。(2)求出A的转置矩阵D,输出D。(3)求两个矩阵A和B的乘积。测试数据: 2.需求分析(1)设计函数建立稀疏矩阵,初始化值;(2)设计函数输出稀疏矩阵的;(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵;(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵;(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵;(6)构造函数进行稀疏矩阵的转置,并输出结果;(7)退出系统。2.2 需求环境本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:硬件要求:一台计算机。软件配置:WINDOWS、VC+6
4、.0。3 系统功能设计及数据结构设计3.1模块设计本程序包含1个模块:主程序模块加各功能实现模块。3.2系统子程序及功能设计本系统共设置7个子程序,各子程序的函数名及功能说明如下。(1)typedef int ElemType / 初始化矩阵 ( 2 ) void Creat(TSMatrix &M) /建立矩阵(3)void Print_SMatrix(TSMatrix M) / 输出矩阵的信息以下编号(4)-(6)是稀疏矩阵的基本操作。依次是:相加,相乘,转置等。(4)void Xiangjia(TSMatrix A,TSMatrix B,TSMatrix &C,int n)/把A 和B两
5、个矩阵相加,结果是C(5)void Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q) /把A和B两个矩阵相乘,结果是Q(6)void Zhuanzhi(TSMatrix *a,TSMatrix *b) / 把A转置(7)void main() / 主函数。设定界面的颜色,大小和窗口的标题,调用工作区模块函数 4 算法设计、数据流图及程序结构框图4.1 程序功能模块为了实现以上功能,可以从3个方面着手设计。1主界面设计为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。2存储
6、结构设计本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。3系统功能设计本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。(1)稀疏矩阵的加法:此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。(2)稀疏矩阵的乘法:此功能由函数void
7、Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。(3)稀疏矩阵的转置:此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。(4)退出:即退出稀疏矩阵的应用系统。由函数5实现,但用户选择此功能时,系统会提示你是否确实想退出,如果是,则退出,否则继续。4.2 程序流程图5 程序原代码及其说明#include #include #include #define MAXSIZE 40 /假设非零元素个数的最大值为40 #define MAXRC 20 /假设
8、矩阵的最大行数为20 typedef int ElemType; typedef struct int i,j; /非零元的行下标和列下标 ElemType e; /非零元的值 Triple; typedef struct Triple dataMAXSIZE+1; int rposMAXRC+1; /各行第一个非零元在三元组的位置表 int hs,ls,fls; TSMatrix,*Matrix; void Creat(TSMatrix &M) int i,k; for(i=1;i=MAXRC+1;i+) M.rposi=0; printf(请输入矩阵的行数、列数和非零元个数(以空格隔开):
9、); scanf(%d %d %d,&M.hs,&M.ls,&M.fls); for(i=1;i=M.fls;i+) printf(请用三元组形式输入矩阵的元素(行 列 非零元素):); scanf(%d %d %d,&M.datai.i,&M.datai.j,&M.datai.e); for(i=1,k=1;i=M.hs;i+) M.rposi=k; while(M.datak.i=i & k=M.fls) k+; void Xiangjia(TSMatrix A,TSMatrix B,TSMatrix &C,int n) int a,b,temp,l; C.hs=A.hs; C.ls=A.
10、ls; a=b=l=1; while(a=A.fls & b=B.fls) if(A.dataa.i=B.datab.i) if(A.dataa.jB.datab.j) C.datal=B.datab; C.datal+.e=n*B.datab+.e; else temp=A.dataa.e+n*B.datab.e; if(temp) C.datal=A.dataa; C.datal.e=temp; l+; a+;b+; else if(A.dataa.iB.datab.i) C.datal+=A.dataa+; else C.datal=B.datab; C.datal+.e=n*B.dat
11、ab+.e; while(a=A.fls) C.datal+=A.dataa+; while(b=B.fls) C.datal=B.datab; C.datal+.e=n*B.datab+.e; C.fls=l-1; int Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q) int arow,brow,ccol,tp,p,q,t; int ctempMAXRC+1; if(A.ls!=B.hs) return 0; Q.hs=A.hs;Q.ls=B.ls;Q.fls=0; if(A.fls*B.fls) for(arow=1;arow=A.hs;aro
12、w+) for(ccol=1;ccol=Q.ls;ccol+) ctempccol=0; Q.rposarow=Q.fls+1; if(arowA.hs) tp=A.rposarow+1; else tp=A.fls+1; for(p=A.rposarow;ptp;p+) brow=A.datap.j; if(browB.hs) t=B.rposbrow+1; else t=B.fls+1; for(q=B.rposbrow;qt;q+) ccol=B.dataq.j; ctempccol+=A.datap.e*B.dataq.e; for(ccol=1;ccolMAXSIZE) return
13、 0; Q.dataQ.fls.i=arow; Q.dataQ.fls.j=ccol; Q.dataQ.fls.e=ctempccol; return 1; void Print_SMatrix(TSMatrix M) int k,l,n; Matrix p; p=&M; for(k=1,n=1;khs;k+) for(l=1;lls;l+) if(p-datan.i=k & p-datan.j=l) printf(%5d,p-datan.e); n+; else printf(%5d,0); printf(n); printf(n); void Zhuanzhi(TSMatrix *a,TS
14、Matrix *b) int q,col,p; b-hs=a-ls; b-ls=a-hs; b-fls=a-fls; if(b-fls) q=1; for(col=1;colls;col+) for(p=1;pfls;p+) if(a-datap.j=col) b-dataq.i=a-datap.j; b-dataq.j=a-datap.i; b-dataq.e=a-datap.e; +q; void Destory_SMatrix(TSMatrix &M) M.hs=M.ls=M.fls=0; void main() TSMatrix A,B,C; TSMatrix *p=&A,*q=&B;
15、 int flag,n; while(true) system(cls); printf(nnn); printf(tn); printf(t * 稀疏矩阵的加、转、乘 * n); printf(tn); printf(t 1、稀疏矩阵的加法 n); printf(t 2、稀疏矩阵的转置 n); printf(t 3、稀疏矩阵的乘法 n); printf(t 4、退出该应用程序 n); printf(t By 陈强 计算机科学与技术 n); printf(tn); printf(输入要进行的项目的编号:); scanf(%d,&flag); if(flag=4) break; Creat(A)
16、; printf(矩阵A:n); Print_SMatrix(A); switch(flag) case 1: Creat(B);n=1; printf(矩阵B:n); Print_SMatrix(B); if(A.hs=B.hs & A.ls=B.ls) printf(A+B:n); Xiangjia(A,B,C,n); Print_SMatrix(C); else printf(错误!行列不一致n); break; case 2: printf(A-B:n); Zhuanzhi(p,q); Print_SMatrix(B); break; case 3: Creat(B); printf(
17、矩阵B:n); Print_SMatrix(B); printf(A*B:n); n=Xiangcheng(A,B,C); if(!n) printf(错误!行列不匹配n); else Print_SMatrix(C); break; default: printf(输入错误!n); Destory_SMatrix(A); Destory_SMatrix(B); Destory_SMatrix(C); getchar();getchar(); printf(nttt *程序已经退出*n); getchar();6 程序测试及运行结果说明由需求分析可知,稀疏矩阵的操作程序设计是在VC+6.0实现
18、环境下全过程演示。本程序已调试成功并实现了其功能。其运行结果如下:图6.1系统主界面:图6.2.1运行加法运算:图6.2.2运行加法运算:图6.3.1运行乘法运算:图6.3.2运行乘法运算:图6.4运行矩阵转置运算:图6.5系统退出界面:7 总结总通过本次实验,在我的学习理解上有很大的促进作用。单单对稀疏矩阵,我了解了由于矩阵在程序中常使用二维阵列表示,二维阵列的大小稀疏矩阵与使用的存储器空间成正比,如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。 二维数组Amn中有N个非零元素,若Nm*n,则称A为稀疏矩阵。 由于稀疏矩阵中含有很多的0元素,在计算机中存储会浪费很多的空间,因此我们通常采用压缩存储的方法。主要参考资料1数据结构(C语言版),严蔚敏,清华大学出版社,20032数据结构题集,严蔚敏,清华大学出版社,20053数据结构(C语言版),刘大有,高等教育出版社,20044Data Structure with C+,William FordWilliam Topp,清华大学出版社,2003
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1