n维矩阵的乘法AB-1_(13页).doc
-n维矩阵的乘法AB-1_-第 13 页数据结构课程设计题目_n维矩阵的乘法AB-1_ 学号_ 姓名_ 专业_ 指导老师_第一章:课程设计的目的1第二章:课程设计的内容和要求1课程设计的内容1运行环境2第三章:课程设计分析2矩阵的存储2矩阵的输入与输出2矩阵的乘法运算2矩阵的求逆运算2第四章:课程设计的算法描述3矩阵的存储3矩阵的输出3矩阵的乘法3矩阵的求逆运算3第五章:源代码4第六章:结束语4第一章:课程设计的目的本学期我们对数据结构这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求实习者掌握数据结构中的各方面知识,还要求实习者具备一定的C语言基础和编程能力。具体说来,这次课程设计主要有两大方面目的。一是让实习者通过实习掌握数据结构中的知识。对于矩阵乘法这一课题来说,所要求掌握的数据结构知识主要是数组的相关概念和数组用来存储矩阵的相关便利性。二是通过实习巩固并提高实习者的C语言知识,并初步了解Visual C+的知识,提高其编程能力与专业水平。第二章:课程设计的内容和要求课程设计的内容设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab1结果。要求要求1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。运行环境该程序的运行环境为Windows xp系统,Microsoft Visual C+6.0版本。第三章:课程设计分析矩阵的存储矩阵的结构类似于c语言中的二维数组,所以可以用二维数组来存储矩阵,这样的结构很简便而且也最符合要求。矩阵的输入与输出选择二维数组作为矩阵的存储结构那么可以采用二维数组的输入与输出的方式来对矩阵进行输入输出操作。利用两个for循环语句可以实现将矩阵中的元素存入到二维数组中,但是要注意的是矩阵的行和列的下标都是从1开始的但是二维数组的行和列的下标都是从0开始所以在编写程序的时候要注意这些差别。矩阵的乘法运算矩阵的乘法运算时线性代数里的知识,两个n阶的矩阵相乘,设有三个矩阵A,B,C,矩阵A乘矩阵B等于矩阵,那么矩阵C中的第i行第j列的元素等于矩阵A的第i行元素和矩阵B的第j列对应的元素的乘积的和。矩阵的求逆运算定义一个矩阵的求逆的运算的函数,函数名为inverse,函数的参数为数组B,利用线性代数中的初等变换的知识求矩阵的逆第四章:课程设计的算法描述矩阵的存储printf("输入矩阵a:"); for(i=0;i<N;i+) for(j=0;j<N;j+) scanf("%f",&aij); /*输入矩阵A*/ printf("请再输入矩阵b:"); for(i=0;i<N;i+) for(j=0;j<N;j+) scanf("%f",&bij); /*输入矩阵B*/矩阵的输出printf("请输出矩阵A和B的乘积矩阵C:n"); for(i=0;i<N;i+) for(j=0;j<N;j+) printf("%ft",cij); printf("n");矩阵的乘法定义一个全局变量sum初值为0.0; for(i=0;i<N;i+)for(j=0;j<N;j+) for(k=0;k<N;k+) sum+=aik*bkj; cij=sum;sum=0; /*矩阵的乘法的函数的内容*/ 矩阵的求逆运算定义一个函数,函数名为inverse;之前定义全局变量y=1;矩阵维数N,和整型变量 i,和j,函数的参数为数组B,返回值为数组B的逆矩阵B-1void inverse(float mNN) /*inverse函数是对矩阵的求逆运算的函数*/ int dN2*N; float t,x; int k; printf("B原矩阵为:n"); for (i=0;i<N;i+) for (j=0;j<N;j+) printf("%3.2ft",mij); printf("n"); /*将原数组输出*/ for(i=0;i<N;i+) for(j=0;j<(2*N);j+) if (j<N) dij=mij; else if (j=N+i) dij=1.0; else dij=0.0; /*将数组b中的元素转存到变量数组d中,其中d中的另一半元素对应一个单位矩阵*/ for(i=0;i<N;i+) for(k=0;k<N;k+) if(k!=i) t=dki/dii; for(j=0;j<(2*N);j+) x=dij*t; dkj=dkj-x; /*矩阵的初等变换*/ for(i=0;i<N;i+) t=dii; for(j=0;j<(2*N);j+) dij=dij/t; for(i=0;i<N;i+) y=y*dii; if(y=0) printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。n"); else for(i=0;i<N;i+) for(j=0;j<N;j+) mij=dij+N; printf("B逆矩阵为:n"); for (i=0;i<N;i+) for (j=0;j<N;j+) printf("%3.2ft",mij); printf("n"); 第五章:源代码#include<stdio.h>#define N 3int i,j,k;float y=1.0;float aNN,bNN,cNN;/*定义全局变量的三个数组*/ /*矩阵的乘法的函数的内容*/void inverse(float mNN);int main() printf("输入矩阵a:"); for(i=0;i<N;i+) for(j=0;j<N;j+) scanf("%f",&aij); /*输入矩阵A*/ printf("请再输入矩阵b:"); for(i=0;i<N;i+) for(j=0;j<N;j+) scanf("%f",&bij); /*输入矩阵B*/ inverse(b);/*调用inverse函数对矩阵b进行求逆运算*/ for(i=0;i<N;i+) for(j=0;j<N;j+) for(k=0;k<N;k+) cij+=aik*bkj; printf("请输出矩阵A和B的乘积矩阵C:n"); for(i=0;i<N;i+) for(j=0;j<N;j+) printf("%3.2ft",cij); printf("n"); /*主函数结束*/void inverse(float mNN) /*inverse函数是对矩阵的求逆运算的函数*/ float dN2*N; float t,x; int k; printf("B原矩阵为:n"); for (i=0;i<N;i+) for (j=0;j<N;j+) printf("%3.2ft",mij); printf("n"); /*将原数组输出*/ for(i=0;i<N;i+) for(j=0;j<(2*N);j+) if (j<N) dij=mij; else if (j=N+i) dij=1.0; else dij=0.0; /*将数组b中的元素转存到变量数组d中,其中d中的另一半元素对应一个单位矩阵*/ for(i=0;i<N;i+) for(k=0;k<N;k+) if(k!=i) t=dki/dii; for(j=0;j<(2*N);j+) x=dij*t; dkj=dkj-x; /*矩阵的初等变换*/ for(i=0;i<N;i+) t=dii; for(j=0;j<(2*N);j+) dij=dij/t; for(i=0;i<N;i+) y=y*dii; if(y=0) printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。n"); else for(i=0;i<N;i+) for(j=0;j<N;j+) mij=dij+N; printf("B逆矩阵为:n"); for (i=0;i<N;i+) for (j=0;j<N;j+) printf("%3.2ft",mij); printf("n"); 第六章:结束语转眼,为期两周的数据结构课程设计实习即将结束了。在这次实习中,自己的C语言知识和数据结构知识得到了巩固,编程能力也有了一定的提高。同时也学会了解决问题的方法。总结起来,自己主要有以下几点体会:1.必须牢固掌握基础知识。由于C语言是大一所学知识,有所遗忘,且未掌握好这学期所学的数据结构这门课,所以在实习之初感到棘手。不知如何下手,但在后来的实习过程中自己通过看书和课外资料,并请教其他同学,慢慢地对C语言和数据结构知识有所熟悉。这时才逐渐有了思路。所以,这次实习之后,我告诫自己:今后一定要牢固掌握好专业基础知识。2.必须培养严谨的科学态度。自己在编程时经常因为一些类似于“少了分号”的小错误而导致错误,不够认真细致,这给自己带来了许多麻烦。编程是一件十分严谨的事情,容不得马虎。所以在今后自己一定要培养严谨的科学态度。我想这不仅是对于程序设计,做任何事都应如此。3.这次课程设计也让我充分认识到数据结构这门课的重要性。它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。同时它也有广泛的实际应用。总之,在这次实习中,自己的C语言以及数据结构知识得到提高,编程能力也得到了提高。参考资料:线性代数第四版 中国人民大学出版社c语言程序设计中国水利水电出版社 数据结构c语言版清华大学出版社visual c+实用教程第四版 电子工业出版社