《数据结构》课程设计题目____n维矩阵的乘法AB-1______学号_________________姓名______________________专业_____________________指导老师___________________第一章:课程设计的目的 (3)第二章:课程设计的内容和要求 (3)课程设计的内容 (3)运行环境 (3)第三章:课程设计分析 (4)矩阵的存储 (4)矩阵的输入与输出 (4)矩阵的乘法运算 (4)矩阵的求逆运算 (4)第四章:课程设计的算法描述 (4)矩阵的存储 (4)矩阵的输出 (5)矩阵的乘法 (5)矩阵的求逆运算 (5)第五章:源代码 (7)第六章:结束语 (11)第一章:课程设计的目的本学期我们对《数据结构》这门课程进行了学习。
这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。
这次课程设计不但要求实习者掌握《数据结构》中的各方面知识,还要求实习者具备一定的C语言基础和编程能力。
具体说来,这次课程设计主要有两大方面目的。
一是让实习者通过实习掌握《数据结构》中的知识。
对于矩阵乘法这一课题来说,所要求掌握的数据结构知识主要是数组的相关概念和数组用来存储矩阵的相关便利性。
二是通过实习巩固并提高实习者的C语言知识,并初步了解Visual C++的知识,提高其编程能力与专业水平。
第二章:课程设计的内容和要求课程设计的内容设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab-1结果。
要求要求1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
运行环境该程序的运行环境为Windows xp系统,Microsoft Visual C++6.0版本。
第三章:课程设计分析矩阵的存储矩阵的结构类似于c语言中的二维数组,所以可以用二维数组来存储矩阵,这样的结构很简便而且也最符合要求。
矩阵的输入与输出选择二维数组作为矩阵的存储结构那么可以采用二维数组的输入与输出的方式来对矩阵进行输入输出操作。
利用两个for循环语句可以实现将矩阵中的元素存入到二维数组中,但是要注意的是矩阵的行和列的下标都是从1开始的但是二维数组的行和列的下标都是从0开始所以在编写程序的时候要注意这些差别。
矩阵的乘法运算矩阵的乘法运算时线性代数里的知识,两个n阶的矩阵相乘,设有三个矩阵A,B,C,矩阵A乘矩阵B等于矩阵C,那么矩阵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",&a[i][j]);}/*输入矩阵A*/printf("请再输入矩阵b:");for(i=0;i<N;i++){for(j=0;j<N;j++)scanf("%f",&b[i][j]);}/*输入矩阵B*/ 矩阵的输出printf("请输出矩阵A和B的乘积矩阵C:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%f\t",c[i][j]);printf("\n");}矩阵的乘法定义一个全局变量sum初值为0.0;for(i=0;i<N;i++)for(j=0;j<N;j++){for(k=0;k<N;k++)sum+=a[i][k]*b[k][j];c[i][j]=sum;sum=0;}/*矩阵的乘法的函数的内容*/矩阵的求逆运算定义一个函数,函数名为inverse;之前定义全局变量y=1;矩阵维数N,和整型变量i,和j,函数的参数为数组B,返回值为数组B的逆矩阵B-1void inverse(float m[N][N])/*inverse函数是对矩阵的求逆运算的函数*/{int d[N][2*N];float t,x;int k;printf("B原矩阵为:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%3.2f\t",m[i][j]);printf("\n");}/*将原数组输出*/for(i=0;i<N;i++)for(j=0;j<(2*N);j++){if (j<N)d[i][j]=m[i][j];else if (j==N+i)d[i][j]=1.0;elsed[i][j]=0.0;}/*将数组b中的元素转存到变量数组d中,其中d中的另一半元素对应一个单位矩阵*/for(i=0;i<N;i++){for(k=0;k<N;k++){if(k!=i){t=d[k][i]/d[i][i];for(j=0;j<(2*N);j++){x=d[i][j]*t;d[k][j]=d[k][j]-x;}}}} /*矩阵的初等变换*/for(i=0;i<N;i++){t=d[i][i];for(j=0;j<(2*N);j++)d[i][j]=d[i][j]/t;}for(i=0;i<N;i++)y=y*d[i][i];if(y==0)printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。
\n"); else{for(i=0;i<N;i++)for(j=0;j<N;j++)m[i][j]=d[i][j+N];printf("B逆矩阵为:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%3.2f\t",m[i][j]);printf("\n");}}}第五章:源代码#include<stdio.h>#define N 3int i,j,k;float y=1.0;float a[N][N],b[N][N],c[N][N];/*定义全局变量的三个数组*//*矩阵的乘法的函数的内容*/void inverse(float m[N][N]);int main(){printf("输入矩阵a:");for(i=0;i<N;i++){for(j=0;j<N;j++)scanf("%f",&a[i][j]);}/*输入矩阵A*/printf("请再输入矩阵b:");for(i=0;i<N;i++){for(j=0;j<N;j++)scanf("%f",&b[i][j]);}/*输入矩阵B*/ inverse(b);/*调用inverse函数对矩阵b进行求逆运算*/for(i=0;i<N;i++)for(j=0;j<N;j++){for(k=0;k<N;k++)c[i][j]+=a[i][k]*b[k][j];}printf("请输出矩阵A和B的乘积矩阵C:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%3.2f\t",c[i][j]);printf("\n");}}/*主函数结束*/void inverse(float m[N][N])/*inverse函数是对矩阵的求逆运算的函数*/{float d[N][2*N];float t,x;int k;printf("B原矩阵为:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%3.2f\t",m[i][j]);printf("\n");}/*将原数组输出*/for(i=0;i<N;i++)for(j=0;j<(2*N);j++){if (j<N)d[i][j]=m[i][j];else if (j==N+i)d[i][j]=1.0;elsed[i][j]=0.0;}/*将数组b中的元素转存到变量数组d中,其中d中的另一半元素对应一个单位矩阵*/for(i=0;i<N;i++){for(k=0;k<N;k++){if(k!=i){t=d[k][i]/d[i][i];for(j=0;j<(2*N);j++){x=d[i][j]*t;d[k][j]=d[k][j]-x;}}}} /*矩阵的初等变换*/for(i=0;i<N;i++){t=d[i][i];for(j=0;j<(2*N);j++)d[i][j]=d[i][j]/t;}for(i=0;i<N;i++)y=y*d[i][i];if(y==0)printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。
\n"); else{for(i=0;i<N;i++)for(j=0;j<N;j++)m[i][j]=d[i][j+N];printf("B逆矩阵为:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%3.2f\t",m[i][j]);printf("\n");}}}第六章:结束语转眼,为期两周的《数据结构》课程设计实习即将结束了。
在这次实习中,自己的C语言知识和数据结构知识得到了巩固,编程能力也有了一定的提高。
同时也学会了解决问题的方法。
总结起来,自己主要有以下几点体会:1.必须牢固掌握基础知识。
由于C语言是大一所学知识,有所遗忘,且未掌握好这学期所学的《数据结构》这门课,所以在实习之初感到棘手。
不知如何下手,但在后来的实习过程中自己通过看书和课外资料,并请教其他同学,慢慢地对C语言和数据结构知识有所熟悉。