数据结构课程设计(矩阵的运算)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“matlab矩阵的基本运算”。
数 据 结 构
课程设计报告
题 目: 专 业: 班 级: 学 号: 姓 名: 指导老师: 时 间:
一、课程设计题目及所涉及知识点
设计题目是“矩阵的运算”,所涉及的知识点主要是:
1、数据结构中的对于结构体的定义,用typedef struct来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num和cpot两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
二、课程设计思路及算法描述
设计思路:
1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int类型的行数(mu)列数(nu)以及非零元素的个数(tu);然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float来定义类型)。
3、在main函数里面,来实现对于数据的输入操作,利用if语句进行选择来执行操作,利用do……while语句来实现功能的循环操作。
4、分五个函数调用分别来实现转置、加法、乘法、和逆运算,每个里面都有最终输出结果的方式。
算法1:矩阵的转置
输入:mu中存放矩阵的行数,tu存放矩阵的列数,i接收行下标的数值,j接收列下标的数值,e来存储数据。输出:转置后的新矩阵。
输入两行两列数据,在第二行第一列中有个数据为12,其余都为0,则输出的结果为第一行第二列数据为12,其余为0。
算法2:矩阵的加法运算 输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵加完后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第二列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为20,第一行第二列数据为30,其余为0。
算法3:矩阵的减法运算
输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵相减后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第一列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为-10,其余为0。
算法4:矩阵的乘法运算
输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵加完后的另一个新矩阵。
输入两行两列的矩阵,第一个矩阵里面第一行第一列有个数据2第二列有个数据3,其余为0,在第二个矩阵里面第一行第一列有个数据2第二列中有个数据3,其余为0,则输出的结果为一个两行两列的矩阵,其中第一行第一列数据为4,第二列为6,第一行第二列数据为30,其余为0。
算法五:矩阵的逆运算
输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵进行逆运算完后的另一个新矩阵。
输入三行三列的矩阵,第一个矩阵里面第一行第一列有个数据3个数据分别为1,2,3;第二行的数据分别为2,2,1;第三行的暑假分别为3,4,3;则输出的结果为三行三列矩阵,其中第一行的数据为1,3,-2;第二行的数据分别为-1.5,-3,2.5;
第三行的数据分别为1,1,-1。
三、课程设计中遇到的难点及解决办法
1、在转置的过程中,要求把转置后的矩阵输出出来,因为用的是三元组顺序表的存储形式,所以不知道怎么去实现,然后通过进一步思考,运用先把一个矩阵存入零元素,然后在对其进行更改,最后完成了此项的工作。
2、就是对于矩阵的乘法运算和逆运算,掌握的不够熟练,先是通过书籍对于矩阵的乘法和逆运算得到更深的了解,然后通过一步步写程序最后实现了矩阵的乘法运算和逆运算。
四、总结
通过此次课程设计,让我对于编程有了更深的认识,老师的精心指导让我学会到了很多,不仅仅是代码,最主要的让我的思维开阔了很多,在这个过程中,通过不断的尝试,不断的修改,最终克服了困难,完成了自己的任务,心里有种无比的喜悦,但同时又感觉到了自己的知识面的狭隘,还有好多知识的海洋还没有畅游,等待自己将是一回更大的考验。
对于现在的自己,对学习程序还是有很大的兴趣,它让我体验到了很多的快乐,我要进步跟进现在的课程,努力去发展自己,按照老师说的最主要的是具有了编程的思想,则具有了编程的能力,我想我可以成功完成自己的目标。
五、附录—主要源程序代码及运行结果
1、主要源程序代码: # include # define max 100 # define maxsize 100 typedef float elemtype;typedef struct { float b[max][max];int i;//矩阵的行数 int j;// 矩阵的列数 } tsmatrix;typedef struct { int i,j;//该非零元的行下标和列下标
elemtype e;}triple;typedef struct { triple data[maxsize+1];//非零元三元组,data[0]未用 int mu,nu,tu;//矩阵的行数、列数和非零元个数 }sqlist;void zhuanzhi(sqlist s1,tsmatrix &l2)//矩阵的转置
{ sqlist s2;int col,t9,p,q,a1,b1;int num[100],copt[100];s2.mu=s1.mu;s2.nu=s1.nu;s2.tu=s1.tu;if(s2.tu>0){ for(col=1;col
++num[s1.data[t9].j];//求s1中每一列含非零元个数
copt[1]=1;//求第col列中第一个非零元在s2.data中序号
for(col=2;col
{ col=s1.data[p].j;
q=copt[col];
s2.data[q].i=s1.data[q].j;s2.data[q].j=s1.data[q].i;s2.data[q].e=s1.data[q].e;++copt[col];
l2.b[s2.data[q].i][s2.data[q].j]=s2.data[q].e;} printf(“转置后的数据是:n”);printf(“**************************************n”);for(a1=1;a1
printf(“t”);} printf(“n”);} printf(“************************************”);printf(“n”);} } void jiafa(tsmatrix l4, tsmatrix l5)//矩阵的加法 {tsmatrix l6;for(int t=0;t
l6.b[t][t1]+=l4.b[t][k]*l5.b[k][t1];} printf(“矩阵乘完后的结果:n”);printf(“******************************n”);for(int t2=0;t2
for(j=0;j
{ if(j
else if(j==s.i+i)s1.b[i][j]=1.0;
else s1.b[i][j]=0.0;
}
for(i=0;i
{ for(k=0;k
{if(k!=i)
{ t=s1.b[k][i]/s1.b[i][i];
for(j=0;j
{ x=s1.b[i][j]*t;
s1.b[k][j]=s1.b[k][j]-x;
}
}
}} for(i=0;i
s1.b[i][j]=s1.b[i][j]/t;} float y=1.0;for(i=0;i
printf(“对不起,您输入的矩阵没有逆矩阵”);
else
{ for(i=0;i
for(j=0;j
{ for(j=0;j
printf(“%10.3f”,s.b[i][j]);
printf(“n”);}}} void main(){ tsmatrix l,l1,l3;sqlist s;int m,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;do{ printf(“请输入你要进行的操作:n”);
printf(“******************************n”);
printf(“矩阵转置运算请按1n矩阵的加法运算请按2n矩阵的乘法运算请按3n矩阵的减法运算请按4n矩阵的逆运算请按5n结束请按0:n”);printf(“******************************n”);scanf(“%d”,&m1);if(m1==1){ printf(“您选择进行的操作是矩阵的转置运算nn”);
printf(“请输入你要转置矩阵的行数、列数和非零元的个数n”);scanf(“%d”,&t1);
scanf(“%d”,&t2);scanf(“%d”,&t3);s.mu=t1;s.nu=t2;s.tu=t3;printf(“请输入你要转置矩阵非零元的行下标、列下标(从[1][1]开始由左至右由上到下)及其数据(按行逐个输入)n”);for(t4=1;t4
s.data[t4].i=t5;s.data[t4].j=t6;
scanf(“%f”,&s.data[t4].e);} for(t7=1;t7
printf(“******************************n”);printf(“******************************n”);printf(“请输入第二个%d行%d列的矩阵n”,l3.i,l3.j);for(n4=0;n4
l.j=m;l3.i=n;l3.j=m;printf(“******************************n”);printf(“请输入第一个%d行%d列的矩阵n”,l.i,l.j);{ for(t=0;t
if(m1==5){ printf(“您选择进行的操作是矩阵的逆运算nn”);printf(“请输入矩阵的维数(即行和列相等的矩阵):n”);scanf(“%d”,&n);l.i=n;l.j=n;printf(“******************************n”);printf(“请输入%d行%d列的矩阵n”,l.i,l.j);{ for(t=0;t
2、运行结果(如下图):
(1)、执行的首界面:
(2)、矩阵的转置运算:
(3)、矩阵的加法运算:
(4)、矩阵的减法运算:
(5)、矩阵的乘法
(6)、矩阵的逆运算:
(7)、矩阵可以循环运算:
六、指导老师评语及成绩
课 程 设 计 任 务 书信息 学院 信息管理与信息系统 专业 09级1班 班 孙鹏一、二、课程设计题目: 迷宫求解、一元多项式 课程设计主要参考资料: 数据结构(C语言版) 严蔚敏、吴伟......
数据结构课程设计题目(2013年)一、必做题 1、图书管理系统(线性表) [问题描述]设计一个程序,记录并统计图书使用情况。 [基本要求] (1)图书信息包括图书ID号,图书名,出版社名,出版年月......
课程设计题目1、运动会分数统计任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或......
《数据结构》课程设计报告学 号 姓 名 班 级 指导教师XXX XXX XXX XXX 安徽工业大学计算机学院2014年6月利用栈实现迷宫问题的求解一、问题描述以一个M*N的长方阵表示迷宫,0......
数据结构课程设计计算机科学与技术2008级1班课程设计题目:图书借阅管理系统 姓名:学号:一.需求分析说明图书借阅处理过程简述处理过程主要包含:新增图书上架、办理图证、图书查询......