稀疏矩阵的操作课程设计.docx

上传人:b****6 文档编号:9006649 上传时间:2023-02-02 格式:DOCX 页数:19 大小:475.09KB
下载 相关 举报
稀疏矩阵的操作课程设计.docx_第1页
第1页 / 共19页
稀疏矩阵的操作课程设计.docx_第2页
第2页 / 共19页
稀疏矩阵的操作课程设计.docx_第3页
第3页 / 共19页
稀疏矩阵的操作课程设计.docx_第4页
第4页 / 共19页
稀疏矩阵的操作课程设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

稀疏矩阵的操作课程设计.docx

《稀疏矩阵的操作课程设计.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的操作课程设计.docx(19页珍藏版)》请在冰豆网上搜索。

稀疏矩阵的操作课程设计.docx

稀疏矩阵的操作课程设计

摘要

随着科学技术的飞速发展,人类的生活工作方式发生了很大的改变,工作效率随着高科技的加入有了质的提高,特别是信息技术和网络技术的迅速发展和广泛应用,对社会的政治,经济,军事,文化等领域产生越来越深刻的影响。

现代生活各个方面都离不开计算机技术,而C是国际上广泛流行的通用程设语言,在计算机的研究和应用中以展现强大的生命力。

C功能强大,使用灵活,既具有高级语言的特点,又具有低级语言的些特点;它既可用于编写系统软件又可用于编写应用软件。

本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。

在程序设计中,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法。

程序通过调试运行,结果与预期一样,初步实现了设计目标。

 

关键词:

稀疏矩阵,三元组,链表

 

1课程设计的目的和意义

通过本课程设计教学所要达到的目的是:

培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

2需求分析

2.1需求概述

1.问题描述

设计程序用十字链表实现稀疏矩阵的加、乘、转置。

基本功能要求:

(1)稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。

(2)求出A的转置矩阵D,输出D。

(3)求两个矩阵A和B的乘积。

测试数据:

2.需求分析

(1)设计函数建立稀疏矩阵,初始化值;

(2)设计函数输出稀疏矩阵的;

(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵;

(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵;

(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵;

(6)构造函数进行稀疏矩阵的转置,并输出结果;

(7)退出系统。

2.2需求环境

本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:

①硬件要求:

一台计算机。

②软件配置:

WINDOWS、VC++6.0。

 

3系统功能设计及数据结构设计

3.1模块设计

本程序包含1个模块:

主程序模块加各功能实现模块。

3.2系统子程序及功能设计

本系统共设置7个子程序,各子程序的函数名及功能说明如下。

(1)typedefintElemType                 //初始化矩阵

(2)voidCreat(TSMatrix&M)             //建立矩阵

(3)voidPrint_SMatrix(TSMatrixM)           //输出矩阵的信息

以下编号(4)-(6)是稀疏矩阵的基本操作。

依次是:

相加,相乘,转置等。

(4)voidXiangjia(TSMatrixA,TSMatrixB,TSMatrix&C,intn)

//把A和B两个矩阵相加,结果是C

(5)voidXiangcheng(TSMatrixA,TSMatrixB,TSMatrix&Q)

//把A和B两个矩阵相乘,结果是Q

(6)voidZhuanzhi(TSMatrix*a,TSMatrix*b) 

//把A转置

(7)voidmain()

  //主函数。

设定界面的颜色,大小和窗口的标题,调用工作区模块函数    

4算法设计、数据流图及程序结构框图

4.1程序功能模块

为了实现以上功能,可以从3个方面着手设计。

1.主界面设计

为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。

2.存储结构设计

本系统采用单链表结构存储稀疏矩阵的具体信息。

其中:

全部结点的信息用头结点为指针数组的单链表存储。

3.系统功能设计

本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。

稀疏矩阵的初始化由函数itypedefintElemType  实现。

建立稀疏矩阵用voidCreat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。

4个子功能的设计描述如下。

(1)稀疏矩阵的加法:

此功能由函数voidXiangjia()实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。

然后进行加法,最后输出结果。

(2)稀疏矩阵的乘法:

此功能由函数voidXiangcheng()实现。

当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。

然后进行相乘,最后得到结果。

(3)稀疏矩阵的转置:

此功能由函数voidZhuanzhi()实现。

当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。

(4)退出:

即退出稀疏矩阵的应用系统。

由函数5实现,但用户选择此功能时,系统会提示你是否确实想退出,如果是,则退出,否则继续。

4.2程序流程图

 

5程序原代码及其说明

#include

#include

#include

#defineMAXSIZE40//假设非零元素个数的最大值为40

#defineMAXRC20//假设矩阵的最大行数为20

typedefintElemType;

typedefstruct

{

inti,j;//非零元的行下标和列下标

ElemTypee;//非零元的值

}Triple;

typedefstruct

{

Tripledata[MAXSIZE+1];

intrpos[MAXRC+1];//各行第一个非零元在三元组的位置表

inths,ls,fls;

}TSMatrix,*Matrix;

voidCreat(TSMatrix&M)

{

inti,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++;

}

}

voidXiangjia(TSMatrixA,TSMatrixB,TSMatrix&C,intn)

{

inta,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)

{

if(A.data[a].j

C.data[l++]=A.data[a++];

elseif(A.data[a].j>B.data[b].j)

{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

else{

temp=A.data[a].e+n*B.data[b].e;

if(temp)

{

C.data[l]=A.data[a];

C.data[l].e=temp;

l++;

}

a++;b++;

}

}

elseif(A.data[a].i

C.data[l++]=A.data[a++];

else{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

}

while(a<=A.fls)

C.data[l++]=A.data[a++];

while(b<=B.fls)

{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

C.fls=l-1;

}

intXiangcheng(TSMatrixA,TSMatrixB,TSMatrix&Q)

{

intarow,brow,ccol,tp,p,q,t;

intctemp[MAXRC+1];

if(A.ls!

=B.hs)return0;

Q.hs=A.hs;Q.ls=B.ls;Q.fls=0;

if(A.fls*B.fls)

{

for(arow=1;arow<=A.hs;arow++)

{

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

ctemp[ccol]=0;

Q.rpos[arow]=Q.fls+1;

if(arow

elsetp=A.fls+1;

for(p=A.rpos[arow];p

{

brow=A.data[p].j;

if(brow

elset=B.fls+1;

for(q=B.rpos[brow];q

{

ccol=B.data[q].j;

ctemp[ccol]+=A.data[p].e*B.data[q].e;

}

}

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

{

if(ctemp[ccol]){

if(++Q.fls>MAXSIZE)return0;

Q.data[Q.fls].i=arow;

Q.data[Q.fls].j=ccol;

Q.data[Q.fls].e=ctemp[ccol];

}

}

}

}

return1;

}

voidPrint_SMatrix(TSMatrixM)

{

intk,l,n;

Matrixp;

p=&M;

for(k=1,n=1;k<=p->hs;k++)

{

for(l=1;l<=p->ls;l++)

{

if(p->data[n].i==k&&p->data[n].j==l)

{

printf("%5d",p->data[n].e);

n++;

}

else

printf("%5d",0);

}

printf("\n");

}

printf("\n");

}

voidZhuanzhi(TSMatrix*a,TSMatrix*b)

{

intq,col,p;

b->hs=a->ls;

b->ls=a->hs;

b->fls=a->fls;

if(b->fls)

{

q=1;

for(col=1;col<=a->ls;col++)

for(p=1;p<=a->fls;p++)

if(a->data[p].j==col)

{

b->data[q].i=a->data[p].j;

b->data[q].j=a->data[p].i;

b->data[q].e=a->data[p].e;

++q;

}

}

}

voidDestory_SMatrix(TSMatrix&M)

{

M.hs=M.ls=M.fls=0;

}

voidmain()

{

TSMatrixA,B,C;

TSMatrix*p=&A,*q=&B;

intflag,n;

while(true)

{

system("cls");

printf("\n\n\n");

printf("\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");

printf("\t┃***稀疏矩阵的加、转、乘***┃\n");

printf("\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");

printf("\t┃1、稀疏矩阵的加法┃\n");

printf("\t┃2、稀疏矩阵的转置┃\n");

printf("\t┃3、稀疏矩阵的乘法┃\n");

printf("\t┃4、退出该应用程序┃\n");

printf("\t┃By陈强计算机科学与技术┃\n");

printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("输入要进行的项目的编号:

");

scanf("%d",&flag);

if(flag==4)break;

Creat(A);

printf("矩阵A:

\n");Print_SMatrix(A);

switch(flag)

{

case1:

Creat(B);n=1;

printf("矩阵B:

\n");

Print_SMatrix(B);

if(A.hs==B.hs&&A.ls==B.ls)

{

printf("A+B:

\n");

Xiangjia(A,B,C,n);

Print_SMatrix(C);

}

elseprintf("错误!

行列不一致\n");

break;

case2:

printf("A->B:

\n");

Zhuanzhi(p,q);

Print_SMatrix(B);

break;

case3:

Creat(B);

printf("矩阵B:

\n");

Print_SMatrix(B);

printf("A*B:

\n");

n=Xiangcheng(A,B,C);

if(!

n)printf("错误!

行列不匹配\n");

elsePrint_SMatrix(C);

break;

default:

printf("输入错误!

\n");

}

Destory_SMatrix(A);

Destory_SMatrix(B);

Destory_SMatrix(C);

getchar();getchar();

}

printf("\n\t\t\t***程序已经退出***\n");

getchar();

}

 

6程序测试及运行结果说明

由需求分析可知,稀疏矩阵的操作程序设计是在VC++6.0实现环境下全过程演示。

本程序已调试成功并实现了其功能。

其运行结果如下:

 

图6.1系统主界面:

 

图6.2.1运行加法运算:

图6.2.2运行加法运算:

图6.3.1运行乘法运算:

图6.3.2运行乘法运算:

 

图6.4运行矩阵转置运算:

图6.5系统退出界面:

 

7总结

总通过本次实验,在我的学习理解上有很大的促进作用。

单单对稀疏矩阵,我了解了由于矩阵在程序中常使用二维阵列表示,二维阵列的大小稀疏矩阵与使用的存储器空间成正比,如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。

二维数组Amn中有N个非零元素,若N<

由于稀疏矩阵中含有很多的0元素,在计算机中存储会浪费很多的空间,因此我们通常采用压缩存储的方法。

 

主要参考资料

[1]《数据结构》(C语言版),严蔚敏,清华大学出版社,2003.

[2]《数据结构题集》,严蔚敏,清华大学出版社,2005.

[3]《数据结构》(C语言版),刘大有,高等教育出版社,2004.

[4]《DataStructurewithC++》,WilliamFord.WilliamTopp,清华大学出版社,2003.

 

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

当前位置:首页 > 高等教育 > 农学

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

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