稀疏矩阵的运算(完美版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业课程设计I报告( 2011 / 2012 学年第二学期)
题目稀疏矩阵的转换
专业软件工程
学生姓名鹏宇
班级学号 ********
指导教师卫丰
指导单位计算机学院软件工程系
日期 2012年6月18号
指导教师成绩评定表
附件:
稀疏矩阵的转换
一、课题容和要求
1.问题描述
设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。
2.需求分析
(1)设计函数建立稀疏矩阵,初始化值。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。
(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。
(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。
(6)构造函数进行稀疏矩阵的转置,并输出结果。
(7)退出系统。
二、设计思路分析
(1)设计函数建立稀疏矩阵,初始化值。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。
(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。
(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。
(6)构造函数进行稀疏矩阵的转置,并输出结果。
(7)退出系统。
三、概要设计
为了实现以上功能,可以从3个方面着手设计。
1.主界面设计
为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。
2.存储结构设计
本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。
3.系统功能设计
本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。
(1)稀疏矩阵的加法:
此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。
(2)稀疏矩阵的乘法:
此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。
(3)稀疏矩阵的转置:
此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始
化一个矩阵,然后进行转置,最终输出结果。
(4)退出:
即退出稀疏矩阵的应用系统。由函数5实现,但用户选择此功能时,系统会提示你是否确实想退出,如果是,则退出,否则继续。
三、模块设计
1.模块设计
本程序包含1个模块:主程序模块加各功能实现模块。
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两个矩阵相加,结果是C
(5)void Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q)
//把A和B两个矩阵相乘,结果是Q
(6)void Zhuanzhi(TSMatrix *a,TSMatrix *b)
// 把A转置
(7)void main()
// 主函数。设定界面的颜色,大小和窗口的标题,调用工作区模块函数
四、详细设计
#include
#include
#include
#define MAXSIZE 40 //假设非零元素个数的最大值为40
#define MAXRC 20 //假设矩阵的最大行数为20
typedef int ElemType;
typedef struct
{
int i,j; //非零元的行下标和列下标
ElemType e; //非零元的值
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int rpos[MAXRC+1]; //各行第一个非零元在三元组的位置表int hs,ls,fls;
}TSMatrix,*Matrix;
void Creat(TSMatrix &M)
{
int i,k;
for(i=1;i<=MAXRC+1;i++)
M.rpos[i]=0;
printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):");
scanf("%d %d %d",&M.hs,&M.ls,&M.fls);
for(i=1;i<=M.fls;i++)
{
printf("请用三元组形式输入矩阵的元素(行列非零元素):");
scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
for(i=1,k=1;i<=M.hs;i++)
{
M.rpos[i]=k;
while(M.data[k].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.ls;
a=b=l=1;
while(a<=A.fls && b<=B.fls)
{
if(A.data[a].i==B.data[b].i)