数据结构课程设计-特殊矩阵计算器_第1页
数据结构课程设计-特殊矩阵计算器_第2页
数据结构课程设计-特殊矩阵计算器_第3页
数据结构课程设计-特殊矩阵计算器_第4页
数据结构课程设计-特殊矩阵计算器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上特殊矩阵计算器1、特殊矩阵计算器 问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的 转置、A(或 B)的行列式等,具体要求如下: A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。 A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵, 要求输入的数据也不尽相同)。 各运算若可行,则打印结果;若不可行,则给出提示信息。 各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。 涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。#includ

2、e<stdio.h>#include<math.h>#define max 100typedef structint row,col;/定义矩阵行数、列数 int amaxmax; Matrix; /存储结构typedef structint arraymax;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;

3、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("请输入上三角矩阵的行数和列数(行数

4、与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row; a.n=n; printf("请输入%d个数:",n*(n+1)/2);a.array0=0;for(i=1;i<=n*(n+1)/2;i+)scanf("%d",&a.arrayi);for(i=0;i<n;i+)for(j=0;j<n;j+)t=CompressMatrix(1,i,j,n);A.aij=a.arrayt;/下三角矩阵 void CreateMatrixLowertri(

5、M &a,Matrix &A)int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row; a.n=n; printf("请输入%d个数:",n*(n+1)/2);a.array0=0;for(i=1;i<=n*(n+1)/2;i+)scanf("%d",&a.arrayi);for(i=0;i<n;i+)for(j=0;j<n;j+)t=Compres

6、sMatrix(2,i,j,n);A.aij=a.arrayt; /对称矩阵 void CreateMatrixSymmetry(M &a,Matrix &A)int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row; a.n=n; printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i+)scanf("%d",&a.a

7、rrayi);for(i=0;i<n;i+)for(j=0;j<n;j+)t=CompressMatrix(3,i,j,n);A.aij=a.arrayt; /对角矩阵 void CreateMatrixDiagonal(M &a,Matrix &A)int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row; a.n=n; printf("请输入%d个数:",n);a.array0=0;

8、for(i=1;i<=n;i+)scanf("%d",&a.arrayi);for(i=0;i<n;i+)for(j=0;j<n;j+)t=CompressMatrix(4,i,j,n);A.aij=a.arrayt; /单位矩阵 void CreateMatrixUnit(M &a,Matrix &A)int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row; a.n=n

9、; a.array0=0;a.array1=1; for(i=0;i<n;i+)for(j=0;j<n;j+)t=CompressMatrix(5,i,j,n);A.aij=a.arrayt; /*矩阵运算*/矩阵加法 int Add(Matrix A,Matrix B,Matrix &C) int i,j;if(A.row!=B.row)return 0;elseC.row=A.row;C.col=A.col; for(i=0;i<A.row;i+)for(j=0;j<A.col;j+)C.aij=A.aij+B.aij;return 1;/矩阵减法 int

10、Sub(Matrix A,Matrix B,Matrix &C) int i,j;if(A.row!=B.row)return 0;elseC.row=A.row;C.col=A.col;for(i=0;i<A.row;i+)for(j=0;j<A.col;j+)C.aij=A.aij-B.aij;return 1;/矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C)int i,j,k;if(A.row!=B.row)return 0;elseC.row=A.row; C.col=A.col;for(i=0;i<A.row;i+)

11、 for(j=0;j<A.col;j+)C.aij=0; for(i=0;i<A.row;i+) /A的行数 for(j=0;j<A.col;j+) /A的列数和B的行数 for(k=0;k<A.col;k+) /B的列数 C.aij+=A.aik*B.akj;return 1; /矩阵的逆运算void Inverse(Matrix A)Matrix C;float p,q;int k,i,j,n;n=A.row;for(i=0;i<n ;i+)for(j=0;j<(n *2);j+) if(j<n) C.a ij=A.a ij; else if(j=

12、n+i) C.a ij=1.0;else C.a ij=0.0;for(k=0;k<n ;k+)for(i=0;i<n ;i+)if(i!=k)p=C.a ik/C.a ii;for(j=0;j<(n *2);j+)q=C.a ij*p;C.a ij=C.a ij-q; for(i=0;i<n ;i+)p=C.aii;for(j=0;j<n*2;j+)C.aij=C.aij/p;float y=1.0;for(i=0;i<n;i+)y=y*C.aii;for(i=0;i<n;i+)for(j=0;j<n;j+)A.aij=C.aij+n;prin

13、tf("逆运算结果:n");for(i=0;i<n;i+)for(j=0;j<n;j+)printf("%d ",A.aij);printf("n"); /矩阵转置 void Tans(Matrix A,Matrix &C) int i,j; C.row=A.row;C.col=A.col; for(i=0;i<A.row;i+) for(j=0;j<A.col;j+)C.aji=A.aij; /矩阵行列式的值 void Determinant(Matrix A) int count100; int s

14、um=0;int n;n=A.row; /矩阵的阶nfor (int p = 0; p < n; p+) int k = 0; int j = p%n;countp= A.akp;for (int i = 1; i < n; i+) k+; j+;k = k%n;j = j%n;countp *= A.akj;for (p = n-1; p >=0; p-) int k = 0; int j = p%n;count2*n-1-p = A.akp;for (int i = 1; i < n; i+) k+; j-;k = (k+n)%n;j =(j+n)%n;count2

15、*n-1-p *= A.akj;for (int i = 0; i < n; i+)sum+= (counti-counti + n);printf(" %dn",sum); /输出函数void print(Matrix A) int i,j;for(i=0;i<A.row;i+)for(j=0;j<A.col;j+)printf(" %d ",A.aij);printf("n");/菜单函数void showMenu()printf("特殊矩阵计算器n"); printf("选项1:上

16、三角矩阵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"

17、); 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)

18、;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);/输出

19、矩阵B printf("矩阵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

20、(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");b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论