数据结构实验报告(实验五 稀疏矩阵运算器)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Βιβλιοθήκη Baidu
【源程序】 #include<stdio.h> #include<stdlib.h> #include<iostream.h> #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{
int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数 }rtripletable;
韶关学院 学生实验报告册
实验课程名称:数据结构与算法 实验项目名称:实验五 数组及其应用
稀疏矩阵运算器 实验类型(打√ ):(基础 、综合 、设计√ )
院 系:信息工程学院计算机系 姓 名:*** 指导老师:陈正铭
专 业:***** 学 号:*****
韶关学院教务处编制
一、实验预习报告内容
预习日期:2007 年 5 月 29 日 实验预习报告内容原则上应包括实验目的、实验所用的主要仪器药品、实验原理与公式、 实验预习疑问等项目。
} ADT Array
【疑问】
(这部分内容因人而异,也可不写)
实验预习评分:
二、实验原始(数据)记录
实 验 时 间: 2007 年 5 月 30 日(星期 三 第 7,8 节) 实验同组人 : 如有实验实验数据表格,学生在实验预习时应画好实验数据表格,供实验填写数据。 请选择所需要的操作功能(A,B,C,D,E,F)A 请输入矩阵的行数和列数: 行数 2 列数 2 非零元素个数:2 请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记! 129 2 1 -1 请选择所需要的操作功能(A,B,C,D,E,F):B 请输入矩阵的行数和列数: 行数 2 列数 2 非零元素个数:2 请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记! 1 1 -1 2 1 -3 请选择所需要的操作功能(A,B,C,D,E,F):C 加法结果为: |-1 9| |-4 0| 请选择所需要的操作功能(A,B,C,D,E,F):D 减法结果为: |1 9| |2 0| 请选择所需要的操作功能(A,B,C,D,E,F):E 乘法结果为: |-27 0| |1 0|
基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵 M. Print SMatrix(M); //初始化条件: 稀疏矩阵 M 存在. //操作结果:输出稀疏矩阵 M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 与 N 的行数和列数对应相等. //操作结果:求稀疏矩阵的和 Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 与 N 的行数和列数对应相等. //操作结果:求稀疏矩阵的差 Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 的列数等于 N 的行数. //操作结果:求稀疏矩阵的乘积 Q=M*N.
int addsmatrix(rtripletable M, rtripletable N) //矩阵相加 {
if(M.mu!=N.mu) //行数相等才能相加 cout<<"出错"; rtripletable Q;Q.mu=M.mu;Q.nu=N.nu; int p,q,k; p=1;q=1;k=1; while(p<=M.tu&&q<=N.tu) //两个稀疏矩阵存在 { if(M.data[p].row==N.data[q].row) //两个稀疏矩阵的行数相等 { if(M.data[p].col==N.data[q].col) //两个稀疏矩阵的列数相等 {
主程序模块
创建稀疏矩阵模块
运算稀疏矩阵模块
【详细设计】
打印稀疏矩阵模块 稀疏矩阵运算器
矩阵相加
矩阵相减
输入矩阵 1
输入矩阵 1
输入矩阵 2
输入矩阵 2
计算结果
计算结果
typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值
}triplenode;
3、进入界面后,只要选择数字命令按“回车键”就行。 4、接受其他命令后即执行相应的操作和相应的结果。 实验报告评分:
注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实 验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。
2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。
int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为 0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<<result[loop1][loop2]<<""; //输出所做运算的结果 cout<<"|"<<endl; } }
|
A、输入矩阵 1
|
|
B、输入矩阵 2
|
|
C、矩阵相加
|
|
D、矩阵相减
|
|
E、矩阵相乘
|
|
F、退出本系统
|
------------------------------------------------------------------------------------------------------请选择所需要的操作功能(A,B,C,D,E,F) :
void creat(rtripletable &A) //创建稀疏矩阵 {
int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<<endl; cout<<"行数:";cin>>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零 元.并以全零为结束标记!"<<endl; for(loop=1;loop<=A.tu;loop++) {
//稀疏矩阵相乘
【调试分析】(这部分内容因人而异)
1、由于开始对顺序存储的知识还不熟识,在三元组的存储和运用会导致算法低效。 2、做到存储的时候,开始时不知道怎样存储三元组,和不知如何去运用它的行数,
列数,非零元素。 3、在使用选择和循环时,有时因为自己的粗心,把循环的条件弄错了。 4、做本程序用到了数组的知识,有时一有不懂的东西又只能打开书来看。 5、开始时没有把矩阵的加法和减法的情况考虑全面,导致输出的时候会出现简单的错
Windows 2000,Visual C++ 6.0 或 WINTC 【概要设计】
ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1}
数据关系: R = { ROW, COL } ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
矩阵相乘 输入矩阵 1 输入矩阵 2 计算结果
退出本系统
typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数
}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 void print(rtripletable A) //输出稀疏矩阵 int addsmatrix(rtripletable M, rtripletable N) //矩阵相加 int subsmatrix(rtripletable M, rtripletable N) //稀疏矩阵相减 void multsmatrix(rtripletable M, rtripletable N, rtripletable &Q)
cin>>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A 三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求 A 中每一列含非零元个数 A.rowtab[1]=1; //求第 p 列中第一个非零元在 A.data 中的序号 for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 {
|********** 稀 疏 矩 阵 运 算 器 **********|
=============================================================
|============================================================ |
if(M.data[p].v+N.data[q].v!=0) //两个稀疏矩阵相加的结果不为 0 {
Q.data[k].row=M.data[p].row; Q.data[k].col=M.data[p].col; Q.data[k].v=M.data[p].v+N.data[q].v;++k; } ++q;++p; } else if(M.data[p].col<N.data[q].col) //第一个稀疏矩阵列数小于第二个稀疏矩阵列数 {
指导教师 批阅及签名
三、实验报告内容
2007 年 5 月 30 日
实验报告内容原则上应包括主要实验步骤、实验数据计算(实验操作)结果、实验结果 (疑问)分析等项目。 【主程序模块】:
void main() {
初始化; do{
接受命令; 处理命令; }while(命令!=“退出”); } 【功能模块调用关系图】
【实验目的】深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 【需要分析】稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以 大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行 逻辑链接信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入 以三元组表示,输出以通常的阵列形式列出。 【软件平台】
误。 【用户手册】
1 、 本 程 序 的 运 行 环境为 Windows me 下 的 Microsofe VC++ 6.0, 执行文 件 为 : xishujuzhen.cpp。
2、进入演示程序后即显示文本方式的用户界面:
-------------------------------------------------------------------------------------------------------
Q.data[k]=M.data[p]; //把 M 中的所有信息都赋给 Q ++p;++k; } else //第一个稀疏矩阵列数大于第二个稀疏矩阵的列数 { Q.data[k]=N.data[q];++q;++k; } } else if(M.data[p].row<N.data[q].row) //第一个稀疏矩阵行列数小于第二个稀疏矩阵行数 { Q.data[k]=M.data[p];++p;++k; } else //第一个稀疏矩阵行列数小于第二个稀疏矩阵行数 {
【源程序】 #include<stdio.h> #include<stdlib.h> #include<iostream.h> #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{
int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数 }rtripletable;
韶关学院 学生实验报告册
实验课程名称:数据结构与算法 实验项目名称:实验五 数组及其应用
稀疏矩阵运算器 实验类型(打√ ):(基础 、综合 、设计√ )
院 系:信息工程学院计算机系 姓 名:*** 指导老师:陈正铭
专 业:***** 学 号:*****
韶关学院教务处编制
一、实验预习报告内容
预习日期:2007 年 5 月 29 日 实验预习报告内容原则上应包括实验目的、实验所用的主要仪器药品、实验原理与公式、 实验预习疑问等项目。
} ADT Array
【疑问】
(这部分内容因人而异,也可不写)
实验预习评分:
二、实验原始(数据)记录
实 验 时 间: 2007 年 5 月 30 日(星期 三 第 7,8 节) 实验同组人 : 如有实验实验数据表格,学生在实验预习时应画好实验数据表格,供实验填写数据。 请选择所需要的操作功能(A,B,C,D,E,F)A 请输入矩阵的行数和列数: 行数 2 列数 2 非零元素个数:2 请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记! 129 2 1 -1 请选择所需要的操作功能(A,B,C,D,E,F):B 请输入矩阵的行数和列数: 行数 2 列数 2 非零元素个数:2 请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记! 1 1 -1 2 1 -3 请选择所需要的操作功能(A,B,C,D,E,F):C 加法结果为: |-1 9| |-4 0| 请选择所需要的操作功能(A,B,C,D,E,F):D 减法结果为: |1 9| |2 0| 请选择所需要的操作功能(A,B,C,D,E,F):E 乘法结果为: |-27 0| |1 0|
基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵 M. Print SMatrix(M); //初始化条件: 稀疏矩阵 M 存在. //操作结果:输出稀疏矩阵 M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 与 N 的行数和列数对应相等. //操作结果:求稀疏矩阵的和 Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 与 N 的行数和列数对应相等. //操作结果:求稀疏矩阵的差 Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵 M 的列数等于 N 的行数. //操作结果:求稀疏矩阵的乘积 Q=M*N.
int addsmatrix(rtripletable M, rtripletable N) //矩阵相加 {
if(M.mu!=N.mu) //行数相等才能相加 cout<<"出错"; rtripletable Q;Q.mu=M.mu;Q.nu=N.nu; int p,q,k; p=1;q=1;k=1; while(p<=M.tu&&q<=N.tu) //两个稀疏矩阵存在 { if(M.data[p].row==N.data[q].row) //两个稀疏矩阵的行数相等 { if(M.data[p].col==N.data[q].col) //两个稀疏矩阵的列数相等 {
主程序模块
创建稀疏矩阵模块
运算稀疏矩阵模块
【详细设计】
打印稀疏矩阵模块 稀疏矩阵运算器
矩阵相加
矩阵相减
输入矩阵 1
输入矩阵 1
输入矩阵 2
输入矩阵 2
计算结果
计算结果
typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值
}triplenode;
3、进入界面后,只要选择数字命令按“回车键”就行。 4、接受其他命令后即执行相应的操作和相应的结果。 实验报告评分:
注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实 验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。
2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。
int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为 0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<<result[loop1][loop2]<<""; //输出所做运算的结果 cout<<"|"<<endl; } }
|
A、输入矩阵 1
|
|
B、输入矩阵 2
|
|
C、矩阵相加
|
|
D、矩阵相减
|
|
E、矩阵相乘
|
|
F、退出本系统
|
------------------------------------------------------------------------------------------------------请选择所需要的操作功能(A,B,C,D,E,F) :
void creat(rtripletable &A) //创建稀疏矩阵 {
int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<<endl; cout<<"行数:";cin>>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零 元.并以全零为结束标记!"<<endl; for(loop=1;loop<=A.tu;loop++) {
//稀疏矩阵相乘
【调试分析】(这部分内容因人而异)
1、由于开始对顺序存储的知识还不熟识,在三元组的存储和运用会导致算法低效。 2、做到存储的时候,开始时不知道怎样存储三元组,和不知如何去运用它的行数,
列数,非零元素。 3、在使用选择和循环时,有时因为自己的粗心,把循环的条件弄错了。 4、做本程序用到了数组的知识,有时一有不懂的东西又只能打开书来看。 5、开始时没有把矩阵的加法和减法的情况考虑全面,导致输出的时候会出现简单的错
Windows 2000,Visual C++ 6.0 或 WINTC 【概要设计】
ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1}
数据关系: R = { ROW, COL } ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
矩阵相乘 输入矩阵 1 输入矩阵 2 计算结果
退出本系统
typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数
}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 void print(rtripletable A) //输出稀疏矩阵 int addsmatrix(rtripletable M, rtripletable N) //矩阵相加 int subsmatrix(rtripletable M, rtripletable N) //稀疏矩阵相减 void multsmatrix(rtripletable M, rtripletable N, rtripletable &Q)
cin>>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A 三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求 A 中每一列含非零元个数 A.rowtab[1]=1; //求第 p 列中第一个非零元在 A.data 中的序号 for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 {
|********** 稀 疏 矩 阵 运 算 器 **********|
=============================================================
|============================================================ |
if(M.data[p].v+N.data[q].v!=0) //两个稀疏矩阵相加的结果不为 0 {
Q.data[k].row=M.data[p].row; Q.data[k].col=M.data[p].col; Q.data[k].v=M.data[p].v+N.data[q].v;++k; } ++q;++p; } else if(M.data[p].col<N.data[q].col) //第一个稀疏矩阵列数小于第二个稀疏矩阵列数 {
指导教师 批阅及签名
三、实验报告内容
2007 年 5 月 30 日
实验报告内容原则上应包括主要实验步骤、实验数据计算(实验操作)结果、实验结果 (疑问)分析等项目。 【主程序模块】:
void main() {
初始化; do{
接受命令; 处理命令; }while(命令!=“退出”); } 【功能模块调用关系图】
【实验目的】深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 【需要分析】稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以 大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行 逻辑链接信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入 以三元组表示,输出以通常的阵列形式列出。 【软件平台】
误。 【用户手册】
1 、 本 程 序 的 运 行 环境为 Windows me 下 的 Microsofe VC++ 6.0, 执行文 件 为 : xishujuzhen.cpp。
2、进入演示程序后即显示文本方式的用户界面:
-------------------------------------------------------------------------------------------------------
Q.data[k]=M.data[p]; //把 M 中的所有信息都赋给 Q ++p;++k; } else //第一个稀疏矩阵列数大于第二个稀疏矩阵的列数 { Q.data[k]=N.data[q];++q;++k; } } else if(M.data[p].row<N.data[q].row) //第一个稀疏矩阵行列数小于第二个稀疏矩阵行数 { Q.data[k]=M.data[p];++p;++k; } else //第一个稀疏矩阵行列数小于第二个稀疏矩阵行数 {