课程设计矩阵运算系统的设计与实现.docx
《课程设计矩阵运算系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《课程设计矩阵运算系统的设计与实现.docx(19页珍藏版)》请在冰点文库上搜索。
课程设计矩阵运算系统的设计与实现
课程设计矩阵运算系统的设计与实现
C\C++程序设计课程设计
设计说明书
矩阵运算系统的设计与实现
学生姓名
学号
班级
成绩
指导教师
计算机科学与技术系
2010年7月16日
C/C++程序设计课程设计评阅书
题目矩阵运算系统的设计与实现
学生姓名学号指导教师评语及成绩
指导教师签名:
年月日答辩评语及成绩
答辩教师签名:
年月日教研室意见
总成绩:
室主任签名:
年月日
课程设计任务书
2009—2010学年第二学期
专业:
统学号:
姓名:
课程设计名称:
c\c++程序设计课程设计设计题目:
矩阵运算系统的设计与实现完成期限:
自2010年7月5日至2010年7月16日共2周设计依据、要求及主要内容(可另加附页):
用C/C++语言编写一个程序实现普通矩阵相加、相乘及稀疏矩阵转置问题,要求如下:
1)阐述设计思想,画出流程图;
2)对给定的矩阵A1、A2,实现矩阵相加、相乘;
3)对稀疏矩阵B,用三元组对矩阵中的元素进行存放,分别以行为主序和以列为主序求出稀疏矩阵
B的转置矩阵T;
4)说明测试方法,写出完整的运行结果,较好的界面设计。
5)编写课程设计报告。
指导教师(签字):
教研室主任(签字):
批准日期:
2010年7月5日
摘要
设计了一个矩阵运算系统,该矩阵运算系统具有普通矩阵相加、相减、相乘及稀疏矩阵转置等功能。
本运算系统以MicrosoftVisualC++6.0作为系统开发工具,采用算数表达式处理算法来实现了矩阵的加、减、乘等混合运算和稀疏矩阵的转置矩阵运算。
系统操作简单,界面清晰,便于用户使用。
关键词:
普通矩阵;运算;VC6.0
1课题描述...............................................................................................................................................................12设计过程...............................................................................................................................................................13程序编码...............................................................................................................................................................34测试.....................................................................................................................................................................10总结.......................................................................................................................................................................12参考文献.................................................................................................................................................................12
1课题描述
矩阵运算系统是一个非常重要的运算,很多软件开发公司都开发了这个运算系统。
现在我们用C语言编出这个运算系统。
它的原理是对于输入的矩阵,进行相加、相乘以及相减。
另外一个是稀疏矩阵的转置运算系统,按提示输入数值即可得到所要求的稀疏矩阵的转置矩阵。
运行环境:
VisualC++6.0
2设计过程
经过对程序设计题目的分析可知,整个程序的设计实现大致分为四个模块,其中每一个模块对应一
第1页共21页
个函数,他们的功能分别是:
1)矩阵相加运算函数(ADD),主要实现将两矩阵相加的功能;2)矩阵相乘运算函数(MUL),主要实现将两矩阵相乘的功能;3)矩阵相减函数(SNB);实现的功能是矩阵之间的减法4)稀疏矩阵矩阵转置函数(TRANPOSE)实现的功能是将稀疏矩阵进行转置。
在这些函数当中,第1、2、4个函数的实现严格按照题目的要求,而第3个函数为自行设计的函数。
程序的一次运行当中可以循环执行所有的功能,并根据需要终止程序的执行。
在这个程序中,将各个功能以子程序模块的形式编写。
这样使所编写的程序简单明了,逻辑性思维表达明确,具有很强的可读性。
流程图如下:
1)矩阵相乘流程图如图2.1所示:
图2.1
2)矩阵相加流程图如图2.2所示
图2.2
3)矩阵相减流程图如图2.3所示
第2页共21页
图2.3
4)矩阵相减、相加、相乘MAIN函数如图2.4所示
第3页共21页
图2.4
第4页共21页
5)稀疏矩阵的转置流程图如图2.5所示
图2.5
第5页共21页
3程序编码
/*矩阵相加、相减以及相乘*/
#include"stdio.h"
#include"stdlib.h"
#defineM3
#defineN3
//指针数组
inta[M][N];
intb[M][N];
intc[M][N];
voidmatrixMul(intb[][M],intc[][N]);voidmatrixAdd(intb[][N],intc[][N]);voidmatrixSub(intb[][N],intc[][N]);
intmain()
{
inti,j,temp=0;
printf("Pleaseinputintmatrixb[%d][%d]\n",M,N);
for(i=0;ifor(j=0;j{
scanf("%d",&temp);
b[i][j]=temp;
}
printf("Pleaseinputintmatrixc[%d][%d]\n",M,N);
for(i=0;i{
for(j=0;j{
scanf("%d",&temp);
c[i][j]=temp;
}
}
//输出原矩阵
printf("Nowprintresourcematrixb[%d][%d]=",M,N);
for(i=0;i第3页共21页
printf("\n");
for(j=0;jprintf("%d",b[i][j]);
}
printf("\n");
printf("Nowprintresourcematrixc[%d][%d]=",M,N);
for(i=0;iprintf("\n");
for(j=0;jprintf("%d",c[i][j]);
}
if(M==N)
{
matrixMul(b,c);//调用矩阵相乘
//输出矩阵相乘结果
printf("\n");
printf("NowprintmmatrixMulresultsmatrixa[%d][%d]=B*C:
",M,N);
for(i=0;i{
printf("\n");
for(j=0;jprintf("%d",a[i][j]);
}
}
else
{
printf("matrixError,checkandtryagain!
!
!
");
}
//输出矩阵相加结果
matrixAdd(b,c);
printf("\n");
printf("NowprintmmatrixAddresultsmatrixa[%d][%d]=B+C:
",M,N);
for(i=0;i{
printf("\n");
for(j=0;jprintf("%d",a[i][j]);
}
第4页共21页
//输出矩阵相减结果
matrixSub(b,c);
printf("\n");
printf("NowprintmmatrixSubresultsmatrixa[%d][%d]=B-C:
",M,N);
for(i=0;i{
printf("\n");
for(j=0;jprintf("%d",a[i][j]);
}
return0;
}
voidmatrixMul(intb[][M],intc[][N]){
inti,j,k;
for(i=0;ifor(j=0;j{
for(k=0;ka[i][j]+=b[i][k]*c[k][j];
}
}
voidmatrixAdd(intb[][M],intc[][N]){
inti,j;
for(i=0;i{
for(j=0;j{
a[i][j]=b[i][j]+c[i][j];
}
}
}
voidmatrixSub(intb[][M],intc[][N]){
inti,j;
for(i=0;i第5页共21页
{
for(j=0;j{
a[i][j]=b[i][j]-c[i][j];
}
}
}
*矩阵的快速转置*//
#include
#include
#include
#defineMAXSIZE200/*矩阵中最大非零元的个数*/
typedefstructtriple
{
inti;/*行标,本程序中从1开始的*/
intj;/*列标,本程序中从1开始的*/
inte;/*非零元*/
}Triple;/*三元组定义*/
typedefstructtabletype
{
intmu;/*矩阵的行数*/
intnu;/*列数*/
inttu;/*非零元个数*/
Tripledata[MAXSIZE];/*非零元的三元组表,本程序中是从data[1]开始使用的*/}Tabletype;/*三元组线性表*/
/*以下为函数声明,注意和书本上的参数类型不同,我用的形参全为指针*/voidCreatSMatrix(Tabletype*);/*生成矩阵*/
voidDestroySMatrix(Tabletype*);/*销毁矩阵*/
voidout_matrix(Tabletype*);/*打印矩阵*/
intFastTransposeSMatrix(Tabletype*,Tabletype*);/*快速转置算法*/intmain(void)/*主函数*/
{
charch;
Tabletypea={0,0,0,{0,0,0}};/*初始化为0,便于输入数据时的无效检测*/
Tabletypeb;/*声明矩阵b*/
while
(1)
{
printf("@@@@@@@@@@@@@@本程序的功能是实现稀疏矩阵的快速转置@@@@@@@@@@@@@@@\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
第6页共21页
CreatSMatrix(&a);
printf("ThesourceMatrix:
\n");
out_matrix(&a);
if(FastTransposeSMatrix(&a,&b))/*若a不为零矩阵则转置a,存入b中*/
{printf("AfterTransposeSMatrix:
\n");
out_matrix(&b);
}
else
{
printf("Thematrixiszeros:
\n");
out_matrix(&a);
}
/*以下为程序控制*/
printf("Input'q'toquitand'c'runagain:
");
do{
if((ch=getchar())=='q'||ch=='Q')
{
DestroySMatrix(&a);
DestroySMatrix(&b);
exit(0);
}
}while((ch!
='C')&&(ch!
='c'));system("cls");
}
return1;
}
voidCreatSMatrix(Tabletype*a)
{
inti;
printf("请输入矩阵的行数、列数和非零元个数,用空格间隔:
");
scanf("%d%d%d",&(a->mu),&(a->nu),&(a->tu));for(i=1;i<=a->tu;)
{
printf("请输入矩阵中第%d个非零元(按行标、列标、值的顺序,空格间隔):
",i);
scanf("%d%d%d",&(a->data[i].i),&(a->data[i].j),&(a->data[i].e));
if(a->data[i].i<1||a->data[i].i>a->mu||a->data[i].j<1||a->data[i].j>a->nu)
/*下标越界*/
{
printf("注意:
下标越界输入数据无效!
\n请重新输入:
行标范围:
1--%d,列标范围1--%d!
!
!
\n",a->mu,a->nu);
continue;
}
if(((a->data[i].i)<(a->data[i-1].i))||
第7页共21页
(((a->data[i].i)==(a->data[i-1].i))&&((a->data[i].j)<=
(a->data[i-1].j))))/*非按行顺序输入*/
{
printf("注意:
输入数据无效!
\n请按照按行存储的顺序输入数据!
!
!
\n");
continue;
}
i++;
}
}
voidDestroySMatrix(Tabletype*a){/*销毁稀疏矩阵a*/
(*a).mu=0;
(*a).nu=0;
(*a).tu=0;
}
voidout_matrix(Tabletype*a)/*打印矩阵*/
{
inti,j,k=1;
for(i=1;i<=a->mu;i++)
{
for(j=1;j<=a->nu;j++)
{/*判断是否为非零元*/
if((a->data[k].i==i)&&(a->data[k].j==j))
{
printf("%4d",a->data[k].e);
k++;
}
else
printf("%4d",0);
}
printf("\n");
}
}
intFastTransposeSMatrix(Tabletype*a,Tabletype*b)
{
intp,q,col;
int*num;
int*cpot;
b->mu=a->nu;/*原矩阵的行数为新矩阵的列数,原列数为新行数,非零元个数不变*/
b->nu=a->mu;
b->tu=a->tu;
num=(int*)malloc((b->nu+1)*sizeof(int));/*生成两个辅助数组*/
第8页共21页
cpot=(int*)malloc((b->nu+1)*sizeof(int));if(b->tu)/*若a不为零矩阵*/
{
for(col=0;colnu;col++)/*初始化矩阵a的每列中非零元的个数均为0*/
num[col]=0;
for(col=0;col<=a->tu;col++)/*统计每列中非零元的个数*/
num[a->data[col].j]++;
cpot[1]=1;/*确定每列中第一个非零元的位置*/
for(col=2;col<=a->nu;col++)
cpot[col]=num[col-1]+cpot[col-1];
for(p=1;p<=a->tu;p++)/*p为a-data的下标*/
{
col=a->data[p].j;/*交换元素*/
q=cpot[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++;
cpot[col]++;
}
free(num);/*释放两个辅助数组*/
free(cpot);
return1;/*转置成功*/
}
else/*a为零矩阵*/
return0;
}
第9页共21页
4测试
1)矩阵相乘的运行结果如图4.1所示
图4.1矩阵乘法的运行结果截图
2)矩阵相加的运行结果如图4.2所示:
图4.2矩阵加法的运行结果截图
第10页共21页
3)矩阵减法的运行结果如图4.3所示
图4.3矩阵减法的运行结果截图
4)稀疏矩阵转置的运行结果如图4.4所示:
图4.4
图4.4稀疏矩阵转置的运行结果截图
第11页共21页
5.总结
矩阵的相加相乘、以及稀疏矩阵的转置的开发与实践是我在大学的第一次课程设计,总体上来说在这次的课程设计当中我本人受益匪浅我了解到了如何利用C语言来开发与实现一些我们常遇到的问题,总之这次课程设计让我知道了我们学习C语言要同平时常遇的问题结合起来这样才能更好的掌握所学的知识,学以致用~
参考文献
[1]谭浩强.C程序设计教程[M].北京:
清华大学出版社,2007
[2]《数据结构》教材[M].高等教育出版社
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2008
第12页共21页
第13页共21页