数据结构课程设计五基本稀疏矩阵运算的运算器.docx
- 文档编号:27399372
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:18
- 大小:83.45KB
数据结构课程设计五基本稀疏矩阵运算的运算器.docx
《数据结构课程设计五基本稀疏矩阵运算的运算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计五基本稀疏矩阵运算的运算器.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计五基本稀疏矩阵运算的运算器
数据结构课程设计五
····
题目:
严蔚敏习题实习4第1个:
实现一个能进行基本稀疏矩阵运算的运算器
一、需求分析
1、本程序实现一个基本稀疏矩阵的简单运算,包括加、减、乘。
2、执行操作前应先创造要进行运算的两个矩阵,然后再选择进行相应的操作。
3、以三元组顺序表表示稀疏矩阵,实现二个矩阵相加,相减,相乘的运算;稀疏矩阵的输入形式为三元组表示,运算结果则为通常的阵列形式列出!
4、首先输入矩阵的行数和列数,并判别给出的两个矩阵和行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20;
5、程序先给出了菜单项,用户只需按照菜单提示进行相应的操作就行了。
6、测试数据:
二、概要设计
1、抽象数据类型三元组的定义如下:
ADTTriple
{
数据对象:
D={ai|ai(-ElemSet,i=1,2,...,n,n>=0};
数据关系:
R1={
基本操作:
略
}
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、本例演示程序简单明了,按菜单提示操作即可。 六、测试结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 基本 稀疏 矩阵 运算 运算器