数据结构课程设计矩阵的运算.docx
《数据结构课程设计矩阵的运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计矩阵的运算.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计矩阵的运算
数据结构
课程设计报告
题目:
专业:
班级:
学号:
姓名:
指导老师:
时间:
、课程设计题目及所涉及知识点
设计题目是“矩阵的运算”,所涉及的知识点主要是:
1、数据结构中的对于结构体的定义,用typedefstruct来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define定义数组的大小,然后利用typedef来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num和cpot两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述
设计思路:
1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储
存数据,所以在第一个结构体中存在int类型的行数(mu)列数(nu)以及非零元素的个数(tu);然后第二个结构体中分别有非零元素的行下标(i)、列下标
(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float来定义类型)。
3、在main函数里面,来实现对于数据的输入操作,利用if语句进行选择来执行操
作,利用dowhile语句来实现功能的循环操作。
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
#definemax100
#definemaxsize100typedeffloatelemtype;
typedefstruct
{floatb[max][max];
inti;//矩阵的行数
intj;//矩阵的列数
}tsmatrix;
typedefstruct{
inti,j;//该非零元的行下标和列下标
elemtypee;
}triple;
typedefstruct
{tripledata[maxsize+1];//非零元三元组,data[0]未用
intmu,nu,tu;//矩阵的行数、列数和非零元个数}sqlist;
voidzhuanzhi(sqlists1,tsmatrix&l2)//矩阵的转置
{sqlists2;intcol,t9,p,q,a1,b1;intnum[100],copt[100];s2.mu=s1.mu;s2.nu=s1.nu;s2.tu=s1.tu;
if(s2.tu>0)
{for(col=1;col<=s1.nu;++col)num[col]=0;
for(t9=1;t9<=s1.tu;++t9)
++num[s1.data[t9].j];//求s1中每一列含非零元个数
copt[1]=1;//求第col列中第一个非零元在s2.data中序号for(col=2;col<=s1.nu;++col)copt[col]=copt[col-1]+num[col-1];
for(p=1;p<=s1.tu;++p)
{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");
for(a1=1;a1<=s1.nu;a1++)
{for(b1=1;b1<=s1.mu;b1++){printf("%10.3f",l2.b[a1][b1]);
printf("\t");}
printf("\n");
printf("************************************");
printf("\n");
}
}
voidjiafa(tsmatrixl4,tsmatrixl5)//矩阵的加法
{tsmatrixl6;
for(intt=0;t\n");
printf("
f****************************
**\n");
for(intt2=0;t2{printf("%10.3f",l6.b[t2][t3]);
printf("\t");}
printf("\n");}for(intt2=0;t2{printf("%10.3f",l6.b[t2][t3]);
printf("\t");}
printf("\n");}
矩阵的乘法
voidchengfa(tsmatrixl4,tsmatrixl5)//
{tsmatrixl6;
for(intt=0;tfor(intt1=0;t1{l6.b[t][t1]=0;
for(intk=0;kl6.b[t][t1]+=l4.b[t][k]*l5.b[k][t1];}printf("矩阵乘完后的结果:
\n");
printf("******************************\n");
for(intt2=0;t2{for(intt3=0;t3{printf("%10.3f",l6.b[t2][t3]);
printf("\t");}
printf("\n");}printf("******************************\n");
}
{tsmatrixs1;
floatt,x;intk,i,j;
for(i=0;ifor(j=0;j<(2*s.i);j++)
{if(jelseif(j==s.i+i)s1.b[i][j]=1.0;
elses1.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<(2*s.i);j++)
{x=s1.b[i][j]*t;
s1.b[k][j]=s1.b[k][j]-x;
}
}
}}
for(i=0;i{t=s1.b[i][i];
for(j=0;j<(2*s.i);j++)
s1.b[i][j]=s1.b[i][j]/t;}
floaty=1.0;
for(i=0;iif(y==0.0)
printf("对不起,您输入的矩阵没有逆矩阵");
else{for(i=0;ifor(j=0;js.b[i][j]=s1.b[i][j+s.i];
printf("矩阵逆运算后的结果:
\n");
for(i=0;i{for(j=0;j}}}
voidmain()
{tsmatrixl,l1,l3;sqlists;
intm,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;
do{printf("请输入你要进行的操作:
\n");
printf("******************************\n");
3\n
printf("矩阵转置运算请按1\n矩阵的加法运算请按2\n矩阵的乘法运算请按
矩阵的减法运算请按4\n矩阵的逆运算请按5\n结束请按0:
\n");
printf("******************************\n");
scanf("%d",&m1);
if(m1==1)
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.tu;t4++)
{scanf("%d",&t5);
scanf("%d",&t6);
s.data[t4].i=t5;s.data[t4].j=t6;
scanf("%f",&s.data[t4].e);}
for(t7=1;t7<=s.nu;t7++)
{for(t8=1;t8<=s.mu;t8++)
l1.b[t7][t8]=0.0;
}
zhuanzhi(s,l1);
}
if(m1==2)
{
printf("您选择进行的操作是矩阵的加法运算\n\n");
scanf("%d",&n);
scanf("%d",&m);
l.i=n;
l.j=m;
l3.i=n;
l3.j=m;
printf("******************************\n");
printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j);
{for(t=0;tfor(n1=0;n1}
printf("******************************\n");
printf("******************************\n");
printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);
for(n4=0;n4{for(n5=0;n5scanf("%f",&l3.b[n4][n5]);}
jiafa(l,l3);
}
if(m1==3)
{
阵的行数方可进行计算)\n\n");
printf("请输入第一个矩阵的行数和列数:
\n");scanf("%d",&n);
scanf("%d",&m);
l.i=n;
l.j=m;
printf("
f****************************
**\n");
printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j);
{for(t=0;tfor(n1=0;n1scanf("%f",&l.b[t][n1]);
printf("******************************\n");
printf("******************************\n");
printf("请输入第二个矩阵的行数和列数:
\n");
scanf("%d",&n1);
scanf("%d",&m1);
l3.i=n1;
l3.j=m1;
printf("******************************\n");
printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);
for(n4=0;n4{for(n5=0;n5scanf("%f",&l3.b[n4][n5]);}
chengfa(l,l3);
}
if(m1==4)
{
printf("您选择进行的操作是矩阵的减法运算\n\n");
printf("请输入矩阵的行数和列数:
\n");
scanf("%d",&n);scanf("%d",&m);l.i=n;
l.j=m;
l3.i=n;
l3.j=m;
printf("******************************\n");
printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j);
{for(t=0;tfor(n1=0;n1scanf("%f",&l.b[t][n1]);
printf("******************************\n");
printf("******************************\n");
printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);
for(n4=0;n4{for(n5=0;n5scanf("%f",&l3.b[n4][n5]);}
printf("******************************\n");
jianfa(l,l3);
if(m1==5)
{
printf("您选择进行的操作是矩阵的逆运算\n\n");
printf("请输入矩阵的维数(即行和列相等的矩阵):
\n");scanf("%d",&n);
l.i=n;
l.j=n;
printf("******************************\n");
printf("请输入%d行%d列的矩阵\n",l.i,l.j);
{for(t=0;tfor(n1=0;n1scanf("%f",&l.b[t][n1]);
}
printf("******************************\n");
niyunsuan(l);
}}while(m1!
=0);
2、
运行结果(如下图):
(1)、执行的首界面:
〔7回丨厉I
‘■JSJfaJHIfaJial■iaihJ,hi2,Ldh■也
•W參竞结闵\炖匚noEoEVisjal$tudio\Commor\M^Dev^8\Bin\Cebug\5fd.eier
歿直运算请按1柄加法运鼻请:
[髒養蹩堡屮址运第请抉
(2)、矩阵的转置运算:
■G'啟拒结甘."vlicroEc/ft7suaIStudio'CcmmonVM5Dev^B\Bin\tebug-sfd.e>e'
口
1卄
1234栗卄丄按按擾-W浚士早冃土冃安L丁E主養昱霍进*算运运运“畀要"运袪注迭运0:
尔卄置加乘诚逆按丿卄書的的的请
層选择进行的操忙是矩阵的转置运覧[青输入你要转置柜阵的行数、列数和非零元的个数请BA你蠻荐置矩阳E零元的彳rr标、列下标t从⑴⑴开始庄左至右由上到f戍其数据t按个磕X?
1232
转置后的数据是:
幕KKKICK3CX梵耳插MNWNMT梵比寰注共基寰廉8(
0,0000.000
32.0000.000
艮进讦的操作;
■*ttuidic\Cdmrron\MDe-/^£\Gin\Debugd.exe"
请输入第一个钉代列的矩阵
2
您送择诜行的輾作是矩阵的加法运算请输入矩陆的行数和列数:
请输入笫二个2行北列的矩阵
13
(4)、矩阵的减法运算:
F
青土<戶怖mh圭冃JuJ_lrtJIJJ—TP-运运运算法袪満倉阳-T*r~r-T*rrj*F~r!
.T一产阡I-炸弔
请输人矩眩的行数和列熱
请艳入第一个刘亍2列的矩库
12
12
阵相减后的结果;
-1.000
-1.000
请输入第二个羽冠列的楚阵
13
!
=□
'3:
1数気结吃\|VicrosoftVisual^tudio\Canrmor;MiDbv9&'.BinVCebug\wtd.exe'
0*
MMM
M
w234卄按请请请按卄请*MX请卄算运运运*卄运法S法运B:
z辭的的的请
HHEEELUJE士匸”
二234
-1615一一按请请请按
=请
„„算运运运算一运法法袪运B:
„„奮的的的请卄„_^^^束卄
X
二
„
二
疆薯餐粵歩阵的;亍数方可进行计算〉
青输入第一个矩阵的行数和列救:
请输入第一个彭刃列的矩阵
123
£34
MKHKNKMKMKMMXKM-MMMXMMHMMMHMM~KMT
肾備*t■・!
廉釜・從科■科■・・K■■■MMiift甘禅ft
请输入第二个矩陈的右数和列姝
(6)、矩阵的逆运算:
SS
teffi-■
I-f、IF^-_n请亶一舁运运Lg畀
运」法法法一疋0;置talsfe
临的的请
5冃至冃宀夏
您选择邀亍的操作是矩阵的世运算
请输入矩阵的维数唧行和列相等的矩阻:
肯输尔劳讲fT的唤
l.WO
-1.560-3.960
1.WU
-2-060
2.see
-i.wu
请输人怖3列比矩萍
12d
221
143
'G'裁笔塔陀\McrosoftVisual&tudic\Corrmon\M£De\,Q£^lEin'^Debuq1'exc"
丄書F按请请语按
M运运左B的的的诘
阵隆区算E的給里:
U虏r柠青土IL青按41^1'_1-1JJJ诰异專异诗M运运运算
B秤書需的的的诘
六、指导老师评语及成绩