数据结构课程设计矩阵的运算.doc

上传人:gfy****yf 文档编号:46377353 上传时间:2021-12-13 格式:DOC 页数:16 大小:238KB
返回 下载 相关 举报
数据结构课程设计矩阵的运算.doc_第1页
第1页 / 共16页
数据结构课程设计矩阵的运算.doc_第2页
第2页 / 共16页
数据结构课程设计矩阵的运算.doc_第3页
第3页 / 共16页
点击查看更多>>
资源描述
数据结构禅设计报告题 目:专 业:班 级:学 号:姓 名:指导老师: 时 间:_、课程设计题目及所涉及知识点设计题目是“矩阵的运算”,所涉及的知识点主要是:1、数据结构中的对于结构体的定义, 用typedef struct来实现,根据所设计的问題 在结构体里面定义数据类型及其变量,用define定义数组的大小,然后利用 typedef来实现对于变童的未知类型确定正确的类型。2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三 元组顺序表)来存储,有的用二维数组来储存.3、转迅的过程中利用的是快速转置的方法,附设了 num和cpot两个辅助变童.4、矩阵的加法、减法、乘法、逆运算的基本算法方式.5、通过调用每个函数,来实现每个算法的功能.二课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转凰的方法实现,必须用三元组顺序表来 储存数据,所以在第一个结构体中存在int类型的行数(mu)列数(nu)以及 非家元素的个数(tu);然后第二个结构体中分别有非零元素的行下标(i )、列 下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数 组结构体类型。2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有 矩阵的行数、列数和一个二维数纽(用门oat来定义类型).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在对其进行更改,最后完成了此项的工作.2、就是对于矩阵的乘法运算和逆运算,掌握的不够熟练,先是通过书籍对于矩阵的乘 法和逆运算得到更深的了解,然后通过一步步写程序最后实现了矩阵的乘法运算和逆运算.四、总结通过此次课程设计,让我对于编程有了更深的认识,老师的精心指导让我学会到了很 多,不仅仅是代码,最主要的让我的思维开阖了很多,在这个过程中,通过不断的尝试,不 断的修改,最终克服了困难,完成了自己的任务,心里有种无比的喜悦,但同时又感觉到了 自己的知识面的狭隘,还有好多知识的海洋还没有畅游,等待自己将是一回更大的考脸.对于现在的自己,对学习程序还是有很大的兴趣,它让我体验到了很多的快乐,我要 进步跟进现在的课程,努力去发展自己,按照老师说的最主要的是具有了编程的思想,则具 有了编程的能力,我想我可以成功完成自己的目标。五、附录一主要源程序代码及运行结果1、主要源程序代码:# include # define max 100# define maxsize 100typedef float elemtype;typedef struct float bmax 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 (sql ist si, tsmatrix 412) /矩阵的转置 sql ist s2; int col, t9, p, q, al, bl; int num100, copt 100;s2. mu=sl mu; s2 nu=sl nu; s2 tu=sl tu;if(s2. tu0) for (col=l; col=sl nu;+col) num col =0;for (t9=l; t9=sl. tu; +t9)+numsl. data t9. j; /求si中每一列含非零元个数copt 1=1; /求第col列中第一个非零元在s2. data中序号for (col=2; col=sl nu; +col) copt col=coptcol-l+numcol-l;for (p=l; pnn);for (al=l; al=sl. nu; al+) for (b 1=1; bl=sl. mu; bl+)printf C%10. 3f 12.bal bl);printf (tR);printf (Rn);)printf(Rprintf (n);void jiafa (tsmatrix 14, tsmatrix 15) /矩阵的加法(tsmatrix 16;for (int t=0; t14. i; t+) for (int 11=0; tl14. j; tl+)16.bt tl=14.bt tl+15.bt tl;printf (矩阵加完后的结果:nw);printf(*拿拿拿拿拿拿拿拿拿拿拿*n);for (int t2=0; t214. i; t2+) for (int t3=0; t314. j; t3+)printf (%10. 3f16.bt2 t3);printf(tR);)printf (n);printf ,void jianfa (tsmatrix 14, tsmatrix 15) /矩阵的减法tsmatrix 16;for (int t=0; t14i;t+) for (int tl=0; tl14. j; tl+)16.bt tl=14.bt tl-15.bt tl; printf C矩阵相减后的结果:nH);printffor (int t2=0; t214. i; t2+) for (int t3=0; t314. j; t3+)printf (n%10. 3f 16.bt2 t3);printf(t);printf (nR);printf(Rnn); ,void chengfa (tsmatrix 14, tsmatrix 15) /矩阵的乘法 tsmatrix 16;for (int t=0; t14. i; t+)4for (int 11=0; tl15. j; 11+) 16. bt tl=0;for (int k=0; k14. j; k+)16. bt tl+=14. bt k*15. bk tl; printf (*矩阵乘完后的结果:nn);pr intffor (int t2=0; t214. i; t2+) for (int t3=0; t315. j; t3+) printf C%10. 3f16.bt2 t3);printf (RtR);)printf (n);printf , void niyunsuan( tsmatrix s)矩阵的逆运算 tsmatrix si;float t, x; int k, i, j;for (i=0; is. i; i+)for(j=0; j(2*s. i); j+) if (js. i) si. bi j=s. bi j; else if (j=s. i+i) si. bi j=L 0; else si. bi j=0. 0;for (i=0; is. i; i+) for (k=0; ks. i; k+)if (k! = i) t=sl. bk i/sl. b(i i; for(j=0; j(2*s. i); j+) x=sl. b订jt;si. bk j=sl. bk (j-x;)for (i=0; is. i; i+) t=sl. bi订;for (j=0; j(2*s. i); j+)si. bi j=sl. bi (j/t;float y=l 0;for (i=0; is. i; i+) y=y*sl. b订订; if (y=0 0)printf(对不起,您榆入的矩阵没有逆矩阵”); else for (i=0; is. i; i+) for(j=0; js. i; j+)s. bi j=sl. bi j+s. i;printf C矩阵逆运算后的结果:nM);for (i=0; is. 1; i+) for (j=0; j#nw);printf(R矩阵转置运算请按ln矩阵的加法运算詔按2n矩阵的乘法运算请按3n 矩阵的减法运算请按4n矩阵的逆运算请按5n结束请按0: nn);printf (R*nn);scanf (n%dH, &ml);if (ml=l)printf 0您选择进行的操作是矩阵的转置运算nnn);printf(请输入你要转置矩阵的行数、列数和非家元的个数nn);scanf C%d-,&tl);scanf (%d&t2);scanf C%d&t3);s. mu=tl; s. nu=t2; s. tu=t3;printf C请输入你要转置矩阵非零元的行下标、列下标(从【1【1开始由左至右由上 到下)及其数据(按行逐个输入)十);for (t4=l; t4=s. tu; t4+)scanf (w%d&t5);scanf (%dn,&t6);s. data t4 i=t5; s. data t4 j=t6;scanf&s.datat4.e);for (t7-l; t7=s. nu; t7+) for (t8=l; t8=s. mu; t8+)ll.bt7 t8=0. 0;zhuanzhi (s, 11);if (ml =2)Iprintf (*您选择进行的操作是矩阵的加法运算nnn);printf (*请输入矩阵的行数和列数:nn);scanf&n);scanf (%dn, &m);1. i=n;1.13. i=n;13.仙;printfprintf (n请输入第一个%d#%d列的矩阵n 1. i, 1. j); for (t=0; tl. i; t+)for (nl=0; nll. j; nl+)scanf &1. bt nl);)printf(*拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿*n);pr intf(hnn);printf (请输入第二个%d #%d 列的矩阵n13. i, 13. j);for (n4=0; n4l 3. i;n4+) for (n5=0; n513. j; n5+)scanfbn4 n5);printf(Rnn);jiafa (1, 13);if (ml=3)Iprintf (R您选择进行的操作是矩阵的乘法运算n (只有当第一个矩阵的列数等于第二个 矩阵的行数方可进行计算)nnM);printf C请输入第一个矩阵的行数和列数:nn);scanf &n);scanf (n%d &m);I. i=n;1 j=m;printf(*拿拿拿拿拿拿*n);printf (-请输入第一个%d行%d列的矩阵nw, 1. i, 1. j); for (t=0; tl. i; t+)for (nl=0; nll. j; nl+)scanf (%f,&L bt nl);)printf(用拿拿拿拿拿拿拿拿*n);printfnn);printf (请输入第二个矩阵的行数和列数:n);scanf (%d, &nl);scanf (%(!, &ml);13. i=nl;13. j=ml;printf(用拿拿*n);printf (请输入第二个%d行%宀列的矩阵n 13. i,13. j);for (n4=0; n413. i; n4+) for (n5=0; n513. j; n5+) scanf (r%f, &13. bn4 n5);printfnw);chengfa (I, 13);if (ml=4)printf J您选择进行的操作是矩阵的减法运算nnw);printf (冃请输入矩阵的行数和列数:nn);scanf C%cT, &n);scanf (R%dn,&m);1. i=n;1. j=m;13. i=n;13. j=m;pr intf(用拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿*n); printfC请输入第一个%d行%d列的矩阵十,1. i, 1. j); for (t=0; tl. i; t+)for (nl=0; nlI. j; nl+)scanf (n%f&L bt nl);pr intf(Rnn);pr intf(RnM)Jprintf (请输入第二个%d行%(1列的矩阵n13. i,13. j);for (n4=0; n413. i;n4+) for(1)5=0; n513. j; n5+)scanf &13. bn4 n5);)pr intf(nnn); jianfa (1, 13);if (ml=5)printf C您选择进行的操作是矩阵的逆运算nnn); printf 0请输入矩阵的维数(即行和列相等的矩阵):nn); scanf (%d, &n);1. i=n;1. j=n;printfnn)j printf (n请输入%d e%d列的矩阵岸,1. i, L j); for (t=0; tI. i; t+)for (nl=0; nl T 4XJ行进I篦运运賈 要“运法法法运0: 你“1加乘减逆按 入3转的的的的请 覚束餐选择进行的操作是矩阵的加法运算 请输入矩阵的行数和列数:2 2请输入第一个2行2列的矩阵-怜祷*青输入第二个2行2列的矩阵矩阵加完后的结果:(4) .矩阵的减法运算:0 G:JtiMicrosoft Visual StudioCommonMSDev98BinDebugsfd.exefl 2 3 4He 1H5 卄 的*按请请请按卄 行卄请宴B詈卄 进卄尊运运运算卄 要卄运法法法运0:卄 你卄W紮减專卄 A卄转的的的的请卄 G:J?S?8?3Microsoft Visual StudioComfnonMSDev98BinDebugsfd.exe*请输入你要进行的握作:2 3 4 115 按请请请按 B运运运诵和 运法法法运0:KK InM-K- 番的的的请“束-M-M -n 二n = n = n = n-bFTM-f 8 2 3 4 操 3 lts5 的*安请请 行咲适11S.掛 进MM昇运运运茸 要“运法法法运0: 你I直加乘按 入W转的的的的谴 输“&束六、指导老师评语及成绩
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!