数据结构课程设计稀疏矩阵运算器.docx

上传人:b****6 文档编号:8855154 上传时间:2023-02-02 格式:DOCX 页数:14 大小:99.29KB
下载 相关 举报
数据结构课程设计稀疏矩阵运算器.docx_第1页
第1页 / 共14页
数据结构课程设计稀疏矩阵运算器.docx_第2页
第2页 / 共14页
数据结构课程设计稀疏矩阵运算器.docx_第3页
第3页 / 共14页
数据结构课程设计稀疏矩阵运算器.docx_第4页
第4页 / 共14页
数据结构课程设计稀疏矩阵运算器.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构课程设计稀疏矩阵运算器.docx

《数据结构课程设计稀疏矩阵运算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计稀疏矩阵运算器.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构课程设计稀疏矩阵运算器.docx

数据结构课程设计稀疏矩阵运算器

成绩评定

教师签名

嘉应学院计算机学院

实验报告

 

课程名称:

数据结构课程设计

开课学期:

2017-2018学年第2学期

班级:

指导老师:

实验题目:

稀疏矩阵运算器

学号:

姓名:

上机时间:

【实验目的】深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。

【需要分析】稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

要求以带“行逻辑链接信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。

输入以三元组表示,输出以通常的阵列形式列出。

【软件平台】

Windows2000,VisualC++6.0或WINTC

【概要设计】

ADTArray{

数据对象:

D={aij|0≤i≤b1-1,0≤j≤b2-1}

数据关系:

R={ROW,COL}

ROW={|0≤i≤b1-2,0≤j≤b2-1}

COL={|0≤i≤b1-1,0≤j≤b2-2}

基本操作:

CreateSMatrix(&M);//操作结果:

创建稀疏矩阵M.

PrintSMatrix(M);

//初始化条件:

稀疏矩阵M存在.

//操作结果:

输出稀疏矩阵M.

AddSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M与N的行数和列数对应相等.

//操作结果:

求稀疏矩阵的和Q=M+N.

SubSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M与N的行数和列数对应相等.

//操作结果:

求稀疏矩阵的差Q=M-N.

MultSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M的列数等于N的行数.

//操作结果:

求稀疏矩阵的乘积Q=M*N.

}ADTArray

【主程序模块】:

voidmain()

{

初始化;

do{

接受命令;

处理命令;

}while(命令!

=“退出”);

}

【功能模块调用关系图】

 

 

【详细设计】

typedefstruct{

introw;//行数

intcol;//列数

intv;//非零元素值

}triplenode;

typedefstruct{

triplenodedata[maxsize+1];//非零元三元组

introwtab[maxrow+1];//各行第一个非零元的位置表

intmu,nu,tu;//矩阵的行数、列数和非零元个数

}rtripletable;

voidcreat(rtripletable&A)//创建稀疏矩阵

voidprint(rtripletableA)//输出稀疏矩阵

intaddsmatrix(rtripletableM,rtripletableN)//矩阵相加

intsubsmatrix(rtripletableM,rtripletableN)//稀疏矩阵相减

voidmultsmatrix(rtripletableM,rtripletableN,rtripletable&Q)//稀疏矩阵相乘

【调试分析】

1、由于开始对顺序存储的知识还不熟识,在三元组的存储和运用会导致算法低效。

2、做到存储的时候,开始时不知道怎样存储三元组,和不知如何去运用它的行数,列数,非零元素。

3、在使用选择和循环时,有时因为自己的粗心,把循环的条件弄错了。

4、做本程序用到了数组的知识,有时一有不懂的东西又只能打开书来看。

5、开始时没有把矩阵的加法和减法的情况考虑全面,导致输出的时候会出现简单的错误。

【用户手册】

1、本程序的运行环境为Windowsme下的MicrosofeVC++6.0,执行文件为:

xishujuzhen.cpp。

2、进入演示程序后即显示文本方式的用户界面:

3、进入界面后,只要选择数字命令按“回车键”就行。

4、接受其他命令后即执行相应的操作和相应的结果。

完整代码如下:

#include

#include

#include

#definemaxsize100

#definemaxrow100

#defineOK1

#defineERROR-1

typedefstruct{

introw;//行数

intcol;//列数

intv;//非零元素值

}triplenode;

typedefstruct{

triplenodedata[maxsize+1];//非零元三元组

introwtab[maxrow+1];

//各行第一个非零元的位置表

intmu,nu,tu;//矩阵的行数、列数和非零元个数

}rtripletable;

voidcreat(rtripletable&A)//创建稀疏矩阵

{

intk=1,sum=1,loop,p,t;

intnum[maxrow+1];

cout<<"请输入矩阵的行数和列数:

"<

cout<<"行数:

";cin>>A.mu;

cout<<"列数:

";cin>>A.nu;

cout<<"非零元素个数:

";cin>>A.tu;

cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!

"<

for(loop=1;loop<=A.tu;loop++)

{

cin>>A.data[loop].row>>A.data[loop].col>>A.data[loop].v;

//输入三元组的行数,列数和非零元素值

}

for(p=1;p<=A.mu;p++)num[p]=0;

//A三元组每一列的非零元素个数

for(t=1;t<=A.tu;t++)++num[A.data[t].row];

//求A中每一列含非零元个数

A.rowtab[1]=1;

//求第p列中第一个非零元在A.data中的序号

for(t=2;t<=A.mu;t++)A.rowtab[t]=A.rowtab[t-1]+num[t-1];

return;

}

voidprint(rtripletableA)//输出稀疏矩阵

{

intresult[maxrow+1][maxrow+1];

//定义一个二维数组

intloop1,loop2;

for(loop1=1;loop1<=A.mu;loop1++)

for(loop2=1;loop2<=A.nu;loop2++)

result[loop1][loop2]=0;//初始化为0

for(loop1=1;loop1<=A.tu;loop1++)

result[A.data[loop1].row][A.data[loop1].col]=A.data[loop1].v;

for(loop1=1;loop1<=A.mu;loop1++)

{

cout<<"|";

for(loop2=1;loop2<=A.nu;loop2++)

cout<

//输出所做运算的结果

cout<<"|"<

}

}

intaddsmatrix(rtripletableM,rtripletableN)

//矩阵相加

{

if(M.mu!

=N.mu)//行数相等才能相加

cout<<"出错";

rtripletableQ;Q.mu=M.mu;Q.nu=N.nu;

intp,q,k;

p=1;q=1;k=1;

while(p<=M.tu&&q<=N.tu)//两个稀疏矩阵存在

{

if(M.data[p].row==N.data[q].row)

//两个稀疏矩阵的行数相等

{

if(M.data[p].col==N.data[q].col)

//两个稀疏矩阵的列数相等

{

if(M.data[p].v+N.data[q].v!

=0)

//两个稀疏矩阵相加的结果不为0

{

Q.data[k].row=M.data[p].row;

Q.data[k].col=M.data[p].col;

Q.data[k].v=M.data[p].v+N.data[q].v;++k;

}

++q;++p;

}

elseif(M.data[p].col

//第一个稀疏矩阵列数小于第二个稀疏矩阵列数

{

Q.data[k]=M.data[p];

//把M中的所有信息都赋给Q

++p;++k;

}

else

//第一个稀疏矩阵列数大于第二个稀疏矩阵的列数

{

Q.data[k]=N.data[q];++q;++k;

}

}

elseif(M.data[p].row

//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数

{

Q.data[k]=M.data[p];++p;++k;

}

else

//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数

{

Q.data[k]=N.data[q];++q;++k;

}

}

while(p<=M.tu)//只有M并且符合条件

{

Q.data[k]=M.data[p];++p;++k;

}

while(q<=N.tu)//只有N并且符合条件

{

Q.data[k]=N.data[q];

++q;++k;

}

Q.tu=k-1;

cout<<"加法结果为:

"<

print(Q);//调用print()

returnOK;

}

intsubsmatrix(rtripletableM,rtripletableN)

//稀疏矩阵相减

{

if(M.mu!

=N.mu)//行数相等才能相加

cout<<"出错";

rtripletableQ;

Q.mu=M.mu;

Q.nu=N.nu;

intp,q,k;

p=1;q=1;k=1;

while(p<=M.tu&&q<=N.tu)//两个稀疏矩阵存在

{

if(M.data[p].row==N.data[q].row)

//两个稀疏矩阵的行数相等

{

if(M.data[p].col==N.data[q].col)

//两个稀疏矩阵的列数相等

{

if(M.data[p].v-N.data[q].v!

=0)

//两个稀疏矩阵相减的结果不为0

{Q.data[k].row=M.data[p].row;

Q.data[k].col=M.data[p].col;

Q.data[k].v=M.data[p].v-N.data[q].v;

++k;

}

++q;++p;

}

if(M.data[p].col

//第一个稀疏矩阵列数小于第二个稀疏矩阵的列数

{

Q.data[k]=M.data[p];

++p;++k;

}

if(M.data[p].col>N.data[q].col)

//第一个稀疏矩阵列数大于第二个稀疏矩阵的列

{

Q.data[k].row=N.data[q].row;

Q.data[k].col=N.data[q].col;

Q.data[k].v=-N.data[q].v;

++q;++k;

}

}

if(M.data[p].row

//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数

{

Q.data[k]=M.data[p];

++p;++k;

}

if(M.data[p].row>N.data[q].row)

//第一个稀疏矩阵行列数大于第二个稀疏矩阵行数

{

Q.data[k].row=N.data[q].row;

Q.data[k].col=N.data[q].col;

Q.data[k].v=-N.data[q].v;++q;++k;

}

}

while(p<=M.tu)//只有M并且符合条件

{

Q.data[k]=M.data[p];++p;++k;

}

while(q<=N.tu)//只有N并且符合条件

{

Q.data[k].row=N.data[q].row;

Q.data[k].col=N.data[q].col;

Q.data[k].v=-N.data[q].v;

++q;++k;

}

Q.tu=k-1;

cout<<"减法结果为:

"<

print(Q);//调用print()

returnOK;

}

voidmultsmatrix(rtripletableM,rtripletableN,rtripletable&Q)//稀疏矩阵相乘

{

intarow,brow;

intp,q,tp,t;

intccol;

intctemp[maxrow+1];//定义累加器

if(M.nu!

=N.mu)return;

Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;//Q初始化

if(M.tu*N.tu!

=0){//Q是非零矩阵

for(arow=1;arow<=M.mu;arow++)

//处理M的每一行

{

for(p=1;p<=Q.nu;p++)//处理M的每一列

ctemp[p]=0;//当前行各元素累加器清零

Q.rowtab[arow]=Q.tu+1;

if(arow

elsetp=M.tu+1;

for(p=M.rowtab[arow];p

//对当前行中每一个非零元

{

brow=M.data[p].col;//找到对应元N中的行号

if(brow

elset=N.tu+1;

for(q=N.rowtab[brow];q

{

ccol=N.data[q].col;//乘积元素在Q中列数

ctemp[ccol]+=M.data[p].v*N.data[q].v;

}

}//求得Q中第crow(=arow)行的非零元

for(ccol=1;ccol<=Q.nu;ccol++)

//压缩存储该行非零元

{

if(ctemp[ccol])

{

if(++Q.tu>maxsize)return;

Q.data[Q.tu].row=arow;//行数

Q.data[Q.tu].col=ccol;//列数

Q.data[Q.tu].v=ctemp[ccol];

//累加非零元素值

}

}

}

}

cout<<"乘法结果为:

"<

print(Q);//调用print()

}

voidmain()

{

charchoice;

rtripletableA,B,Q;

cout<<"--------------------------------------------------\n";

cout<<"|*****欢迎使用稀疏矩阵运算器******|\n";

cout<<"|=============================|\n";

cout<<"\n|A、输入矩阵1|\n";

cout<<"\n|B、输入矩阵2|\n";

cout<<"\n|C、矩阵相加|\n";

cout<<"\n|D、矩阵相减|\n";

cout<<"\n|E、矩阵相乘|\n";

cout<<"\n|F、退出本系统|\n";

cout<<"\n|-----------------------------------------------|\n";

cout<<"请选择所需要的操作功能(A,B,C,D,E,F):

";

do{

cin>>choice;

switch(choice){

case'A':

creat(A);break;

case'B':

creat(B);break;

case'C':

addsmatrix(A,B);break;

case'D':

subsmatrix(A,B);break;

case'E':

multsmatrix(A,B,Q);break;

case'F':

exit(0);

}cout<<"请选择所需要的操作功能(A,B,C,D,E,F):

";

}while

(1);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1