数据库课程设计 稀疏矩阵.docx
《数据库课程设计 稀疏矩阵.docx》由会员分享,可在线阅读,更多相关《数据库课程设计 稀疏矩阵.docx(13页珍藏版)》请在冰豆网上搜索。
数据库课程设计稀疏矩阵
目录
1设计题目4
1.1任务4
1.3输入5
1.4输出5
2.概要设计6
2.1数据需求分析6
2.2功能需求分析6
2.3数据结构设计6
2.3.1ADT描述6
3.详细设计7
3.1各个程序的实现图7
3.2源程序设计7
4.调试分析8
4.1程序运行截图
5.设计总结9
参考文献10
1设计题目:
稀疏矩阵操作
1.1任务
(1)完成一稀疏矩阵转置,
(2)能够完成两个稀疏矩阵相加,
(3)输出稀疏矩阵
1.2要求
在上交资料中请写明:
存储结构、稀疏矩阵相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
1.3输入
1.4输出
2概要设计
2.1数据需求分析
假设稀疏矩阵M和N均以三元组表作为存储结构;
另设三元组表存放结果矩阵。
2.2功能需求分析
1.输入稀疏矩阵M和N。
2.检测M和N能否相加
3.矩阵相加运算
4.打印输出结果
矩阵相加测试实例:
输入
M=,N=
2.3数据结构设计
2.31.ADT描述:
ADTSparseMatrix{
数据对象:
m和n分别称为矩阵的行数和列数}
数据关系:
R={Row,Col}
基本操作:
CreateSMatrix(&M);
操作结果:
创建稀疏矩阵M。
AddSMatrix(M,N,&Q);
初始条件:
稀疏矩阵M与N的行数列数相等。
操作结果:
求得Q=M+N。
PrintSMatrix(M);
初始条件:
稀疏矩阵M存在。
操作结果:
输出稀疏矩阵M。
}ADTSparseMatrix
3详细设计
(1)各函数的实现图
(2)源程序:
#include
#include
#defineMAXSIZE100
typedefstruct
{
inti,j;
inte;
}Triple;
typedefstruct
{
Tripledata[MAXSIZE+1];
intmu,nu,tu;//mu,nu为稀疏矩阵的行列数,tu是稀疏矩阵的非零元素个数
}TSMatrix;
TSMatrixM,T,S,B,C;
voidCreateMatrix(TSMatrix&M)
{
inti,elem,col,row,mu,nu,tu;
printf(“请输入系数矩阵的行数,列数和非零元素个数:
\n”);
scanf(“%d%d%d”,&mu,&nu,&tu);
M.mu=mu;
M.nu=nu;
M.tu=tu;
for(i=1;i<=tu;i++)
{
printf(“情输入非零元素的行号,列号和值:
\n”);
scanf(“%d%d%d”,&col,&row,&elem);
if(mu<=1||col>M.mu||nu<=1||row>M.nu)
{
printf(“error!
”);
exit(0);
}
else
{
M.data[i].i=col;//输出这个三元组
M.data[i].j=row;
M.data[i].e=elem;
}
}
}
voidFastTransposeSMatrix(TSMatrixM)/*求转置矩阵*/
{
intnum[100];
intcpot[100];
intp,q,t,col=0;
T.mu=M.mu;
T.nu=M.nu;
T.tu=M.tu;
if(T.tu)
{
for(col=1;col<=M.nu;col++)
{
num[col]=0;
}
for(t=1;t<=M.tu;t++)
{
num[M.data[t].j]++;
}
cpot[1]=1;
for(col=2;col<=M.nu;col++)
{
cpot[col]=cpot[col-1]+num[col-1];
}
for(p=1;p<=M.tu;++p)
{
col=M.data[p].j;
q=cpot[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
cpot[col]++;
}
}TSMatrix(T);
}
voidTSMatrix_add(TSMatrixM,TSMatrixT,TSMatrix&ADD)
{
inta=1,b=1,c=1,x;
ADD.mu=M.mu;ADD.nu=M.nu;ADD.tu=0;
for(x=1;x<=M.mu;x++)
{
while(M.data[a].i==x&&T.data[b].i==x)
{
if(M.data[a].j==T.data[b].j)
{
ADD.data[c].i=M.data[a].i;
ADD.data[c].j=M.data[a].j;
ADD.data[c].e=M.data[a].e+T.data[b].e;
c++;a++;b++;
}
elseif(M.data[a].j{
ADD.data[c].i=M.data[a].i;
ADD.data[c].j=M.data[a].j;
ADD.data[c].e=M.data[a].e;
c++;a++;
}
else
{
ADD.data[c].i=T.data[b].i;
ADD.data[c].j=T.data[b].j;
ADD.data[c].e=T.data[b].e;
c++;b++;
}
}
while(M.data[a].i==x)
{
ADD.data[c].i=M.data[a].i;
ADD.data[c].j=M.data[a].j;
ADD.data[c].e=M.data[a].e;
c++;a++;
}
while(T.data[b].i==x)
{
ADD.data[c].i=T.data[b].i;
ADD.data[c].j=T.data[b].j;
ADD.data[c].e=T.data[b].e;
c++;b++;
}
}
ADD.tu=c-1;
}
voidShowMatrix(TSMatrix&M)
{
inti=1,j=1,ir=1;
//printf(“稀疏矩阵为:
\n’’);
for(i=1;i<=M.mu;i++)
{
for(j=1;j<=M.nu;j++)
{
if(M.data[dir].i==i&&M.data[dir].j==j)
{
printf(“%d“,M.data[dir].e);
dir++;
}
else
printf(“0“);
}
printf(“\n”);
}
}
voidmain()
{
while
(1)
{
intc;
M.mu=0;
M.nu=0;
M.tu=0;
printf(“创建一个稀疏矩阵A:
\n”);
printf(“求转置矩阵A:
\n”);
printf(“创建一个稀疏矩阵B:
\n”);
printf(“求转置矩阵B:
\n”);
printf(“求A与B院矩阵的和:
\n”);
while
(1)
{
printf(“请选择:
”);
scanf(“%d”,&c);
switch(c)
{
case1:
CreateMatrix(M);break;
case2:
FastTransposeSMatrix(M);
printf(“原矩阵A为:
\n”);
ShowMatrix(M);
printf(“转置矩阵为:
\n”);
ShowMatrix(T);break;
case3:
CreateMatrix(B);break;
case4:
FastTransposeSMatrix(B);
printf(“原矩阵B为:
\n”);
ShowMatrix(B);
printf(“转置矩阵为:
\n”);
ShowMatrix(T);break;
case5:
FastTransposeSMatrix(M);
TSMatrix_add(M,B,S);
printf(“A与B原矩阵的和为:
\n”);
ShowMatrix(S);break;
}
}
}
}
4.调试分析
(1)选择选项1,创建矩阵A;选择选项2,转置矩阵A
(2)选择选项3,创建矩阵B;选择选项4,转置矩阵B
(3)选择选项5,原矩阵A与B实现相加操作
5.设计总结
调试程序时,应该注意矩阵的调用。
比如,开始的时候没有注意将程序调用!
尽管实现了矩阵的转置和相加,但没有符合题意。
在调试时,我才意识到以前老是犯一个错误,就是在最后加了个return0,这是错误的!
参考文献
格式要求如下:
1专著著录格式
[序号]著者.书名[M].版本(第一版不写).出版地:
出版者,出版年.起止页码
例:
[1]孙家广,杨长青.计算机图形学[M].北京:
清华大学出版社,1995.26~28
[2]SkolinkMI.Radarhandbook[M].NewYork:
McGraw-Hill,1990
2期刊著录格式
[序号]作者.题名[J].刊名,出版年份,卷号(期号):
起止页码
例:
[3]李旭东,宗光华,毕树生,等.生物工程微操作机器人视觉系统的研究[J].北京航空航天大学学报,2002,28(3):
249~252