稀疏矩阵
[3]《数据结构》(C语言版),刘大有,高等教育出版社,2004.
[4]《Data Structure with C++》,William Ford.William Topp,清华大学出版社,2003.
4、课程设计工作进度计划
第1天完成方案设计与程序框图
第2、3天编写程序代码
第4天程序调试分析和结果
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名: 年 月 日
摘要
本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘等操作,最后输出运算后的结果。考虑到难易程度,先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘等操作的方法,再在十字链表下实现。程序通过调试运行,结果与预期一样,初步实现了设计目标。
//循环输出矩阵
for(arow=1;arow<=A->mu;arow++)
{
printf("\n");//矩阵换行
for(col=1;col<=A->nu;col++)
{
if(A->data[i].i==arow&&A->data[i].j==col&&i<=A->tu)//判断是否是非零元素
printf("%-4d",A->data[i++].e);//输出非零元素
2.1需求分析
根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,可以在程序中提供矩阵相加,转置矩阵和矩阵输出等操作。本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵
R->tu=0;//先将非零元个数设置为零
R->mu=A->mu;//设置R的行数
R->nu=A->nu;//设置R的列数
if(A->mu!=B->mu || A->nu!=B->nu){//判断矩阵是否合法
printf("******你输入的矩阵不能相加,请重新开始输入合格的矩阵\n*****");
else printf("%-4d",z); //输出零元素
}
}
printf("\n");
}
4.3 两矩阵相加
void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *R) //两矩阵加法实现函数
{
int x=1;//控制列下标
int y=1;//控制行下标
int z=1;//记录R中的非零元素的个数
进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。
2.2总体设计
根据上面的需求分析,可以将这个系统的设计分为1矩阵相加,2 矩阵转置,3 构体(包括两个结构体),第一个结构体包括行列下标和非零元素的值,第二个结构体包括非零元素个数的最大值与矩阵的行列值。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
R->data[z].e=A->data[x].e+B->data[y].e;
x++; y++;
}
else if(A->data[x].i==i&&A->data[x].j==j){//判断A是否是非零项
R->data[z].e=A->data[x].e; x++;
}
else if(B->data[y].i==i&&B->data[y].j==j){//判断B是否是非零项
T.data[q].e=M->data[p].e;
++q;
}
}
}
printf("转置矩阵是:\n");
Printf(&T);//通过Printf函数将转置矩阵输出
}
/*void FTS(RLSMatrix *M,RLSMatrix T){//转置矩阵函数
if((A->mu==1&&A->nu==1)&&(B->mu==1&&B->nu==1)){//判断矩阵是否合法
exit(0);
}
if((A->mu<=1&&A->nu<=1)&&(B->mu<=1&&B->nu<=1)){
printf("你输入的A,B矩阵都不对\n");
exit(0);
}else if(A->mu<=1&&A->nu<=1){
printf("你输入的A矩阵不对\n");
exit(0);
}else if(B->mu <=1&&B->nu <=1){
printf("你输入的A,B矩阵都不对\n");
exit(0);
}else if(A->mu==1&&A->nu==1){
printf("你输入的A矩阵不对\n");
exit(0);
}else {
printf("你输入的B矩阵不对\n");
exit(0);
#define MAXRC 100
typedef struct{//定义非零元素的结构体的行,列下标与非零元素的值
int i,j;//行,列下标
int e; //非零元素的值
}Triple;//定义结构体变量
typedef struct//定义矩阵的行,列,及非零元素的个数的结构体
{
Triple data[MAXSIZE+1];//定义非零元素的最大个数
R->data[z].e=B->data[y].e; y++;
}
else {
R->data[z].e=0;//非零项赋值为零
}
z++;
}
R->tu=z;
printf("矩阵A为:\n"); //输出矩阵A
Printf(A);
printf("矩阵B为:\n"); //输出矩阵B
Printf(B);
printf("矩阵相加结果为:\n"); //输出相加矩阵
实现矩阵的输入,并用并采用三元组表示。
实现两个矩阵(A,B)的加法。
实现对任意一个矩阵(A,B)的转置。
可以输出任意矩阵(A,B,R)。
1.3设计涉及知识
注意合理地设计三元组或者十字链表,结合稀疏矩阵的压缩存储方式和特点,将每一功能模块以函数形式分别实现。在此基础上用C/C++实现其操作。
2
以三元组、十字链表为存储形式,分别实现两个稀疏矩阵的加法运算、两个稀疏矩阵的乘法运算,以及对任意稀疏矩阵的转置运算。稀疏矩阵要求可为键盘录入的任意矩阵。
本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个稀疏矩阵A和B的和为矩阵R,并输出R;求出A的转置为矩,输R。
1
1.1题目名称:稀疏矩阵的操作
1.2设计要求
printf("你输入的B矩阵不对\n");
exit(0);
}
for(int i=1;i<=A->mu;i++)//循环赋值
for(int j=1;j<=A->nu;j++){
R->data[z].i=i;
R->data[z].j=j;
if(A->data[x].i==i&&A->data[x].j==j&&B->data[y].i==i&&B->data[y].j==j){//判断A,B是否都是非零项
exit(0);
}
if(T.tu){//看矩阵是否有非零项