稀疏矩阵的运算(完美版)

  • 格式:doc
  • 大小:607.00 KB
  • 文档页数:21

专业课程设计I报告

( 2011 / 2012 学年 第 二 学期)

题目 稀疏矩阵的转换

专 业 软件工程

学 生 姓 名 张鹏宇

班 级 学 号 09003018

指 导 教 师 张卫丰

.

指 导 单 位 计算机学院软件工程系

日 期 2012年6月18号

指导教师成绩评定表

学生姓名 班级学号 专业

评分内容 评分标准 优秀 良好 中等 差

平时成绩 认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事

设计成果 设计的科学、合理性

功能丰富、符合题目要求

界面友好、外观漂亮、大方

程序功能执行的正确性

程序算法执行的效能

设计报告 设计报告正确合理、反映系统设计流程

文档内容详实程度

文档格式规范、排版美观

验收答辩 简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。

.

评分等级

指导教师

简短评语

指导教师签名 日期

备注 评分等级有五种:优秀、良好、中等、及格、不及格

附件:

稀疏矩阵的转换

一、 课题内容和要求

1.问题描述

设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。

2.需求分析

(1)设计函数建立稀疏矩阵,初始化值。

(2)设计函数输出稀疏矩阵的值。

(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。

(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。

(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。

(6)构造函数进行稀疏矩阵的转置,并输出结果。

(7)退出系统。

二、设计思路分析

.

(1)设计函数建立稀疏矩阵,初始化值。

(2)设计函数输出稀疏矩阵的值。

(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。

(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。

(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。

(6)构造函数进行稀疏矩阵的转置,并输出结果。

(7)退出系统。

三、概要设计

为了实现以上功能,可以从3个方面着手设计。

1.主界面设计

为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。

.

2.存储结构设计

本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。

3.系统功能设计

本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。

(1)稀疏矩阵的加法:

此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。

(2)稀疏矩阵的乘法:

此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。

(3)稀疏矩阵的转置:

此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。

(4)退出:

即退出稀疏矩阵的应用系统。由函数5实现,但用户选择此功能时,系统会提示你是否确实想退出,如果是,则退出,否则继续。

三、 模块设计

.

1.模块设计

本程序包含1个模块:主程序模块加各功能实现模块。

2.系统子程序及功能设计

本系统共设置7个子程序,各子程序的函数名及功能说明如下。

(1)typedef int ElemType // 初始化矩阵

( 2 ) void Creat(TSMatrix &M) //建立矩阵

(3)void Print_SMatrix(TSMatrix M) // 输出矩阵的信息

以下编号(4)-(6)是稀疏矩阵的基本操作。依次是:相加,相乘,转置等。

(4)void Xiangjia(TSMatrix A,TSMatrix B,TSMatrix &C,int n)

//把A 和B两个矩阵相加,结果是C

(5)void Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q)

//把A和B两个矩阵相乘,结果是Q

(6)void Zhuanzhi(TSMatrix *a,TSMatrix *b)

// 把A转置

(7)void main()

// 主函数。设定界面的颜色,大小和窗口的标题,调用工作区模块函数

四、详细设计

#include

#include

#include

#define MAXSIZE 40 //假设非零元素个数的最大值为40

#define MAXRC 20 //假设矩阵的最大行数为20

.

typedef int ElemType;

typedef struct

{

int i,j; //非零元的行下标和列下标

ElemType e; //非零元的值

}Triple;

typedef struct

{

Triple data[MAXSIZE+1];

int rpos[MAXRC+1]; //各行第一个非零元在三元组的位置表

int hs,ls,fls;

}TSMatrix,*Matrix;

void Creat(TSMatrix &M)

{

int i,k;

for(i=1;i<=MAXRC+1;i++)

M.rpos[i]=0;

printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):");

scanf("%d %d %d",&M.hs,&M.ls,&M.fls);

.

for(i=1;i<=M.fls;i++)

{

printf("请用三元组形式输入矩阵的元素(行 列 非零元素):");

scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);

}

for(i=1,k=1;i<=M.hs;i++)

{

M.rpos[i]=k;

while(M.data[k].i<=i && k<=M.fls)

k++;

}

}

void Xiangjia(TSMatrix A,TSMatrix B,TSMatrix &C,int n)

{

int a,b,temp,l;

C.hs=A.hs;

C.ls=A.ls;

a=b=l=1;

while(a<=A.fls && b<=B.fls)

{

if(A.data[a].i==B.data[b].i)

.

{

if(A.data[a].j

C.data[l++]=A.data[a++];

else if(A.data[a].j>B.data[b].j)

{C.data[l]=B.data[b]; C.data[l++].e=n*B.data[b++].e;}

else{

temp=A.data[a].e+n*B.data[b].e;

if(temp)

{

C.data[l]=A.data[a];

C.data[l].e=temp;

l++;

}

a++;b++;

}

}

else if(A.data[a].i

C.data[l++]=A.data[a++];

else {C.data[l]=B.data[b]; C.data[l++].e=n*B.data[b++].e;}

}

while(a<=A.fls)

.

C.data[l++]=A.data[a++];

while(b<=B.fls)

{C.data[l]=B.data[b]; C.data[l++].e=n*B.data[b++].e;}

C.fls=l-1;

}

int Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q)

{

int arow,brow,ccol,tp,p,q,t;

int ctemp[MAXRC+1];

if(A.ls!=B.hs) return 0;

Q.hs=A.hs;Q.ls=B.ls;Q.fls=0;

if(A.fls*B.fls)

{

for(arow=1;arow<=A.hs;arow++)

{

for(ccol=1;ccol<=Q.ls;ccol++)

ctemp[ccol]=0;

Q.rpos[arow]=Q.fls+1;

if(arow

else tp=A.fls+1;

for(p=A.rpos[arow];p