课程设计矩阵运算系统的设计与实现docWord下载.docx
《课程设计矩阵运算系统的设计与实现docWord下载.docx》由会员分享,可在线阅读,更多相关《课程设计矩阵运算系统的设计与实现docWord下载.docx(13页珍藏版)》请在冰豆网上搜索。
3)对稀疏矩阵B,用三元组对矩阵中的元素进行存放,分别以行为主序和以列为主序求出稀疏矩阵B的转置矩阵T;
4)说明测试方法,写出完整的运行结果,较好的界面设计。
5)编写课程设计报告。
指导教师(签字):
教研室主任(签字):
批准日期:
2010年7月5日
摘要
设计了一个矩阵运算系统,该矩阵运算系统具有普通矩阵相加、相减、相乘及稀疏矩阵转置等功能。
本运算系统以MicrosoftVisualC++6.0作为系统开发工具,采用算数表达式处理算法来实现了矩阵的加、减、乘等混合运算和稀疏矩阵的转置矩阵运算。
系统操作简单,界面清晰,便于用户使用。
关键词:
普通矩阵;
运算;
VC6.0
1课题描述
矩阵运算系统是一个非常重要的运算,很多软件开发公司都开发了这个运算系统。
现在我们用C语言编出这个运算系统。
它的原理是对于输入的矩阵,进行相加、相乘以及相减。
另外一个是稀疏矩阵的转置运算系统,按提示输入数值即可得到所要求的稀疏矩阵的转置矩阵。
运行环境:
VisualC++6.0
2设计过程
经过对程序设计题目的分析可知,整个程序的设计实现大致分为四个模块,其中每一个模块对应一个函数,他们的功能分别是:
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.3
4)矩阵相减、相加、相乘MAIN函数如图2.4所示
图2.4
5)稀疏矩阵的转置流程图如图2.5所示
图2.5
3程序编码
/*矩阵相加、相减以及相乘*/
#include"
stdio.h"
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;
i<
N;
i++)
for(j=0;
j<
j++)
{
scanf("
%d"
&
temp);
b[i][j]=temp;
}
Pleaseinputintmatrixc[%d][%d]\n"
M;
c[i][j]=temp;
}
//输出原矩阵
Nowprintresourcematrixb[%d][%d]="
i++){
\n"
);
%d"
b[i][j]);
Nowprintresourcematrixc[%d][%d]="
c[i][j]);
if(M==N)
matrixMul(b,c);
//调用矩阵相乘
//输出矩阵相乘结果
NowprintmmatrixMulresultsmatrixa[%d][%d]=B*C:
"
a[i][j]);
else
matrixError,checkandtryagain!
!
"
//输出矩阵相加结果
matrixAdd(b,c);
NowprintmmatrixAddresultsmatrixa[%d][%d]=B+C:
//输出矩阵相减结果
matrixSub(b,c);
NowprintmmatrixSubresultsmatrixa[%d][%d]=B-C:
return0;
}
voidmatrixMul(intb[][M],intc[][N])
inti,j,k;
for(k=0;
k<
k++)
a[i][j]+=b[i][k]*c[k][j];
voidmatrixAdd(intb[][M],intc[][N])
inti,j;
a[i][j]=b[i][j]+c[i][j];
voidmatrixSub(intb[][M],intc[][N])
a[i][j]=b[i][j]-c[i][j];
/*矩阵的快速转置*/
#include<
stdio.h>
stdlib.h>
process.h>
#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)
@@@@@@@@@@@@@@本程序的功能是实现稀疏矩阵的快速转置@@@@@@@@@@@@@@@\n"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
CreatSMatrix(&
a);
ThesourceMatrix:
out_matrix(&
if(FastTransposeSMatrix(&
a,&
b))
/*若a不为零矩阵则转置a,存入b中*/
{printf("
AfterTransposeSMatrix:
\n"
b);
Thematrixiszeros:
/*以下为程序控制*/
Input'
q'
toquitand'
c'
runagain:
do{
if((ch=getchar())=='
||ch=='
Q'
)
DestroySMatrix(&
exit(0);
}while((ch!
='
C'
)&
&
(ch!
));
system("
cls"
return1;
voidCreatSMatrix(Tabletype*a)
printf("
请输入矩阵的行数、列数和非零元个数,用空格间隔:
scanf("
%d%d%d"
(a->
mu),&
nu),&
tu));
for(i=1;
=a->
tu;
请输入矩阵中第%d个非零元(按行标、列标、值的顺序,空格间隔):
i);
data[i].i),&
data[i].j),&
data[i].e));
if(a->
data[i].i<
1||a->
data[i].i>
a->
mu||a->
data[i].j<
data[i].j>
nu)/*下标越界*/
注意:
下标越界输入数据无效!
\n请重新输入:
行标范围:
1--%d,列标范围1--%d!
a->
mu,a->
nu);
continue;
if(((a->
data[i].i)<
(a->
data[i-1].i))||
(((a->
data[i].i)==(a->
data[i-1].i))&
((a->
data[i].j)<
=(a->
data[i-1].j))))
/*非按行顺序输入*/
{
输入数据无效!
\n请按照按行存储的顺序输入数据!
}
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<
mu;
i++)
for(j=1;
j<
nu;
j++)
{
/*判断是否为非零元*/
if((a->
data[k].i==i)&
data[k].j==j))
%4d"
data[k].e);
k++;
0);
intFastTransposeSMatrix(Tabletype*a,Tabletype*b)
intp,q,col;
int*num;
int*cpot;
b->
mu=a->
/*原矩阵的行数为新矩阵的列数,原列数为新行数,非零元个数不变*/
nu=a->
tu=a->
num=(int*)malloc((b->
nu+1)*sizeof(int));
/*生成两个辅助数组*/
cpot=(int*)malloc((b->
if(b->
tu)/*若a不为零矩阵*/
for(col=0;
col<
a->
col++)/*初始化矩阵a的每列中非零元的个数均为0*/
num[col]=0;
col<
=a->
tu;
col++)/*统计每列中非零元的个数*/
num[a->
data[col].j]++;
cpot[1]=1;
/*确定每列中第一个非零元的位置*/
for(col=2;
col++)
cpot[col]=num[col-1]+cpot[col-1];
for(p=1;
p<
p++)
/*p为a-data的下标*/
col=a->
data[p].j;
/*交换元素*/
q=cpot[col];
data[q].i=a->
data[q].j=a->
data[p].i;
data[q].e=a->
data[p].e;
q++;
cpot[col]++;
free(num);
/*释放两个辅助数组*/
free(cpot);
/*转置成功*/
else
/*a为零矩阵*/
}
4测试
1)矩阵相乘的运行结果如图4.1所示
图4.1矩阵乘法的运行结果截图
2)矩阵相加的运行结果如图4.2所示:
图4.2矩阵加法的运行结果截图
3)矩阵减法的运行结果如图4.3所示
图4.3矩阵减法的运行结果截图
4)稀疏矩阵转置的运行结果如图4.4所示:
图4.4
图4.4稀疏矩阵转置的运行结果截图
5.总结
矩阵的相加相乘、以及稀疏矩阵的转置的开发与实践是我在大学的第一次课程设计,总体上来说在这次的课程设计当中我本人受益匪浅我了解到了如何利用C语言来开发与实现一些我们常遇到的问题,总之这次课程设计让我知道了我们学习C语言要同平时常遇的问题结合起来这样才能更好的掌握所学的知识,学以致用!
参考文献
[1]谭浩强.C程序设计教程[M].北京:
清华大学出版社,2007
[2]《数据结构》教材[M].高等教育出版社
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2008