数据结构课程设计五基本稀疏矩阵运算的运算器.docx
《数据结构课程设计五基本稀疏矩阵运算的运算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计五基本稀疏矩阵运算的运算器.docx(18页珍藏版)》请在冰点文库上搜索。
![数据结构课程设计五基本稀疏矩阵运算的运算器.docx](https://file1.bingdoc.com/fileroot1/2023-6/30/4c9e7108-d98c-4a60-a628-465db96b94e6/4c9e7108-d98c-4a60-a628-465db96b94e61.gif)
数据结构课程设计五基本稀疏矩阵运算的运算器
数据结构课程设计五
····
题目:
严蔚敏习题实习4第1个:
实现一个能进行基本稀疏矩阵运算的运算器
一、需求分析
1、本程序实现一个基本稀疏矩阵的简单运算,包括加、减、乘。
2、执行操作前应先创造要进行运算的两个矩阵,然后再选择进行相应的操作。
3、以三元组顺序表表示稀疏矩阵,实现二个矩阵相加,相减,相乘的运算;稀疏矩阵的输入形式为三元组表示,运算结果则为通常的阵列形式列出!
4、首先输入矩阵的行数和列数,并判别给出的两个矩阵和行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20;
5、程序先给出了菜单项,用户只需按照菜单提示进行相应的操作就行了。
6、测试数据:
二、概要设计
1、抽象数据类型三元组的定义如下:
ADTTriple
{
数据对象:
D={ai|ai(-ElemSet,i=1,2,...,n,n>=0};
数据关系:
R1={|ai-1,ai(-D,i=2,...,n}
基本操作:
略
}
2、基于三元组顺序表表示的矩阵操作:
(1)创建三元组顺序表表示的矩阵:
voidcreateMatrix(TSMatrix&A)
(2)初始化矩阵:
voidinitMatrix(TSMatrix&A)
(3)相加:
voidadd(TSMatrixA,TSMatrixB,TSMatrix&C)
(4)相减:
voidsub(TSMatrixA,TSMatrix&B,TSMatrix&C)
(5)找m行n列元素在A中顺序表中的位置:
intsearch(TSMatrixA,intm,intn)
(6)相乘;voidmult(TSMatrixA,TSMatrixB,TSMatrix&C)
(7)输入以阵列形式表示的矩阵:
voidprint(TSMatrixA)
3、主程序
Voidmain()
{
While(true)
{
调用相应函数执行相应操作;
输出操作结果;
}
}
4、本程序只有两个模块,调用关系简单:
三、详细设计
1、三元组结构描述:
#defineMAXSIZE20
usingnamespacestd;
typedefstruct
{
introw;
intcol;
inte;
}Triple;
typedefstruct
{
Tripledate[MAXSIZE];
intm,n,len;
}TSMatrix;
voidinitMatrix(TSMatrix&A)
{
A.len=0;
A.m=0;
A.n=0;
for(inti=0;i{
A.date[i].col=0;
A.date[i].e=0;
A.date[i].row=0;
}
}
2、各种操作函数源代码:
voidcreateMatrix(TSMatrix&A)
{
initMatrix(A);
cout<<"创建矩阵:
";
cout<<"请输入矩阵的行列值及非0元素个数\n";
cin>>A.m>>A.n>>A.len;
for(inti=0;i{
cout<<"请输入第"<
";
cin>>A.date[i].row;
cin>>A.date[i].col;
cin>>A.date[i].e;
}
}
voidadd(TSMatrixA,TSMatrixB,TSMatrix&C)//相加
{
if(A.m==B.m&&A.n==B.n)
{
inti=0,j=0;
intk=0;
C.m=A.m;
C.n=A.n;
while(i{
if(i==A.len&&j{
C.date[k].col=B.date[j].col;
C.date[k].row=B.date[j].row;
C.date[k++].e=B.date[j].e;
C.len++;
j++;
}
elseif(i{
C.date[k].col=A.date[i].col;
C.date[k].row=A.date[i].row;
C.date[k++].e=A.date[i].e;
C.len++;
i++;
}
else
{
if(A.date[i].row>B.date[j].row)
{
C.date[k].col=B.date[j].col;
C.date[k].row=B.date[j].row;
C.date[k++].e=B.date[j].e;
C.len++;
j++;
}
elseif(A.date[i].row{
C.date[k].col=A.date[i].col;
C.date[k].row=A.date[i].row;
C.date[k++].e=A.date[i].e;
C.len++;
i++;
}
else
{
if(A.date[i].col==B.date[j].col)
{
if(A.date[i].e+B.date[j].e!
=0)
{
C.date[k].col=A.date[i].col;
C.date[k].row=A.date[i].row;
C.date[k++].e=A.date[i].e+B.date[j].e;
C.len++;
}
i++;
j++;
}
elseif(A.date[i].col>B.date[j].col)
{
C.date[k].col=B.date[j].col;
C.date[k].row=B.date[j].row;
C.date[k++].e=B.date[j].e;
C.len++;
j++;
}
elseif(A.date[i].col{
C.date[k].col=A.date[i].col;
C.date[k].row=A.date[i].row;
C.date[k++].e=A.date[i].e;
C.len++;
i++;
}
}
}
}
}
else
{
cout<<"不能相加!
";
}
}
voidsub(TSMatrixA,TSMatrix&B,TSMatrix&C)//相减
{
for(intk=0;k{
B.date[k].e=-B.date[k].e;
}
if(A.m==B.m&&A.n==B.n)
{
add(A,B,C);
}
else
cout<<"不能相减!
";
for(k=0;k{
B.date[k].e=-B.date[k].e;
}
}
intsearch(TSMatrixA,intm,intn)
{
intflag=-1;
for(inti=0;i{
if(A.date[i].row==m&&A.date[i].col==n)
{
flag=i;
break;
}
}
returnflag;
}
voidmult(TSMatrixA,TSMatrixB,TSMatrix&C)//相乘
{
inti=0,j=0;
if(A.n==B.m)
{
C.m=A.m;
C.n=B.n;
for(i=0;i{
for(j=0;j{
if(A.date[i].col==B.date[j].row)
{
intflag=search(C,A.date[i].row,B.date[j].col);
if(flag==-1)
{
C.date[C.len].col=B.date[j].col;
C.date[C.len].row=A.date[i].row;
C.date[C.len++].e=A.date[i].e*B.date[j].e;
}
else
{
C.date[flag].e=C.date[flag].e+A.date[i].e*B.date[j].e;
}
}
}
}
}
else
{cout<<"不能相乘!
"<}
voidprint(TSMatrixA)
{
intk=0;
inti,j;
intM[MAXSIZE][MAXSIZE];
for(i=0;i{
for(j=0;j{
M[i][j]=0;
}
}
while(k{
M[A.date[k].row-1][A.date[k].col-1]=A.date[k].e;
k++;
}
for(i=0;i{
cout<<"|";
for(j=0;j{
cout<}
cout<<"|"<}
}
voidshowtip()
{
cout<<"------------请选择要执行的操作--------"<cout<cout<<"0---创建矩阵"<cout<<"1---A+B"<cout<<"2---A-B"<cout<<"3---A*B"<cout<<"4---退出"<cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<}
3、主函数:
voidmain()
{
TSMatrixA,B,C;
initMatrix(A);
initMatrix(B);
initMatrix(C);
showtip();
inti;
cin>>i;
while(true)
{
switch(i)
{
case0:
system("cls");
cout<<"创建矩阵A:
"<createMatrix(A);
cout<<"创建矩阵B:
"<createMatrix(B);
showtip();
break;
case1:
system("cls");
if(A.m==0||B.m==0)
{
cout<<"未建矩阵"<}
else
{
initMatrix(C);
add(A,B,C);
if(A.m==B.m&&A.n==B.n)
{
cout<<"加的结果;"<print(A);
cout<<"+"<print(B);
cout<<"="<print(C);
}
}
showtip();
break;
case2:
system("cls");
if(A.m==0||B.m==0)
{
cout<<"未建矩阵"<}
else
{
initMatrix(C);
sub(A,B,C);
cout<<"减的结果;"<print(A);
cout<<"+"<print(B);
cout<<"="<print(C);
}
showtip();
break;
case3:
system("cls");
if(A.m==0||B.m==0)
{
cout<<"未建矩阵"<}
else
{
initMatrix(C);
mult(A,B,C);
if(A.n==B.m)
{
cout<<"乘后的结果;"<print(A);
cout<<"*"<print(B);
cout<<"="<print(C);
}
}
showtip();
break;
case4:
exit(0);
break;
}
cin>>i;
}
}
四、调试分析
1、由于本程序涉及的函数比较多,所以开始时在函数调用上出现了混乱,把自己都给搞糊涂了,后来经仔细排查,最终发现了错误。
2、一开始看这个题目时,感觉以前似乎做过,觉得很简单,所以没有进行认真分析就开始急着写程序,写了一点后发现没思路了,怎么也写不下出了,搞了半天结果什么也没写出来。
所以得出经验,以后写程序必须先分析好思路,然后才开始着手去写,这样能达到现半功倍的效果。
3、矩阵的加和减,在表面上看似乎很相似,只要把加改减就能完成任务,其实不然。
五、用户手册
1、本程序的运行环境为DOS操作环境,文件名为约瑟夫环.exe;
2、本例演示程序简单明了,按菜单提示操作即可。
六、测试结果