*****大学
数据结构课程设计说明书
题 目:稀疏矩阵运算器学生姓名:学 号:专 业:班 级:指导教师:
2013 年
7 月 24日
稀疏矩阵运算器
摘 要
摘要:设计一稀疏矩阵运算器。实现两个矩阵的相加、相减和相乘的功能。用“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算,采用分级的设计方法,分别设计出加、减、乘运算器的子程序,相加运算时只要依次存储、扫描两矩阵的行、列数,若行、列数相等,再取行、列下标相等的元素,相加后存入结果矩阵。相减运算与相加运算相同,同样取行、列下标相等的元素,相减后存入结果矩阵。相乘运算要先判断两矩阵能否相乘。若能相乘,则取行、列号相对应的元素进行相乘及相加,最后将对应元素存入结果矩阵中。通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。具备矩阵的加、减、乘功能。
关键词:相加运算器;相减运算器;相乘运算器
数据结构课程设计任务书
针对本课程设计,完成以下课程设计任务: 1、 熟悉系统实现工具和上级环境。 2、 根据课程设计任务,查阅相关资料。 3、 针对所选课题完成以下工作: (1)、需求分析 (2)、概要设计 (3)、详细设计 (4)、编写源程序
(5)、静态走查程序和上机调试程序 4、书写上述文档和撰写课程设计报告。
目 录
稀疏矩阵运算器......................................................................................................................... I 摘 要........................................................................................................................................ II 课程设计任务书.......................................................................................................................III 课程设计正文...........................................................................................................................Ⅳ
第一章 问题描述............................................................................................................... 5 第二章 需求分析............................................................................................................... 6 第三章 概要设计............................................................................................................... 9 第四章 详细设计.............................................................................................................19 4.1 函数说明..........................................................................................................10 4.2 算法分析..........................................................................................................19 第五章 调试分析.............................................................................................................21 第六章 测试结果.............................................................................................................23 第七章 课程设计总结..................................................................................................... 24 参考文献........................................................................................................................... 24 附录(程序清单)........................................................................................................... 33
第一章 问题描述
一、问题描述:
稀疏矩阵是指那些多数元素为零的矩阵,利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率,实现一个能进行稀疏矩阵基本运算的运算器。
二、基本要求:
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
第二章 需求分析
1、运算器程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。
2、由题目要求可知:首先应输入矩阵的行数、列数和非零个数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
3、程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。
4、在用三元组表示稀疏矩阵时,相加、相减和乘积所得结果矩阵应该另生成,为了算法方便,使用二维数组存放。
程序在Visual C++ 6.0环境下设计。
程序执行的命令为:1.稀疏矩阵加法;
2.稀疏矩阵减法; 3.稀疏矩阵乘法;
第三章 概要设计
1、三元组结构定义:
typedef struct {//三元组结构 int i,j; //矩阵行下标和列下标 int e; //值 }triple;
2、稀疏矩阵结构定义:
typedef struct//矩阵结构 {
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数 }tripletable;
3、两个稀疏矩阵相加函数:
Add (tripletable M,tripletable T)
4、两个稀疏矩阵相减函数:
mut (tripletable M,tripletable T)
5、两个稀疏矩阵相乘函数:
mul (tripletable M,tripletable T)
6、主函数:
void main( )
{初始化;
switch
{
接受命令; 选择处理命令; } }
7、本程序有四个模块,调用关系如下:
8、本程序的流程图:
第四章 详细设计
4.1 函数说明:
1、稀疏矩阵的三元组顺序表存储表示:
typedef struct { //三元组结构 int i,j; //行下标和列下标 int e; //值 }triple;
2、稀疏矩阵存储表示:
typedef struct/ /矩阵结构 {
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数 }tripletable;
3、 主要函数:
void Add( ) ; void cut ( ); void mul( ); int main( );
4.2 算法分析:
设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。
输入矩阵(以三元组形式输入非零元),输出矩阵(阵列形式)。
{
tripletable M; int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE];
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
矩阵的加法:
void Add()//矩阵相加
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0}; //将二维数组初始化为零
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n) //检验两矩阵能否相加
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]+b[c][d]; //两矩阵行、列号相等的元素之和为结果矩阵对应元素 }
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想:此功能由函数Add( )实现,当用户选择该功能时系统即提示用户初始化要进行加法的两个矩阵的信息。然后检测
这两个矩阵是否符合矩阵相加的规则,如果符合,进行加法。否则重新进入系统输入数据。最后输出结果。
矩阵的减法:
void cut()//矩阵相减
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n) //检验两矩阵能否进行减法运算
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]-b[c][d]; //两矩阵行、列号相等的元素之差为结果矩阵对应元素 }
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想:此功能由函数cut( )实现,当用户选择该功能时系统即提示用户初始化要进行减法的两个矩阵的信息。然后检测这两个矩阵是否符合矩阵相减的规则,如果符合,进行减法运算。否则重新进入系统输入数据。最后输出结果。
矩阵的乘法:
void mul()//矩阵相乘
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.n!=T.m)
{
cout
//判断两个矩阵能否进行乘法运算
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
for(d=1;d
{
int g,x;
int sum=0;
for(g=1;g
{
x=a[c][g]*b[g][d];
sum=sum+x;
}
f[c][d]=sum;
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想为:此功能由函数mul( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后检测两者是否可以相乘,如果不能,则重新进入系统输入,最后得到结果。
第五章 调试分析
测试数据:
(1)、矩阵的加法:
矩阵M的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:125,216,227,338; 两矩阵相加后的矩阵阵列形式为:1 7 0 6 10 4 0 0 8
(2)、矩阵的减法:
矩阵M的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:125,216,227,338; 两矩阵相加后的矩阵阵列形式为:1 -3 0 -6 -4 4 0 0 -8
(3)、矩阵的乘法:
矩阵M的行数、列数、非零个数:4、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、4、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:12 19 0 0
18 21 32 0
0 0 0 0
0 0 0 0
遇到的问题:二维数组的初始化问题;
解决方法:利用int a[MAXSIZE][MAXSIZE]={0};语句,很好的将数组a[MAXSIZE][MAXSIZE]的所有元素都初始化为零。
第六章 测试结果
(1)、矩阵的加法:
矩阵M的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:1 7 0
6 10 4
0 0 8
(2)、矩阵的减法:
矩阵M的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:1 -3 0
-6 -4 4
0 0 -8
(3)、矩阵的乘法:
矩阵M的行数、列数、非零个数:4、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、4、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:12 19 0 0
18 21 32 0
0 0 0 0
0 0 0 0
第七章 课程设计总结
由于本程序要求实现用三元组的形式对稀疏矩阵进行输入,用阵列的形式对矩阵进行输出,所以,一开始的想法构思存在困难。当发现运用二维数组进行矩阵输出时,对二维数组的赋值又出现了问题,但最终运用数组初始赋值为零的方法解决了这个问题。总的来说,此程序的理解难度并不高,整个程序的算法思想也比较简单,主要还是一些细节性问题需要去克服。
通过此次课程设计,使我更加扎实的掌握了有关三元组表示稀疏矩阵方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
在课程设计过程中,不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在一些资料和书本的帮助下,终于游逆而解。
参考文献:
[1]谭浩强著.C++程序设计(第二版)[M].北京:清华大学出版社,2009.5
[2]严蔚敏、吴伟民 主编《数据结构 (C语言版)》[M]. 清华大学出版社 2004.11
附录(源代码):
#include
using namespace std;
#define MAXSIZE 100
typedef struct {//三元组结构
int i,j; //矩阵行下标和列下标
int e; //值
}triple;
typedef struct//矩阵结构
{
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数
}tripletable;
void Add()//矩阵相加
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n)
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]+b[c][d];
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
void cut()//矩阵相减
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n)
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]-b[c][d];
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
void mul()//矩阵相乘
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.n!=T.m)
{
cout
}
for(k=1;k
{
cout>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
int g,x;
int sum=0;
for(g=1;g
{
x=a[c][g]*b[g][d];
sum=sum+x;
}
f[c][d]=sum;
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
int main()
{
int x;
tripletable *M =(tripletable*)malloc(sizeof(tripletable)); tripletable *T =(tripletable*)malloc(sizeof(tripletable));
cout>x;
switch (x)
{
case 1:
Add();
break;
case 2:
cut();
break; case 3:
mul(); break; }
}
*****大学
数据结构课程设计说明书
题 目:稀疏矩阵运算器学生姓名:学 号:专 业:班 级:指导教师:
2013 年
7 月 24日
稀疏矩阵运算器
摘 要
摘要:设计一稀疏矩阵运算器。实现两个矩阵的相加、相减和相乘的功能。用“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算,采用分级的设计方法,分别设计出加、减、乘运算器的子程序,相加运算时只要依次存储、扫描两矩阵的行、列数,若行、列数相等,再取行、列下标相等的元素,相加后存入结果矩阵。相减运算与相加运算相同,同样取行、列下标相等的元素,相减后存入结果矩阵。相乘运算要先判断两矩阵能否相乘。若能相乘,则取行、列号相对应的元素进行相乘及相加,最后将对应元素存入结果矩阵中。通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。具备矩阵的加、减、乘功能。
关键词:相加运算器;相减运算器;相乘运算器
数据结构课程设计任务书
针对本课程设计,完成以下课程设计任务: 1、 熟悉系统实现工具和上级环境。 2、 根据课程设计任务,查阅相关资料。 3、 针对所选课题完成以下工作: (1)、需求分析 (2)、概要设计 (3)、详细设计 (4)、编写源程序
(5)、静态走查程序和上机调试程序 4、书写上述文档和撰写课程设计报告。
目 录
稀疏矩阵运算器......................................................................................................................... I 摘 要........................................................................................................................................ II 课程设计任务书.......................................................................................................................III 课程设计正文...........................................................................................................................Ⅳ
第一章 问题描述............................................................................................................... 5 第二章 需求分析............................................................................................................... 6 第三章 概要设计............................................................................................................... 9 第四章 详细设计.............................................................................................................19 4.1 函数说明..........................................................................................................10 4.2 算法分析..........................................................................................................19 第五章 调试分析.............................................................................................................21 第六章 测试结果.............................................................................................................23 第七章 课程设计总结..................................................................................................... 24 参考文献........................................................................................................................... 24 附录(程序清单)........................................................................................................... 33
第一章 问题描述
一、问题描述:
稀疏矩阵是指那些多数元素为零的矩阵,利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率,实现一个能进行稀疏矩阵基本运算的运算器。
二、基本要求:
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
第二章 需求分析
1、运算器程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。
2、由题目要求可知:首先应输入矩阵的行数、列数和非零个数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
3、程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。
4、在用三元组表示稀疏矩阵时,相加、相减和乘积所得结果矩阵应该另生成,为了算法方便,使用二维数组存放。
程序在Visual C++ 6.0环境下设计。
程序执行的命令为:1.稀疏矩阵加法;
2.稀疏矩阵减法; 3.稀疏矩阵乘法;
第三章 概要设计
1、三元组结构定义:
typedef struct {//三元组结构 int i,j; //矩阵行下标和列下标 int e; //值 }triple;
2、稀疏矩阵结构定义:
typedef struct//矩阵结构 {
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数 }tripletable;
3、两个稀疏矩阵相加函数:
Add (tripletable M,tripletable T)
4、两个稀疏矩阵相减函数:
mut (tripletable M,tripletable T)
5、两个稀疏矩阵相乘函数:
mul (tripletable M,tripletable T)
6、主函数:
void main( )
{初始化;
switch
{
接受命令; 选择处理命令; } }
7、本程序有四个模块,调用关系如下:
8、本程序的流程图:
第四章 详细设计
4.1 函数说明:
1、稀疏矩阵的三元组顺序表存储表示:
typedef struct { //三元组结构 int i,j; //行下标和列下标 int e; //值 }triple;
2、稀疏矩阵存储表示:
typedef struct/ /矩阵结构 {
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数 }tripletable;
3、 主要函数:
void Add( ) ; void cut ( ); void mul( ); int main( );
4.2 算法分析:
设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。
输入矩阵(以三元组形式输入非零元),输出矩阵(阵列形式)。
{
tripletable M; int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE];
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
矩阵的加法:
void Add()//矩阵相加
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0}; //将二维数组初始化为零
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n) //检验两矩阵能否相加
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]+b[c][d]; //两矩阵行、列号相等的元素之和为结果矩阵对应元素 }
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想:此功能由函数Add( )实现,当用户选择该功能时系统即提示用户初始化要进行加法的两个矩阵的信息。然后检测
这两个矩阵是否符合矩阵相加的规则,如果符合,进行加法。否则重新进入系统输入数据。最后输出结果。
矩阵的减法:
void cut()//矩阵相减
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n) //检验两矩阵能否进行减法运算
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]-b[c][d]; //两矩阵行、列号相等的元素之差为结果矩阵对应元素 }
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想:此功能由函数cut( )实现,当用户选择该功能时系统即提示用户初始化要进行减法的两个矩阵的信息。然后检测这两个矩阵是否符合矩阵相减的规则,如果符合,进行减法运算。否则重新进入系统输入数据。最后输出结果。
矩阵的乘法:
void mul()//矩阵相乘
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.n!=T.m)
{
cout
//判断两个矩阵能否进行乘法运算
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
for(d=1;d
{
int g,x;
int sum=0;
for(g=1;g
{
x=a[c][g]*b[g][d];
sum=sum+x;
}
f[c][d]=sum;
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
以上主要设计思想为:此功能由函数mul( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后检测两者是否可以相乘,如果不能,则重新进入系统输入,最后得到结果。
第五章 调试分析
测试数据:
(1)、矩阵的加法:
矩阵M的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:125,216,227,338; 两矩阵相加后的矩阵阵列形式为:1 7 0 6 10 4 0 0 8
(2)、矩阵的减法:
矩阵M的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、3、4; 非零元素的三元组表示为:125,216,227,338; 两矩阵相加后的矩阵阵列形式为:1 -3 0 -6 -4 4 0 0 -8
(3)、矩阵的乘法:
矩阵M的行数、列数、非零个数:4、3、4; 非零元素的三元组表示为:111,112,223,234; 矩阵T的行数、列数、非零个数:3、4、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:12 19 0 0
18 21 32 0
0 0 0 0
0 0 0 0
遇到的问题:二维数组的初始化问题;
解决方法:利用int a[MAXSIZE][MAXSIZE]={0};语句,很好的将数组a[MAXSIZE][MAXSIZE]的所有元素都初始化为零。
第六章 测试结果
(1)、矩阵的加法:
矩阵M的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:1 7 0
6 10 4
0 0 8
(2)、矩阵的减法:
矩阵M的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、3、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:1 -3 0
-6 -4 4
0 0 -8
(3)、矩阵的乘法:
矩阵M的行数、列数、非零个数:4、3、4;
非零元素的三元组表示为:111,112,223,234;
矩阵T的行数、列数、非零个数:3、4、4;
非零元素的三元组表示为:125,216,227,338;
两矩阵相加后的矩阵阵列形式为:12 19 0 0
18 21 32 0
0 0 0 0
0 0 0 0
第七章 课程设计总结
由于本程序要求实现用三元组的形式对稀疏矩阵进行输入,用阵列的形式对矩阵进行输出,所以,一开始的想法构思存在困难。当发现运用二维数组进行矩阵输出时,对二维数组的赋值又出现了问题,但最终运用数组初始赋值为零的方法解决了这个问题。总的来说,此程序的理解难度并不高,整个程序的算法思想也比较简单,主要还是一些细节性问题需要去克服。
通过此次课程设计,使我更加扎实的掌握了有关三元组表示稀疏矩阵方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
在课程设计过程中,不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在一些资料和书本的帮助下,终于游逆而解。
参考文献:
[1]谭浩强著.C++程序设计(第二版)[M].北京:清华大学出版社,2009.5
[2]严蔚敏、吴伟民 主编《数据结构 (C语言版)》[M]. 清华大学出版社 2004.11
附录(源代码):
#include
using namespace std;
#define MAXSIZE 100
typedef struct {//三元组结构
int i,j; //矩阵行下标和列下标
int e; //值
}triple;
typedef struct//矩阵结构
{
triple data[MAXSIZE+1];
int m,n,t; //矩阵的行数、列数、非零元个数
}tripletable;
void Add()//矩阵相加
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n)
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]+b[c][d];
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
void cut()//矩阵相减
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.m!=T.m||M.n!=T.n)
{
cout
return ;
}
for(k=1;k
{
cout
cin>>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
f[c][d]=a[c][d]-b[c][d];
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
void mul()//矩阵相乘
{
tripletable M;
tripletable T;
int m,n,t,i,j,e,k,c,d;
int a[MAXSIZE][MAXSIZE]={0};
int b[MAXSIZE][MAXSIZE]={0};
int f[MAXSIZE][MAXSIZE]={0};
cout
cin>>M.m>>M.n>>M.t;
for(k=1;k
{
cout
cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
}
cout
for(k=1;k
{
a[M.data[k].i][M.data[k].j]=M.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
cout
cin>>T.m>>T.n>>T.t;
if(M.n!=T.m)
{
cout
}
for(k=1;k
{
cout>T.data[k].i>>T.data[k].j>>T.data[k].e;
}
cout
for(k=1;k
{
b[T.data[k].i][T.data[k].j]=T.data[k].e;
}
for(c=1;c
{
for(d=1;d
cout
cout
}
for(c=1;c
{
for(d=1;d
{
int g,x;
int sum=0;
for(g=1;g
{
x=a[c][g]*b[g][d];
sum=sum+x;
}
f[c][d]=sum;
}
}
cout
for(c=1;c
{
for(d=1;d
cout
cout
}
}
int main()
{
int x;
tripletable *M =(tripletable*)malloc(sizeof(tripletable)); tripletable *T =(tripletable*)malloc(sizeof(tripletable));
cout>x;
switch (x)
{
case 1:
Add();
break;
case 2:
cut();
break; case 3:
mul(); break; }
}