数据结构课程设计说明书题目: 稀疏矩阵的运算院系:计算机科学与工程学院专业班级:计算机10-**班学号: 201030****学生姓名: ******指导教师: ******2011年 12 月 28 日安徽理工大学课程设计(论文)任务书计算机科学与工程学院2011年 11 月 8 日安徽理工大学课程设计(论文)成绩评定表目录1 问题描述 (1)2 需求分析 (1)3 总体设计 (2)3.1 Matrix结构的定义 (2)3.2 系统流程图 (3)4 详细设计 (4)4.1 “菜单”界面 (4)4.2 建立矩阵 (4)4.3 显示矩阵 (6)4.4 矩阵的转置 (7)4.5 矩阵的加法运算 (8)4.6 矩阵的减法运算 (9)4.7 矩阵的乘法运算 (9)5 程序运行 (11)5.1 输入矩阵 (11)5.2 矩阵转置 (11)5.3 矩阵加法 (12)5.4 矩阵减法 (12)5.5 矩阵乘法 (12)5.6 退出及错误提示 (13)6 总结 (13)参考文献 (14)1 问题描述(1)题目内容:设计稀疏矩阵运算系统实现两个稀疏矩阵的加法、减法、乘法以及转置操作。
(2)基本要求:①存储结构选择三元组存储方式;②实现一个稀疏矩阵的转置运算;③实现两个稀疏矩阵的加法运算;④实现两个稀疏矩阵的减法运算;⑤实现两个稀疏矩阵的乘法运算。
(3)设计目的:通过本次课程设计,了解稀疏矩阵的一些基本运算操作,并通过相关的程序代码实现。
2 需求分析经过本次的课程设计,我认为稀疏矩阵运算系统主要实现的功能如下:(1)建立矩阵:只有先建立了矩阵,才能够对矩阵进行运算操作,包括建立矩阵A和矩阵B;(2)转置运算操作:对矩阵A或者矩阵B进行转置运算,输出相应的转置矩阵;(3)四则运算操作:该步骤由两个矩阵同时参与,对其进行加法运算(A+B)、减法运算(A-B)以及乘法运算(A*B和B*A);(4)退出:当做完矩阵的运算操作之后,就可以点击它退出该界面。
在这次设计中用到了一些变量和函数,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面会做进一步详细的介绍。
3 总体设计3.1 Matrix结构的定义struct Matrix{int H; //矩阵的行数int L; //矩阵的列数int fly; //矩阵中的非零元个数int zhi[Maxsize][Maxsize];//非零元值[所在行][所在列] };操作集合:(1)Matrix Enter(Matrix M); //建立矩阵M(2)void Display(Matrix M); //显示矩阵M(3)void Transpose(Matrix M); //M矩阵的转置(4)void Add(Matrix M,Matrix N); //求和运算 A+B(5)void Sub(Matrix M,Matrix N); //求差运算 A-B(5)void Multi(Matrix M,Matrix N); //求积运算 A*B(6)int Max(int i,int j); //求最大值(7)Matrix Zero(Matrix M); //矩阵所有元素赋值为03.2 系统流程图该运算系统的系统流程图如图1所示:图1 系统流程图4 详细设计4.1 “菜单”界面进入稀疏矩阵运算系统后的“菜单”界面如图2所示。
图2 “菜单”界面4.2 建立矩阵矩阵在建立之后才能够进行运算操作,建立矩阵A和矩阵B,调用函数Enter(M),首先根据所输入的矩阵M的行数H和列数L,建立H*L的矩阵M,并且调用函数Zero(M)将其所有元素均赋值为0;其次再根据所输入矩阵M 的非零元个数fly做循环控制变量,按提示输入非零元所在的行h和列l以及非零元的值,如果输入的行h或者列l大于矩阵M的行H或列L,则提示输入错误;最后将非零元的值保存在矩阵M中的相应位置。
程序如下:Matrix Enter(Matrix M) //建立矩阵{cin>>M.H>>M.L;cout<<"请输入矩阵的非零元个数:";cin>>M.fly;cout<<endl;if(M.fly>(M.H*M.L)){cout<<"非零元个数多于矩阵元素总数,请重新输入!"<<endl;cout<<"请重新输入矩阵的非零元个数:";cin>>M.fly;}M=Zero(M);int h;int l;for(int n=1;n<=M.fly;n++) //输入非零元所在的行、列和值{cout<<"请输入第"<<n<<"个非零元所在的行和列:";cin>>h>>l;if(h>M.H||l>M.L) // 行列输入错误提示{cout<<"行列输入错误,请重新输入:"<<endl;cout<<"请重新输入第"<<n<<"个非零元所在的行和列:";cin>>h>>l;}cin>>M.zhi[h][l];cout<<endl;}return M;}注:该函数中调用的Zero()函数的功能为将矩阵M根据行数H和列数L 把所有的元素赋值为0,代码如下:Matrix Zero(Matrix M)//矩阵所有元素赋值为0{for(int i=1;i<=M.H;i++)for(int j=1;j<=M.L;j++)M.zhi[i][j]=0;return M;}4.3 显示矩阵建立好矩阵以后,为了验证所建立的矩阵是否成功,以及在后期运算时矩阵的显示,设计该函数,能更直观的看到输入以及输出的矩阵,代码如下:void Display(Matrix M) //显示矩阵{int count=0;cout<<"矩阵为:"<<endl;for(int i=1;i<=M.H;i++)for(int j=1;j<=M.L;j++){printf("%-4d",M.zhi[i][j]);count++;if(count==M.L){cout<<endl;count=0;}}cout<<endl;}4.4 矩阵的转置该函数实现的是矩阵A或矩阵B的转置操作,通过对矩阵的行和列进行调换,利用for()循环语句实现对矩阵A或矩阵B的转置,其代码如下:void Transpose(Matrix M) //矩阵转置{C.H=M.L;C.L=M.H;cout<<"原来的";Display(M);for(int i=1;i<=M.L;i++)for(int j=1;j<=M.H;j++){C.zhi[i][j]=M.zhi[j][i];}cout<<"转置后的";Display(C);}4.5 矩阵的加法运算实现两个矩阵之间的加法运算,即A+B,其代码如下:void Add(Matrix M,Matrix N) //A+B{int n1=Max(M.H,N.H);int n2=Max(M.L,N.L);C.H=n1;C.L=n2;C=Zero(C);for(int i=1;i<=n1;i++)for(int j=1;j<=n2;j++){C.zhi[i][j]=M.zhi[i][j]+N.zhi[i][j];}cout<<" A+B 的运算结果";Display(C);}4.6 矩阵的减法运算实现两个矩阵之间的减法运算,即A-B,其代码如下:void Sub(Matrix M,Matrix N) //A-B{int n1=Max(M.H,N.H);int n2=Max(M.L,N.L);C.H=n1;C.L=n2;C=Zero(C);for(int i=1;i<=n1;i++)for(int j=1;j<=n2;j++){C.zhi[i][j]=M.zhi[i][j]-N.zhi[i][j];}cout<<" A-B 的运算结果";Display(C);}4.7 矩阵的乘法运算实现两个矩阵之间的乘法运算,即A*B,如果矩阵A的列数和矩阵B的行数不相同,则无法进行乘法运算,系统会提示错误,其代码如下:void Multi(Matrix M,Matrix N) //A*B{if(M.L!=N.H){cout<<"矩阵A的列数和矩阵B的行数不相同,无法进行乘法运算!\n";}elseif(M.L==N.H){C.H=M.H;C.L=N.L;C=Zero(C);for(int i=1;i<=Maxsize;i++)for(int j=1;j<=Maxsize;j++)for(int k=1;k<=Maxsize;k++){C.zhi[i][j]+=M.zhi[i][k]*N.zhi[k][j];}cout<<"运算结果";Display(C);}}5 程序运行5.1 输入矩阵运行该运算系统,进入“菜单”选项以后,输入“1”,选择“输入矩阵A”,运算结果如图3所示;输入“2”,选择“输入矩阵B”,运算结果如图4所示:图3 输入矩阵A 图4 输入矩阵B5.2 矩阵转置输入矩阵A和矩阵B以后,在“菜单”提示下,输入“3”,进行矩阵A的转置,运算结果如图5所示;输入“4”,进行矩阵B的转置,运算结果如图6所示:图5 矩阵A的转置图6 矩阵B的转置5.3 矩阵加法在“菜单”提示下,输入“5”,进行两个矩阵的加法运算,即A+B,运算结果如图7所示:图7 矩阵加法5.4 矩阵减法在“菜单”提示下,输入“6”,进行两个矩阵的加法运算,即A-B,运算结果如图8所示:图8 矩阵减法5.5 矩阵乘法在“菜单”提示下,输入“7”,进行两个矩阵的第一种乘法运算,即A*B,运算结果如图9所示;输入“8”,进行两个矩阵的第二种乘法运算,即B*A,运算结果如图10所示:图9 矩阵乘法1(A*B) 图10 矩阵乘法2(B*A)5.6 退出及错误提示算法在运行时还有退出及错误提示功能,在“菜单”提示下,输入“0”则退出系统,如图11所示;若输入0-8以外的数字,则会出现错误提示,如图12所示:图11 退出图12 错误提示6 总结通过对数据结构这门课的学习,我了解到:“数据结构”在计算机科学中是一门综合性的专业基础课。