数据结构程序设计-矩阵的运算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

五、用户手 册……………………………………………… 12 六、测试结 果……………………………………………… 13 七、心得体 会……………………………………………… 16
◎实验题目: 矩阵运算器
一.问题描述:
1. 算; 2. 利用稀疏特点进行存储和计算可以大大节省存储空间,提高计 设计一个矩阵运算器,对矩阵进行加(+)、减(-)、相乘(*)运
break; } else x=0; }//for p for(q=1;q<=N->tu;q++)//求矩阵M行列中所对应的非 零元素的值 赋值给y { if((i==N->data[q].row)&&(j==N->data[q].col)) { y=N->data[q].e; break; } else y=0; }//for q if((x+y)!=0)//判断相加后的值是否为0 不为零则插 入Q中 {//用三元组来存储所得的和 Q->data[Q->tu+1].row=i; Q->data[Q->tu+1].col=j; Q->data[Q->tu+1].e=x+y; Q->tu++; }//if }//for j }//for i return OK; } //*****************矩阵的求差运算*****************// int SubMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//求采 用三元组顺序表存储表示的稀疏矩阵M和N的差,结果赋给矩阵Q { int i,j,p,q,x=0,y=0; if((M->mu<=0)||(M->nu<=0)||(M->tu<=0)||(N->mu<=0)||(N>nu<=0)||(N->tu<=0))
for(i=1;i<=M->mu;i++)//输出矩阵 { for(j=1;j<=M->nu;j++) printf("%5d",a[i][j]); printf("\n"); } } //*************矩阵的求和运算*****************// int AddSMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//求 采用三元组顺序表存储表示的稀疏矩阵M和N的和,结果赋给矩阵Q { int i,j,p,q,x=0,y=0; if((M->mu<=0)||(M->nu<=0)||(M->tu<=0)||(N->mu<=0)||(N>nu<=0)||(N->tu<=0))//判断行数列数非零元素个数是否符合匹配 return ERROR; if(M->mu!=N->mu||M->nu!=N->nu)//判断A与B的行列数 是否相等的 return ERROR; Q->mu=M->mu;//矩阵Q的初始化 Q->nu=M->nu; Q->tu=0; for(i=1;i<=Q->mu;i++) { for(j=1;j<=Q->nu;j++)//寻找矩阵M,N中非零元素相等 的行列 { for(p=1;p<=M->tu;p++)//求矩阵M行列中所对应的 非零元素的值 赋值给X { if((i==M->data[p].row)&&(j==M->data[p].col))// 如果i是矩阵M中非零元素行,j是其列 { x=M->data[p].e;
int rnum[20]; int mu,nu,tu; }TSMatrix;
//矩阵的行数,列数,非零元个数
2、矩阵的基本操作
int CreatSMatrix(TSMatrix *M) //创建稀疏矩阵 void OutputSMatrix(TSMatrix *M) //输出稀疏矩阵 int AddSMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//矩阵相加 int SubMatrix (TSMatrix *M,TSMatrix *N,TSMatrix *Q)//稀疏矩阵相减 int jishu(TSMatrix *M)// 找出矩阵各行的第一个非零元的位置 int Multiplication(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//稀疏矩阵相乘 3、程序详细代码 # include <stdio.h> #include <iostream.h> # include <stdlib.h> # define MAXSIZE 1000 //非零元个数最大值 # define MAXRC 20 //假设矩阵的最大行数为100 # define OK 1 # define ERROR 0 typedef struct{ int row,col; //非零元的行标和列标 int e; //非零元素值 }Triple; typedef struct{//**********行逻辑连接的顺序表*******// Triple data[MAXSIZE+1]; //非零元三元组表,data[0] int rpos[MAXRC+1]; //各行第一个非零元的位置表 int rnum[20]; int mu,nu,tu; //矩阵的行数,列数,非零元个数 }TSMatrix; //*************矩阵的输入创建*********************// int CreatSMatrix(TSMatrix *M) { int k; //输入矩阵
3、 详细设计
1、稀疏矩阵、三元组类型
typedef struct{ int row; //行数 int col; //列数 int e; //非零元素值 } typedef struct{ int row,col; //非零元的行标和列标 int e; //非零元素值 }Triple; typedef struct{//行逻辑连接的顺序表// Triple data[MAXSIZE+1]; //非零元三元组表,data[0] int rpos[MAXRC+1]; //各行第一个非零元的位置表
课 程 设 计 报 告
课题名称 矩阵运算器 姓 名 学 院 系科班级 指导老师 日 期 2012年1月7日
目录
一、问题描述 ………………………………………………3 二、概要设计 ………………………………………………3
1抽象数据类型定 义………………………………………3 2程序包含模 块……………………………………………4 3函数调用关 系……………………………………………4
return ERROR; if(M->mu!=N->mu||M->nu!=N->nu) return ERROR; Q->mu=M->mu; Q->nu=M->nu; Q->tu=0; for(i=1;i<=Q->mu;i++) { for(j=1;j<=Q->nu;j++) { for(p=1;p<=M->tu;p++) { if((i==M->data[p].row)&&(j==M->data[p].col)) { x=M->data[p].e; break; } else x=0; }//for p for(q=1;q<=N->tu;q++) { if((i==N->data[q].row)&&(j==N->data[q].col)) { y=N->data[q].e; break; } else y=0; }//for q if((x+y)!=0) { Q->data[Q->tu+1].row=i; Q->data[Q->tu+1].col=j; Q->data[Q->tu+1].e=x-y; Q->tu++; }//if
(1)、 主程序模块,其中主函数为 main() {初始化图形界面; 读入用户选择信息; 根据用户选择执行相应模块; 关闭文件及图形界面; }; (2)、矩阵输入模块 (3)、矩阵输出模块 (4)、矩阵加法运算模块 (5)、矩阵减法运算模块 (6)、矩阵相乘运算模块 3、函数调用关系: 主函数 输入模块 加法运算模块 输出模块 减法运算模块 相乘运算模块
}//for j }//for i return OK; }
int jishu(TSMatrix *M) { //找出矩阵各行的第一个非零元的位置 int arow,k=1; M->rpos[1]=1;//初始化矩阵M的第一行中的第一个非零元 素在其的序号 for(arow=1;arow<=M->mu;++arow){ M->rnum[arow]=0; while(M->data[k].row==arow){M->rnum[arow]++;k++;} M->rpos[arow+1]=M->rpos[arow]+M->rnum[arow];} return OK; }
printf("输入行数:\n");//输入行数 scanf("%d",&M->mu); printf("输入列数:\n");//输入列数 scanf("%d",&M->nu); printf("输入非零元个数:\n"); scanf("%d",&M->tu); if(M->mu<=0||M->nu<=0||M->tu>MAXSIZE+1)//当行数小 于0 或者列数小于0 或者 非零元素超过非零元素最大值 return ERROR; else { for(k=1;k<=M->tu;k++) { printf("请输入元素,格式为:行数 列数 元素\n"); scanf("%d %d %d",&M->data[k].row,&M>data[k].col,&M->data[k].e); } return OK; } }
算效率; 3. 两个矩 以“带行逻辑连接信息”Байду номын сангаас三元组顺序表表示稀疏矩阵,实现
阵的相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元 组表示, 而运算结果的矩阵则以通常的矩阵形式列出。
二.概要设计:
1、抽象数据类型定义如下: ADT SparseMatrix{ 数据对象D:D={aij|i=1,2,3…,m;j=1,2,3…,n; ai ∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系R: R={Row,Col} Row={<ai,j,ai,j+1>|1≤i≤m, 1≤j≤n-1} Col={<ai,ai+1,j>|1≤i≤m-1, 1≤j≤n} 基本操作 本程序中,用三元组顺序表作为存储结构。 (1)、CreatSMatrix (TSMatrix &M) 操作结果:创建矩阵M。 (2)、AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (3)、SubMatrix (TSMatrix *a,TSMatrix *b) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (4)、MultiplicationMatrixPow (TSMatrix *a,TSMatrix *b,TSMatrix *c) 初始条件:矩阵A和B的行数和列数匹配 操作结果:求矩阵A、B的和C=A*B。 (5) OutputSMatrix(TSMatrix M) 初始条件:矩阵M已存在 操作结果:输出矩阵M 2、 本程序包含5个模块
//********************输出矩阵************//
void OutputSMatrix(TSMatrix *M) { int a[21][21]={0};//初始化矩阵 int i,j,k,m,n; for(k=1;k<=M->tu;k++)//将稀疏矩阵中的非零元素用三元 组形式表示 { m=M->data[k].row; n=M->data[k].col; a[m][n]=M->data[k].e; }
三、详细设 计………………………………………………3 1
稀疏矩阵、三元组类 型…………………………………3 2矩阵的基本操 作…………………………………………4 3程序详细代 码……………………………………………5 4函数调用关系 图…………………………………………12
四、设计和调试分 析………………………………………12
相关文档
最新文档