数据结构课程设计 特殊矩阵运算
数据结构课程设计-特殊矩阵计算器
特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言内建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<>#include<>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵 //void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);[i][j]=[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);[i][j]=[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);[i][j]=[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n);[0]=0;for(i=1;i<=n;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);[i][j]=[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;[0]=0;[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);[i][j]=[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j]+[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C) {int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j][i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C){int i,j,k;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=0;for(i=0;i<;i++) //A的行数for(j=0;j<;j++) //A的列数和B的行数for(k=0;k<;k++) //B的列数[i][j]+=[i][k]*[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)[i][j]= [i][j];else if(j==n+i)[i][j]=;else[i][j]=;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p= [i][k]/ [i][i];for(j=0;j<(n *2);j++){q= [i][j]*p;[i][j]= [i][j]-q;}}}}for(i=0;i<n ;i++){p=[i][i];for(j=0;j<n*2;j++)[i][j]=[i][j]/p;float y=;for(i=0;i<n;i++)y=y*[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)[i][j]=[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;=;=;for(i=0;i<;i++)for(j=0;j<;j++)[j][i]=[i][j];}//矩阵行列式的值void Determinant(Matrix A) { int count[100];int sum=0;int n;n=; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= [k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= [k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = [k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= [k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<;i++){for(j=0;j<;j++)printf(" %d ",[i][j]);printf("\n");}}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);}{CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}{CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。
矩阵的加法运算问题-数据结构与算法课程设计报告
合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第二学期课程数据结构与算法课程设计名称矩阵的加法运算问题学生姓名胡九铭学号0804012039专业班级计算机科学与技术08级(2)班指导教师王昆仑张贯虹2010 年6 月一、问题分析和任务定义1、问题分析此程序需要完成如下要求:设计十字链表表示稀疏矩阵,并实现矩阵的加法运算。
并且要求能够要检查有关运算的条件,并对错误的条件产生报警。
2、(1)设计函数建立稀疏矩阵。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,(4)构造函数进行两个稀疏矩阵相加时是否能够符合运算要求,即检查有关运算的条件,并对错误的条件产生错误警报。
(5)登录函数,即需要口令才可以登录并使用计算器(6)退出系统3、原始数据的输入和输出格式由于该问题是关于矩阵的运算方面的内容,所以输入时是对矩阵中的非零元分别进行插入矩阵中,输入格式是:行、列、元素值,以数字的形式输入。
输出时,为了能更易于用户的观察和比较所以选用矩阵表的格式输出,这可以更加方便看出结果的正确与否,也有利于在编写程序的时候修改和改善程序的源代码。
4、算法应能实现的功能该算法应能实现:正确的用十字链表的存储结构建立数个稀疏矩阵;正确的输出用户建立的矩阵;能进行数个矩阵的相加运算;能对加法运算的运算条件进行判断并能对其产生报警提示。
5、该问题测试用例(a)两个行列分别相同的矩阵0 0 0 9 0 05 0 0 + 5 2 00 0 9 0 0 0预测结果:9 0 0= 10 2 00 0 9(b)两个行列数不相同的矩阵3 0 0 0 0 0 00 0 6 06 0 0 + 0 0 0 02 0 0 00 0 0 0 0 0 0预测结果:输出:不能进行加法运算,矩阵的行数和列数应分别相同!!!(c)两个以上的矩阵相加0 0 0 0 0 1 0 0 0 00 6 0 0 0 0 -3 0 0 05 0 3 0 0 + 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 5 02 0 0 0 01 0 0 0 00 0 0 0 00 5 0 0 0预测结果:1 0 0 5 02 3 0 0 0= 6 0 3 0 00 0 0 0 00 5 0 0 0二、数据结构的选择和概要设计1、主界面设计:为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。
数据结构课程设计报告---矩阵的运算
数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目是“矩阵的运算”;所涉及的知识点主要是:1、利用数组的形式来储存数据,在main函数里面,实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句与do……while语句来实现功能的循环操作。
2、矩阵的加法、减法、乘法、数乘、转置的基本算法方式。
3、通过switch语句进行选择来执行操作,来实现每个算法的功能。
二、课程设计思路及算法描述设计思路:用程序实现矩阵能够完成矩阵的转置运算;矩阵的数乘运算;矩阵的加法运算;矩阵的减法运算;矩阵的乘法运算;这几种矩阵的简单的运算。
用数组把将要运算的矩阵储存起来,然后实现矩阵的这几种运算。
在main函数里面,来实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句来实现功能的循环操作。
算法:算法1:矩阵的转置运算;首先是把将要运算的矩阵存放在数组中,矩阵的转置运算,就是把你将要进行运算的A矩阵的行ar和列ac,把A矩阵的行ar作为B矩阵的bc,A矩阵的列ac作为B矩阵的br,这样得到的新矩阵B的行br和列bc就是矩阵A的转置。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[j][i]=A[i][j];算法2:矩阵的数乘运算;首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k 去A矩阵。
实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵B,这样就解决了矩阵的数乘运算。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[i][j]=k*A[i][j];算法3:矩阵的加法运算;首先是把将要运算的矩阵存放在数组中,矩阵的加法运算,就是要实现A矩阵与B 矩阵进行加法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行加法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B矩阵的br行的和;A矩阵的每一列ac与B矩阵的每一列bc进行加法运算,而得到的一个新的矩阵C的每一列cc 就是A矩阵的ac列与B矩阵的bc列的和。
c课程设计矩阵加减乘
c 课程设计 矩阵加减乘一、课程目标知识目标:1. 理解矩阵加减乘的基本概念和运算法则。
2. 掌握矩阵加减乘的计算步骤,能够准确进行相关运算。
3. 了解矩阵加减乘在实际问题中的应用。
技能目标:1. 能够正确运用矩阵加减乘的法则,解决相关问题。
2. 能够通过矩阵加减乘的计算,提高数学逻辑思维能力和问题解决能力。
3. 能够运用矩阵加减乘的知识,解决一些简单的实际问题。
情感态度价值观目标:1. 培养学生对矩阵加减乘学习的兴趣,激发学生的求知欲。
2. 培养学生团队协作精神,提高学生在小组讨论中的沟通能力。
3. 培养学生严谨、细心的学习态度,养成良好的数学素养。
课程性质:本课程为数学课程,以矩阵加减乘为基础,培养学生的数学运算能力和实际问题解决能力。
学生特点:学生为初中生,具备一定的数学基础,对新鲜事物充满好奇心,但注意力容易分散。
教学要求:结合学生特点,注重启发式教学,引导学生主动参与课堂讨论,提高学生的实际操作能力。
同时,关注学生的情感态度,激发学生的学习兴趣。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面均取得具体的学习成果。
二、教学内容1. 矩阵的基本概念:介绍矩阵的定义、元素、行列数等基本概念,使学生理解矩阵的结构和特点。
- 教材章节:第一章 矩阵与线性方程组,第1节 矩阵的基本概念2. 矩阵的加减法:讲解矩阵加减法的规则,通过实例演示运算过程,让学生掌握矩阵加减法的运算方法。
- 教材章节:第一章 矩阵与线性方程组,第2节 矩阵的运算,1. 矩阵的加减法3. 矩阵的乘法:介绍矩阵乘法的法则,通过实际例题,让学生熟练运用矩阵乘法解决问题。
- 教材章节:第一章 矩阵与线性方程组,第2节 矩阵的运算,2. 矩阵的乘法4. 矩阵的应用:分析矩阵在实际问题中的应用,如线性方程组、图像处理等领域,提高学生的实际问题解决能力。
- 教材章节:第一章 矩阵与线性方程组,第3节 矩阵的应用5. 课堂练习与讨论:针对教学内容,设计不同难度的练习题,让学生在课堂上进行实际操作,加强知识点的巩固。
数据结构矩阵相关操作的课程设计
课程设计题目矩阵乘法教学院计算机学院专业09计算机科学与技术班级姓名指导教师年月日目录1 概述 (3)2 设计目的 (3)3 设计功能说明 (3)4 详细设计说明 (3)5 流程图 (4)6 调试及结果 (5)1程序调试 (5)2运行编译连接过程......................................................... 5-8 7 总结 (9)附录...........................................................................10-24 参考文献 (25)成绩评定表 (26)1 概述数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。
通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。
为学生后继课程的学习打下良好的基础。
2 设计目的《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。
促使学生养成良好的编程习惯。
1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
2.培养学生综合运用所学知识独立完成程序课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
c课程设计矩阵运算
c 课程设计矩阵运算一、教学目标本节课的教学目标是让学生掌握矩阵的基本运算,包括矩阵的加法、减法、数乘以及矩阵的乘法。
通过学习,学生应能理解矩阵运算的定义和规则,并能运用这些运算解决实际问题。
此外,学生还应掌握矩阵运算的数学原理,提高逻辑思维和数学运算能力。
在情感态度价值观方面,学生应培养对数学学科的兴趣,增强自信心,培养团队合作精神。
二、教学内容本节课的教学内容主要包括矩阵的基本运算和数学原理。
首先,介绍矩阵的加法、减法、数乘和矩阵的乘法,通过举例说明这些运算的定义和规则。
然后,讲解矩阵运算的数学原理,包括线性方程组的解法、行列式的计算以及矩阵的逆矩阵。
最后,通过实际案例让学生运用矩阵运算解决实际问题,提高学生的应用能力。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法。
首先,采用讲授法,清晰地讲解矩阵运算的定义和规则,以及数学原理。
其次,采用讨论法,让学生分组讨论矩阵运算的应用案例,培养学生的思考和表达能力。
此外,还采用案例分析法,让学生分析实际问题,运用矩阵运算解决问题。
最后,通过实验法,让学生动手实践,加深对矩阵运算的理解。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源。
首先,教材和相关参考书,为学生提供系统的学习资料。
其次,多媒体资料,如PPT、教学视频等,用于直观地展示矩阵运算的过程和应用案例。
此外,还将提供实验设备,如计算器、电脑等,让学生进行实际操作,提高实践能力。
通过丰富多样的教学资源,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括平时表现、作业、考试等。
平时表现主要评估学生的课堂参与度、提问回答等,通过观察学生的表现来了解他们的学习状态。
作业方面,将布置适量的练习题,要求学生在规定时间内完成,通过批改作业了解学生对矩阵运算的理解和掌握程度。
考试方面,将设置期中考试和期末考试,考试内容涵盖本节课的全部知识点,通过考试来检验学生的学习成果。
数据结构课程设计(矩阵的运算)
数据结构课程设计报告题目:_____________________________________专业:_____________________________________班级:_____________________________________学号:_____________________________________姓名:_____________________________________指导老师:__________________________________时间:_____________________________________、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义,用typedef struct 来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define 定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num 和cpot 两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int 类型的行数(mu )列数(nu )以及非零元素的个数(tu );然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float 来定义类型)。
实验5 特殊矩阵的存储和运算
实验报告五特殊矩阵与广义表的存储与运算班级: 姓名: 学号: 专业:一、实验目的:1、了解多维数组的存储方式与存取特点2、熟悉稀疏矩阵的存储方式3、用三元组法实现稀疏矩阵的相、减、转置算法。
二、实验内容:1、在矩阵类Matrix中,增加下列操作:1)判断一个矩阵就是否为上(下)三角矩阵、对称矩阵。
2)判断两个矩阵就是否相等。
3)计算两个矩阵的乘积。
算法原代码:public class Matrix {private int[][] matrix;private int row;private int column;public Matrix(int[][] matrix){row = matrix、length;column = matrix[0]、length;this、matrix = new int[row][column];for(int i=0;i<matrix、length;i++){for(int j=0;j<matrix[i]、length;j++){this、matrix[i][j] = matrix[i][j];}}}public Matrix(int row, int column){this、row = row;this、column = column;matrix = new int[row][column];}/*** 判断上三角* @param matrix* @return*/public static boolean isUpTri(Matrix matrix){if(matrix、column!=matrix、row){throw new IllegalArgumentException("矩阵的行列不相等"); }for(int i=0;i<matrix、getRow();i++){for(int j=i+1;j<matrix、getColumn();j++){if(0 == matrix、getElement(i, j)){return false;}}}return true;}/*** 判断下三角* @param matrix* @return*/public static boolean isDownTri(Matrix matrix){//先判断行列相不相等if(matrix、column!=matrix、row){throw new IllegalArgumentException("矩阵的行列不相等"); }for(int j=0;j<matrix、getColumn();j++){for(int i=j+1;i<matrix、getColumn();i++){if(matrix、getElement(i,j)==0){return false;}}}return true;}/*** 判断matrix就是不就是对称矩阵* @param matrix* @return*/public static boolean isSymmetry(Matrix matrix){for(int i=0;i<matrix、getRow();i++){for(int j=i+1;j<matrix、getColumn();j++){if(matrix、getElement(i,j) != matrix、getElement(j,i)){return false;}}}return true;}/*** 判断两个矩阵就是否相等* @param matrix1* @param matrix2* @return*/public static boolean equals(Matrix matrix1, Matrix matrix2){ if(matrix1、getRow()!=matrix2、getRow()||matrix1、getColumn()!=matrix2、getColumn()){return false;}for(int i=0;i<matrix1、row;i++){for(int j=0;j<matrix1、column;j++){if(matrix1、getElement(i,j)!=matrix2、getElement(i,j)){return false;}}}return true;}/*** 将两个矩阵相乘* @param TemPMatrix* @return*/public Matrix multiply(Matrix TemPMatrix) {if(column!=TemPMatrix、row){throw new IllegalArgumentException("行列不匹配,两个矩阵无法相乘");}Matrix matrix1 = new Matrix(row,TemPMatrix、column);for(int i=0;i<matrix1、row;i++){for(int j=0;j<matrix1、column;j++){int sum = 0;for(int k=0;k<column;k++){sum += (this、matrix[i][k])*(TemPMatrix、getElement(k,j));}matrix1、setElement(i,j,sum);}}return matrix1;}/*** 两个矩阵相加* @param matrix* @return*/public Matrix plus(Matrix matrix){if(row!=matrix、getRow()&&column!=matrix、getColumn()){ throw new IllegalArgumentException("行列不匹配");}int[][] tempMatrix = new int[row][column];for(int i=0;i<row;i++){for(int j=0;j<column;j++){tempMatrix[i][j] = this、matrix[i][j]+ matrix、getElement(i,j);}}return new Matrix(tempMatrix);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o、getClass()) return false; Matrix matrix1 = (Matrix) o;if (row != matrix1、row) return false;if (column != matrix1、column) return false;return Arrays、deepEquals(matrix, matrix1、matrix);}public void setElement(int row, int column, int element){ matrix[row][column] = element;}public int getElement(int row, int column){return matrix[row][column];}public int getRow() {return row;}public int getColumn() {return column;}@Overridepublic String toString() {String string = new String();for(int i=0;i<row;i++){for(int j=0;j<column;j++){string += matrix[i][j]+" ";}string += "\n";}return string;}}public class Test {public static void main(String[] args) throws Exception {Matrix matrix1 = new Matrix(newint[][]{{1,0,0,0,0},{1,2,0,0,0},{1,2,3,0,0},{1,2,3,4,0},{1,2,3,4,5}} );Matrix matrix2 = new Matrix(newint[][]{{1,2,3,4,5},{0,2,3,4,5},{0,0,3,4,5},{0,0,0,4,5},{0,0,0,0,5}} );Matrix matrix3 = new Matrix(newint[][]{{1,2,3,4,5},{2,1,6,7,8},{3,6,1,9,10},{4,7,9,1,11},{5,8,10,11 ,1}});Matrix matrix4 = new Matrix(newint[][]{{1,0,0,0,0},{1,2,0,0,0},{1,2,3,0,0},{1,2,3,4,0},{1,2,3,4,5}} );System、out、println(matrix1);System、out、println(matrix2);System、out、println("matrix1就是否就是上三角:"+Matrix、isUpTri(matrix1));System、out、println("matrix2就是否就是上三角:"+Matrix、isUpTri(matrix2));System、out、println("matrix1就是否就是下三角:"+Matrix、isDownTri(matrix1));System、out、println("matrix2就是否就是下三角:"+Matrix、isDownTri(matrix2));System、out、println("matrix3就是否就是对称矩阵"+Matrix、isSymmetry(matrix3));System、out、println("matrix2就是否就是对称矩阵"+Matrix、isSymmetry(matrix2));System、out、println("matrix1就是否等于matrix2:"+matrix1、equals(matrix2));System、out、println("matrix1就是否等于matrix4:"+matrix1、equals(matrix4));System、out、println();System、out、println("matrix1*matrix2");System、out、println(matrix1、multiply(matrix2));}}测试结果如下:2、在三元组行的单链表表示的稀疏矩阵类LinkedMatrix中,增加判断矩阵相等、判断对称矩阵、计算矩阵乘积等操作。
C++课程设计_矩阵运算
矩阵运算系统的研究与设计摘要矩阵运算系统是一个数据运算系统,程序主要包括矩阵的基本数据成员,矩阵运算成员函数,以及矩阵系统界面等,实现矩阵的运算和文件读入和输出操作等。
本系统用C++语言开发,包含了矩阵的最基本数据成员,其中有矩阵的维数和矩阵的个元素。
类中实现了判断矩阵维数相等,是否可以相乘,是否为空矩阵等判断功能函数。
以及矩阵加法、减法、乘法、转置、求矩阵行列式、矩阵余子式等运算功能。
除了基本的矩阵运算功能以外,还包含了对于文件的读写,实现了更方便的读入和输出的功能。
本系统可以先用来实现对于矩阵的各种运算,可实现在控制台和文件中的读入与输出,且可以在用户指定的位置就行输入输出操作。
实现了系统更方便的使用。
另外使用了system应用,更改了控制台背景颜色,使得系统更加美观。
关键词:矩阵运算,运算符重载,文件操作,修改控制台背景颜色。
目录1.题目内容及要求 (3)1.2功能要求: (3)1.2其他要求: (3)2.设计思路 (4)2.1文件的分配: (4)2.3类的实现: (4)2.4矩阵运算功能实现: (5)2.5扩展功能实现: (6)2.6主函数编写: (6)3.具体实现 (9)3.1程序开头包含所需要使用到的头文件: (9)3.2类的定义: (9)3.3menu_use函数 (10)3.4menu_i()函数 (10)3.5menu_0()函数 (10)3.6main函数 (10)4运行调试与分析讨论 (11)5.设计体会与小结 (13)5.1遇到的问题: (13)5.2自身所提高和学习到的能力: (13)6.参考文献 (14)1.题目内容及要求1.1基本要求:编写矩阵类--封装矩阵的运算(加、减、乘、转置、...);每个运算用一个方法实现1.2功能要求:1.用C++面向对象的思想编写矩阵类。
2.编写矩阵类实现矩阵的运算。
1.2其他要求:1. 源程序应当加注释。
以便于阅读。
2. 采用文本菜单界面。
数据结构程序设计-矩阵的运算
二.概要设计:
1、抽象数据类型定义如下: ADT SparseMatrix{ 数据对象D:D={aij|i=1,2,3…,m;j=1,2,3…,n; ai ∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系R: R={Row,Col} Row={<ai,j,ai,j+1>|1≤i≤m, 1≤j≤n-1} Col={<ai,ai+1,j>|1≤i≤m-1, 1≤j≤n} 基本操作 本程序中,用三元组顺序表作为存储结构。 (1)、CreatSMatrix (TSMatrix &M) 操作结果:创建矩阵M。 (2)、AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (3)、SubMatrix (TSMatrix *a,TSMatrix *b) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (4)、MultiplicationMatrixPow (TSMatrix *a,TSMatrix *b,TSMatrix *c) 初始条件:矩阵A和B的行数和列数匹配 操作结果:求矩阵A、B的和C=A*B。 (5) OutputSMatrix(TSMatrix M) 初始条件:矩阵M已存在 操作结果:输出矩阵M 2、 本程序包含5个模块
for(i=1;i<=M->mu;i++)//输出矩阵 { for(j=1;j<=M->nu;j++) printf("%5d",a[i][j]); printf("\n"); } } //*************矩阵的求和运算*****************// int AddSMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//求 采用三元组顺序表存储表示的稀疏矩阵M和N的和,结果赋给矩阵Q { int i,j,p,q,x=0,y=0; if((M->mu<=0)||(M->nu<=0)||(M->tu<=0)||(N->mu<=0)||(N>nu<=0)||(N->tu<=0))//判断行数列数非零元素个数是否符合匹配 return ERROR; if(M->mu!=N->mu||M->nu!=N->nu)//判断A与B的行列数 是否相等的 return ERROR; Q->mu=M->mu;//矩阵Q的初始化 Q->nu=M->nu; Q->tu=0; for(i=1;i<=Q->mu;i++) { for(j=1;j<=Q->nu;j++)//寻找矩阵M,N中非零元素相等 的行列 { for(p=1;p<=M->tu;p++)//求矩阵M行列中所对应的 非零元素的值 赋值给X { if((i==M->data[p].row)&&(j==M->data[p].col))// 如果i是矩阵M中非零元素行,j是其列 { x=M->data[p].e;
数据结构课程设计 特殊矩阵运算
特殊矩阵运算1.1程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-73786976294838206000到73786976294838206000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能 1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
C++课程设计报告--矩阵乘法计算
C++课程设计报告一、题目名称:矩阵乘法计算二、难易等级:A级三、对题目的分析和注释:分析:依次建立两个矩阵空间并按照矩阵乘法规则进行运算。
(矩阵的乘法规则:1、矩阵的乘法运算必须符合m*n的矩阵与n*s的矩阵相乘。
2、第一个矩阵的第i行的元素依次乘以第二个矩阵的第j列元素后结果相加组成生成矩阵第i行第j列元素。
)注释:(1)设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。
(2)修改程序结构,使程序可以反复执行,直至按键选择退出为止。
(3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[m][n]来放置数据,其中m,n为用户可输入的任意整数。
(4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化时赋值,也可以通过键盘赋值,还可以通过读取数据文件输入。
(5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序时,分别定义两个整型矩阵和两个浮点型矩阵进行乘法验证。
(6)完成矩阵的乘法运算,在运算之前判断这两个矩阵能否满足乘法运算的条件,若不满足,则给出提示信息。
四、所增加功能模块的设计如果要说增加功能的话,自己编的程序里面不多,我只是按照题目要求,设计了一个矩阵类,同时用模板的形式改写矩阵数据类型和运算符的重载。
1、模板的使用我使用了大量的模板,以T为模板参数,通过对T的不同类型的选择实现相应的运算处理。
其中choose1()函数本是无参函数,为了方便模板化,给其赋以伪参数T,在执行时通过T的取值生成相应的函数模板。
template<class T>void choose1(T){}调用时:switch(sjlx){case 1:{choose1(1);}break;case 2:{choose1(0.0);}break;case 3:{choose1(1e-10);}break;default:cout<<"输入选择错误!!!"<<endl;}2、矩阵类的构造按照课本要求采用二级指针动态开辟内存空间,节省内存使用;其中数据结构如下:Mat-->Mat[0] ----->Mat[0][0] Mat[0][1] ……Mat[0][j]Mat[1] ----->Mat[1][0] Mat[1][1] ……Mat[1][j]::Mat[i] ----->Mat[i][0] Mat[i][1] ……Mat[i][j]实现构造的代码为:template<class T>CMatrix<T>::CMatrix(int row,int col){int i,j;nRow=row,nCol=col;Mat=new T*[nRow];for(i=0;i<nRow;i++){Mat[i]=new T[nCol];}cout<<"请输入数据:\n";for(i=0;i<nRow;i++)for(j=0;j<nCol;j++){cout<<"第["<<i+1<<"]["<<j+1<<"]个数据:";cin>>Mat[i][j];}}3、运算符的重载要实现矩阵间的乘法运算,有必要对其运算符进行重载。
数据结构课程设计报告n维矩阵乘法
数据结构课程设计报告设计题目:n维矩阵乘法:A B-1专业计算机科学与技术班级计051本学生林垂敏学号29指导教师潘崇起止时间2007-2008 学年第I学期一、具体任务功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab-1结果。
分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,可完成2维矩阵的情况;3.进一步要求:通过键盘输入维数n。
有兴趣的同学可以自己扩充系统功能。
要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、软件环境Microsoft Visual C++ 6.0三、问题的需求分析程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。
矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。
当要对矩阵作进一步操作(A*B或A*B^(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。
当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A| != 0 判断矩阵是否可逆,若矩阵的行列式|A| = = 0 则提示该矩阵为不可逆的;若|A| !=0 则求其逆矩阵,并在终端显示其逆矩阵。
四、算法设计思想及流程图1.抽象数据类型ADT MatrixMulti{数据对象:D = {a(I,j)|i = 1,2,3,…,n;j = 1,2,…,n;a(i,j)∈ElemSet,n为矩阵维数}数据关系: R = {Row,Col}Row = {<a(i,j),a(i,j+1)>| 1 <= i <= n , 1 <= j <= n-1}Col = {<a(i,j),a(i+1,j)>| 1 <= i <= n-1 , 1 <= j <= n} 基本操作:Swap(&a,&b);初始条件:记录a,b已存在。
矩阵运算c语言课程设计
矩阵运算c语言课程设计一、课程目标知识目标:1. 学生能够理解矩阵的基本概念,掌握矩阵的存储方式和基本运算原理。
2. 学生能够掌握C语言中二维数组的使用,并将其应用于矩阵的表示和运算。
3. 学生能够运用所学知识,实现矩阵的加、减、乘、转置等基本运算。
技能目标:1. 学生能够运用C语言编写程序,实现矩阵的各种运算,提高编程能力。
2. 学生能够通过分析问题,设计合理的算法,解决矩阵相关的问题。
3. 学生能够利用调试工具检查并修正程序中的错误,提高解决问题的能力。
情感态度价值观目标:1. 学生在学习过程中,培养对编程的兴趣和热情,形成积极的学习态度。
2. 学生通过团队协作和交流,培养合作精神和沟通能力,提高团队意识。
3. 学生在学习过程中,感受计算机科学的魅力,树立科学精神,增强对科技创新的认识。
课程性质:本课程为计算机科学与技术领域的专业课程,旨在让学生掌握矩阵运算的C语言实现,提高编程能力。
学生特点:学生已具备C语言基础,具有一定的编程能力和问题解决能力。
教学要求:通过本课程的学习,学生应能独立完成矩阵运算的编程任务,具备解决实际问题的能力。
教师应注重理论与实践相结合,引导学生主动参与,培养其创新思维和团队合作能力。
在教学过程中,关注学生的个体差异,因材施教,确保每位学生都能达到课程目标。
二、教学内容1. 矩阵基础知识:矩阵的定义、存储方式、基本运算(加、减、乘、转置)。
- 教材章节:第二章 矩阵及其运算2. C语言二维数组:二维数组的声明、初始化、访问,以及与矩阵的关联。
- 教材章节:第一章 C语言基础回顾3. 矩阵运算的C语言实现:- 矩阵加法:编写程序实现矩阵的加法运算- 矩阵减法:编写程序实现矩阵的减法运算- 矩阵乘法:编写程序实现矩阵的乘法运算- 矩阵转置:编写程序实现矩阵的转置运算- 教材章节:第三章 矩阵运算的C语言实现4. 矩阵运算程序调试与优化:- 算法优化:分析算法性能,提高程序运行效率- 调试技巧:运用调试工具,查找并修正程序错误- 教材章节:第四章 程序调试与优化教学内容安排与进度:1. 矩阵基础知识(2课时)2. C语言二维数组(2课时)3. 矩阵运算的C语言实现(4课时)- 矩阵加法(1课时)- 矩阵减法(1课时)- 矩阵乘法(2课时)- 矩阵转置(1课时)4. 矩阵运算程序调试与优化(2课时)三、教学方法1. 讲授法:教师通过讲解矩阵的基本概念、运算原理以及C语言二维数组的使用方法,为学生奠定坚实的理论基础。
数据结构课程设计-特殊矩阵计算器
数据结构课程设计-特殊矩阵计算器-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<>#include<>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵 //void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);[i][j]=[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);[i][j]=[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);[i][j]=[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n);[0]=0;for(i=1;i<=n;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);[i][j]=[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;[0]=0;[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);[i][j]=[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j]+[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j][i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C){int i,j,k;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=0;for(i=0;i<;i++) //A的行数for(j=0;j<;j++) //A的列数和B的行数for(k=0;k<;k++) //B的列数[i][j]+=[i][k]*[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)[i][j]= [i][j];else if(j==n+i)[i][j]=;else[i][j]=;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p= [i][k]/ [i][i];for(j=0;j<(n *2);j++){q= [i][j]*p;[i][j]= [i][j]-q;}}}}for(i=0;i<n ;i++){p=[i][i];for(j=0;j<n*2;j++)[i][j]=[i][j]/p;float y=;for(i=0;i<n;i++)y=y*[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)[i][j]=[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;=;=;for(i=0;i<;i++)for(j=0;j<;j++)[j][i]=[i][j];}//矩阵行列式的值void Determinant(Matrix A) {int count[100];int sum=0;int n;n=; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= [k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= [k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = [k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= [k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<;i++){for(j=0;j<;j++)printf(" %d ",[i][j]);printf("\n");}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);if(x==3){CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}if(x==2){CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。
课程设计--设计一个矩阵运算器
课程设计--设计一个矩阵运算器《数据结构C语言版》课程设计一、题目内容的描述设计一个矩阵运算器【问题描述】设计一个矩阵运算器,对矩阵进行乘方(^)、加(+)、减(-)、乘(*)、转置等运算;【基本要求】(1) 参见数据结构题集P136页4.1(2) 求含有乘方(^)、加(+)、减(-)、乘(*)运算;。
(3) 写出课程设计报告【测试数据】分别选定一组测试数据进行测试,验证程序的正确性。
二、应用程序功能的详细说明1(输入矩阵运算器:说明该程序只适用于矩阵运算;2. 提供功能选择的界面:以菜单的形式提供功能选择,可以对所要进行的功能进行选择,最后系统自动实行此操作。
3. 矩阵的加法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的加法函数,系统自动输出新的相加后的矩阵。
4. 矩阵的减法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的减法函数,系统自动输出新的相减后的矩阵。
5.矩阵的乘法:先创建两个矩阵,要求第一个矩阵的列和第二个矩阵的行相等。
调用矩阵的乘法函数,系统自动输出新的相乘后的矩阵。
6. 矩阵的转置:先创建矩阵,输入矩阵的行和列数,调用矩阵的转置函数,系统自动输出新的转置后的矩阵。
7. 方阵的乘方:先创建一个方阵,输入方阵的阶乘,调用方阵的乘方函数,然后系统自动输出新的方阵。
三、输入数据类型、格式和内容{const int Max=100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];} Const int Max=100;定义矩阵的最大存储空间为100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];在函数中定义五个矩阵。
四、主要函数申明void createjuzheng(int d[Max][Max],int m,int n)创建矩阵函数;void shuchujuzheng(int z[Max][Max],int m,int n)输出矩阵函数;void juzhengchengfang(int m,int n,int p)矩阵乘方函数;void juzhengjiafa(int m,int n) 矩阵加法函数;void juzhengjianfa(int m ,int n) 矩阵减法函数;void juzhengchengfa(int m,int n) 矩阵乘法函数;void juzhengzhuanzhi(int m,int n) 矩阵转置函数;switch(o)创建矩阵运算菜单。
c语言矩阵运算课程设计
c语言矩阵运算课程设计一、课程目标知识目标:1. 学生能够掌握矩阵的基本概念,了解其在C语言中的应用。
2. 学生能够运用C语言实现矩阵的创建、初始化、输入输出等基本操作。
3. 学生能够理解并掌握矩阵的加、减、乘、转置等运算的C语言实现方法。
4. 学生能够运用C语言解决实际问题中的矩阵运算。
技能目标:1. 学生能够独立编写C语言程序完成矩阵的基本操作。
2. 学生能够运用调试工具对矩阵运算程序进行调试,找出并修正错误。
3. 学生能够分析实际问题,设计并实现相应的矩阵运算算法。
情感态度价值观目标:1. 学生通过学习矩阵运算,培养对程序设计的兴趣和热情,提高信息素养。
2. 学生在编程过程中,养成严谨、细致、合作的学习态度,增强团队协作能力。
3. 学生能够认识到矩阵运算在实际问题中的应用价值,激发进一步学习的动力。
课程性质:本课程为C语言程序设计课程的一部分,侧重于矩阵运算在实际问题中的应用。
学生特点:学生已具备一定的C语言基础,了解基本的数据类型、语法和编程技巧。
教学要求:结合学生特点和课程性质,将课程目标分解为具体的学习成果,注重实践操作,强调算法设计和程序调试。
在教学过程中,关注学生的个体差异,提供有针对性的指导。
二、教学内容1. 矩阵基础知识:- 矩阵的定义及性质- 矩阵的表示方法- 特殊矩阵(单位矩阵、对角矩阵等)2. C语言矩阵操作:- 矩阵的动态内存分配- 矩阵的输入输出- 矩阵的创建与初始化3. 矩阵运算:- 矩阵的加、减、乘运算- 矩阵的转置- 矩阵的行列式、逆矩阵计算4. 矩阵运算程序设计:- 矩阵运算算法分析- 编写相应的C语言程序- 程序调试与优化5. 实践案例:- 矩阵运算在实际问题中的应用- 结合教材案例,进行编程实践- 分析并改进教材案例中的算法教学大纲安排:第一周:矩阵基础知识学习,介绍矩阵的定义、性质及表示方法。
第二周:C语言矩阵操作,学习动态内存分配、矩阵输入输出、创建与初始化。
数据结构3.2.2 特殊矩阵
《数据结构》 精品课程
第5页
3、对称矩阵的压缩存储
nn方阵M是对称矩阵,当且仅当对i , j (1 i , j n), 均有M(i , j) M( j , i) .
因为对称矩阵中M(i, j)与M(j, i)的信息相同,所以只需
存储其上三角部分或下三角部分的元素信息。参照下
《数据结构》 精品课程
第1页
1、对角矩阵的压缩存储
若nn方阵M是对角矩阵,则对所有的 ij(0<i<n, 0<j<n)都有M(i , j)=0,即非对角线上 的元素均为0 .
对一个 nn 维对角矩阵,至多只有 n 个非 零元素,因此只需存储其 n 个对角元素的信息。
采用一维数组d[n]来压缩存储对角矩阵, 其中 d[i]存储M[i , i]的值。
如何在三元组结点的基础上实现对整个稀疏 矩阵的存储?
用顺序存储方式实现的三元组表
链接存储方式实现的十字链表。
《数据结构》 精品课程
第9页
?考虑一个n??n维下三角矩阵其第一行至多有1个个非零元素第二行至多有2个非零元素?第第n行行至多有n个非零元素非零元素至多共有1??2???n??nn??12个个
二、特殊矩阵
前面所介绍的矩阵类,是以按行优先次序将所 有矩阵元素存放在一个一维数组中。但是对于 特殊矩阵,如对称矩阵、三角矩阵、对角矩阵 和稀疏矩阵等, 如果用矩阵类Matrix来实现, 那么大量的存储空间中存放的是重复信息或者 是零元素,这将造成很大的空间浪费。为节省 存储空间,提高算法运行效率,通常会采用压 缩存储的方法。
映射次序可采用按行或按列优先。假设采取按行优 先,则非零元素M(i, j)会映射到一维数组d中的哪 个元素?
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特殊矩阵运算1.1程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-73786976294838206000到73786976294838206000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能 1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
2 概要设计2.1用二维数组实现的程序的概要设计由于使用二维数组结构实现上述功能较为简单,故全部运算仅由主函数执行,不单写出各个简单的函数。
通过switch()实现对各个功能的选择。
具体如下:Switch(1):进入矩阵转置功能;Switch(2):进入矩阵数乘功能;Switch(3):进入矩阵加法功能;Switch(4):进入矩阵减法功能;Switch(5):进入矩阵乘法功能;Switch(6):结束本程序;各功能中的矩阵都是以二维数组的形式进行存储与运算的,使用完整的存储方式使矩阵运算在设计上更为便捷,而且面对更多不同运算时也不存在因结构限制而导致的功能缺失。
相应的,因为存储了完整矩阵,且运算时都是完整矩阵的每个元素都参与,所以运行相对较慢。
2.2用图结构实现的程序的概要设计本模块要求设计函数建立稀疏矩阵并初始化,使用三元组结构。
在创建稀疏矩阵时,需要设计三元组创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值。
在对稀疏矩阵进行初始化时,只输入非零元素的值和它所在的所在行及所在列。
在对稀疏矩阵输出时,以矩阵的完整形式输出。
本程序存储矩阵的形式是非零元与矩阵形状结合,更适应稀疏矩阵的性质,在存储空间和运算速度上都有较大优势,但在设计各个功能时较为复杂,控制矩阵在运算时的行列变换需要进行复杂的判断和双层for循环来赋零值或进行非零值的运算。
整体结构由主函数调用各个功能函数,条理清晰,具体如下:流程从运算器的图形界面输出开始,之后进行功能选择,此部分流程同上。
当选择功能1.矩阵加法时先调用矩阵创建函数Creat()输入矩阵A,调用输出矩阵函数Print_SMatrix(),再重复以上流程输入矩阵B,此时进行判断两矩阵能否相加,再调用矩阵加法函数AddSMatrix(A,B,C,n)进行矩阵加法运算输出结果矩阵C,结束后调用三次Destory_SMatrix()函数销毁矩阵A、B、C,最后返回流程开始处进行下一项任务。
功能2矩阵减法流程同功能1矩阵加法。
功能3矩阵转置只需输入矩阵A即可进行下一步调用矩阵转置函数TransposeSMatrix(),再输出转置后的矩阵B,销毁矩阵A、B后返回流程开始处进行下一项任务。
功能4用来结束程序,在选择功能4后调用break函数跳出switch结束程序。
3详细设计3.1二维数组结构的程序的详细设计算法1:矩阵的转置运算:首先是把将要运算的矩阵存放在数组中,矩阵的转置运算,就是把你将要进行运算的A矩阵的行ar和列ac,把A矩阵的行ar作为B矩阵的bc,A矩阵的列ac作为B矩阵的br,这样得到的新矩阵B的行br和列bc就是矩阵A的转置。
算法如下:for(i=0;i<ar;i++){for(j=0;j<ac;j++){B[j][i]=A[i][j];}}算法2:矩阵的数乘运算首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k去A矩阵。
实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵B,这样就解决了矩阵的数乘运算。
算法如下:for(i=0;i<ar;i++){for(j=0;j<ac;j++){B[i][j]=k*A[i][j];}}算法3:矩阵的加法运算;首先是把将要运算的矩阵存放在数组中,矩阵的加法运算,就是要实现A 矩阵与B矩阵进行加法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行加法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B 矩阵的br行的和;A矩阵的每一列ac与B矩阵的每一列bc进行加法运算,而得到的一个新的矩阵C的每一列cc就是A矩阵的ac列与B矩阵的bc列的和。
这样就实现了A矩阵与B矩阵的加法运算。
算法如下:ar=br;ac=bc;for(i=0;i<ar;i++){for(j=0;j<ac;j++){C[i][j]=A[i][j]+B[i][j];}}算法4:矩阵的减法运算;首先是把将要运算的矩阵存放在数组中,矩阵的减法运算,就是要实现A矩阵与B矩阵进行减法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行减法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B矩阵的br行的差;A矩阵的每一列ac与B矩阵的每一列bc进行减法运算,而得到的一个新的矩阵C的每一列cc就是A矩阵的ac列与B矩阵的bc列的差。
这样就实现了A矩阵与B矩阵的减法运算。
算法如下:ar=br;ac=bc;for(i=0;i<ar;i++){for(j=0;j<ac;j++){C[i][j]=A[i][j]-B[i][j];}}算法5:矩阵的乘法运算;首先是把将要运算的矩阵存放在数组中,矩阵的乘法运算,就是要实现A 矩阵与B矩阵进行乘法运算。
只有当进行运算的A矩阵的列ac等于B矩阵的行br时,两个矩阵才能进行运算,而得到的结果C矩阵要等于A矩阵的行ar和B矩阵的列bc。
这样就实现了两个矩阵的乘法运算。
算法如下:cr=ar;cc=bc;for(i=0;i<ar;i++){for(j=0;j<bc;j++){for(k=0;k<ac;k++){C[i][j]+=A[i][k]*B[k][j];}}}3.2图结构的程序的详细设计3.2.1主界面的设计:定义两个矩阵:矩阵A= 1 2 3 矩阵B= 9 8 74 5 6 6 5 47 8 9 3 2 1定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A和数组B相加减后的结果。
3.2.2矩阵存储的实现方式:稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组A、B,采用压缩存储的方式来对上面的两个矩阵进行存储。
具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v),例如struct Triple。
将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表rpos[x]。
即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。
例如,上面的矩阵a,利用数组A存储后内容为: A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1 。
同理,用数组B存储矩阵b的值。
3.2.3稀疏矩阵的加减法实现:主要算法结构分析:1)int CreateMatrix(int A[m][n],int B[50])这是一个将稀疏矩阵转存的函数,类似于顺序存储三元组表。
在这个方法中,只要用一个二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标及其值存入到一维数组B中对应的元素。
在定义函数的过程中,我们需要定义一个for循环,以完成行和列的转换及存储。
在函数的末尾我们定义一个B[K]=-1,用于结束非零元素的存储。
2)int MatrixAdd(int A[max],int B[max],int C[max])这个函数用于实现数组A和数组B的相加,并将其相加的结果存入数组C。
这个函数讨论了数组在相加的过程中的几种情况: a、A数组和B数组的行相等且列相等,两者直接相加后存入数组C中。
3)int SubSMatrix(int A[max],int B[max],int C[max])这个函数用于实现数组A和数组B的相减,并将其相减的结果存入数组C。
这个函数讨论了数组在相减的过程中的几种情况: a、A数组和B数组的行相等且列相等,两者直接相减后存入数组C中。
4)int TransposeSMatrix(TSMatrix *a,TSMatrix *b)此函数用于实现矩阵的转置,由于转置的本质是矩阵中每个元素的行、列下标互换,因此在做矩阵转置时矩阵B与矩阵A的行、列数和非零元个数都是相等的,只需把A矩阵中的元素在存入B矩阵的过程中将表示每个元素位置的行列数,即i、j互换存入即可得到转置矩阵B。
3.2.3模块结构图建立主调函数建立三元组表建立矩阵函数矩阵相加减矩阵转置输出稀疏矩阵的基本操作3.2.4流程图4.程序调试4.1二维数组程序的调试二维数组结构的矩阵运算程序比较好做,因此除了题目要求的加减法和转置外我还做了数乘和乘法功能,最终实现了更为完善的矩阵运算程序在做这个程序的过程中在算法方面并没有遇到难以解决的的问题,所使用的算法都是基础的数组操作和三层以下的循环。
花费功夫最多的是格式和界面的设计,这些设计也应用到了下一个以图结构为基础的矩阵运算器程序中。