数据结构课程设计矩阵的运算文档格式.docx
《数据结构课程设计矩阵的运算文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计矩阵的运算文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
转置后的新矩阵。
输入两行两列数据,在第二行第一列中有个数据为12,其余都为0,则输出的结果为第一行第二列数据为12,其余为0。
算法2:
矩阵的加法运算
输入:
i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:
矩阵加完后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第二列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为20,第一行第二列数据为30,其余为0。
算法3:
矩阵的减法运算
矩阵相减后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第一列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为-10,其余为0。
算法4:
矩阵的乘法运算
输入两行两列的矩阵,第一个矩阵里面第一行第一列有个数据2第二列有个数据3,其余为0,在第二个矩阵里面第一行第一列有个数据2第二列中有个数据3,其余为0,则输出的结果为一个两行两列的矩阵,其中第一行第一列数据为4,第二列为6,第一行第二列数据为30,其余为0。
算法五:
矩阵的逆运算
矩阵进行逆运算完后的另一个新矩阵。
输入三行三列的矩阵,第一个矩阵里面第一行第一列有个数据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<
stdio.h>
#definemax100
#definemaxsize100
typedeffloatelemtype;
typedefstruct
{floatb[max][max];
inti;
//矩阵的行数
intj;
//矩阵的列数
}tsmatrix;
typedefstruct{
inti,j;
//该非零元的行下标和列下标
elemtypee;
}triple;
{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)copt[col]=copt[col-1]+num[col-1];
for(p=1;
p<
++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"
);
**************************************\n"
for(a1=1;
a1<
a1++)
{for(b1=1;
b1<
=s1.mu;
b1++)
{printf("
%10.3f"
l2.b[a1][b1]);
printf("
\t"
}
************************************"
voidjiafa(tsmatrixl4,tsmatrixl5)//矩阵的加法
{tsmatrixl6;
for(intt=0;
t<
l4.i;
t++)
{for(intt1=0;
t1<
l4.j;
t1++)
l6.b[t][t1]=l4.b[t][t1]+l5.b[t][t1];
矩阵加完后的结果:
printf("
******************************\n"
for(intt2=0;
t2<
t2++)
{for(intt3=0;
t3<
t3++)
l6.b[t2][t3]);
voidjianfa(tsmatrixl4,tsmatrixl5)//矩阵的减法
l6.b[t][t1]=l4.b[t][t1]-l5.b[t][t1];
矩阵相减后的结果:
voidchengfa(tsmatrixl4,tsmatrixl5)//矩阵的乘法
{tsmatrixl6;
for(intt=0;
t<
for(intt1=0;
l5.j;
{l6.b[t][t1]=0;
for(intk=0;
k<
k++)
l6.b[t][t1]+=l4.b[t][k]*l5.b[k][t1];
矩阵乘完后的结果:
voidniyunsuan(tsmatrixs)//矩阵的逆运算
{tsmatrixs1;
floatt,x;
intk,i,j;
for(i=0;
i<
s.i;
i++)
for(j=0;
j<
(2*s.i);
j++)
{if(j<
s.i)s1.b[i][j]=s.b[i][j];
elseif(j==s.i+i)s1.b[i][j]=1.0;
elses1.b[i][j]=0.0;
}
for(i=0;
{for(k=0;
{if(k!
=i)
{t=s1.b[k][i]/s1.b[i][i];
{x=s1.b[i][j]*t;
s1.b[k][j]=s1.b[k][j]-x;
}}
{t=s1.b[i][i];
for(j=0;
s1.b[i][j]=s1.b[i][j]/t;
floaty=1.0;
i++)y=y*s1.b[i][i];
if(y==0.0)
对不起,您输入的矩阵没有逆矩阵"
else
{for(i=0;
s.b[i][j]=s1.b[i][j+s.i];
矩阵逆运算后的结果:
{for(j=0;
s.b[i][j]);
}}}
voidmain()
{tsmatrixl,l1,l3;
sqlists;
intm,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;
do{printf("
请输入你要进行的操作:
矩阵转置运算请按1\n矩阵的加法运算请按2\n矩阵的乘法运算请按3\n矩阵的减法运算请按4\n矩阵的逆运算请按5\n结束请按0:
scanf("
%d"
&
m1);
if(m1==1)
{printf("
您选择进行的操作是矩阵的转置运算\n\n"
请输入你要转置矩阵的行数、列数和非零元的个数\n"
t1);
scanf("
t2);
t3);
s.mu=t1;
s.nu=t2;
s.tu=t3;
请输入你要转置矩阵非零元的行下标、列下标(从[1][1]开始由左至右由上到下)及其数据(按行逐个输入)\n"
for(t4=1;
t4<
=s.tu;
t4++)
{scanf("
t5);
t6);
s.data[t4].i=t5;
s.data[t4].j=t6;
%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)
{
您选择进行的操作是矩阵的加法运算\n\n"
请输入矩阵的行数和列数:
n);
m);
l.i=n;
l.j=m;
l3.i=n;
l3.j=m;
请输入第一个%d行%d列的矩阵\n"
l.i,l.j);
{for(t=0;
l.i;
for(n1=0;
n1<
l.j;
n1++)
l.b[t][n1]);
请输入第二个%d行%d列的矩阵\n"
l3.i,l3.j);
for(n4=0;
n4<
l3.i;
n4++)
{for(n5=0;
n5<
l3.j;
n5++)
l3.b[n4][n5]);
jiafa(l,l3);
if(m1==3)
{
您选择进行的操作是矩阵的乘法运算\n(只有当第一个矩阵的列数等于第二个矩阵的行数方可进行计算)\n\n"
请输入第一个矩阵的行数和列数:
请输入第二个矩阵的行数和列数:
n1);
l3.i=n1;
l3.j=m1;
chengfa(l,l3);
if(m1==4)
您选择进行的操作是矩阵的减法运算\n\n"
jianfa(l,l3);
if(m1==5)
您选择进行的操作是矩阵的逆运算\n\n"
请输入矩阵的维数(即行和列相等的矩阵):
l.j=n;
请输入%d行%d列的矩阵\n"
niyunsuan(l);
}}while(m1!
=0);
2、运行结果(如下图):
(1)、执行的首界面:
(2)、矩阵的转置运算:
(3)、矩阵的加法运算:
(4)、矩阵的减法运算:
(5)、矩阵的乘法
(6)、矩阵的逆运算:
(7)、矩阵可以循环运算:
六、指导老师评语及成绩