《数据结构课程设计-特殊矩阵计算器(共13页).docx》由会员分享,可在线阅读,更多相关《数据结构课程设计-特殊矩阵计算器(共13页).docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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#include#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=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
3、)/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,&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
4、+)scanf(%d,&a.arrayi);for(i=0;in;i+)for(j=0;jn;j+)t=CompressMatrix(1,i,j,n);A.aij=a.arrayt;/下三角矩阵 void CreateMatrixLowertri(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.a
5、rrayi);for(i=0;in;i+)for(j=0;jn;j+)t=CompressMatrix(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;in*(n+1)/2;i+)scanf(%d,&a.arrayi);for(i=0;in;i+)for(j=0
6、;jn;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;for(i=1;i=n;i+)scanf(%d,&a.arrayi);for(i=0;in;i+)for(j=0;jn;j+)t=CompressMatrix(4,i,j,n)
7、;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; a.array0=0;a.array1=1; for(i=0;in;i+)for(j=0;jn;j+)t=CompressMatrix(5,i,j,n);A.aij=a.arrayt; /*矩阵运算*/矩阵加法 int Add(Matrix A,Matrix B,Matrix &C) int i,j;if(
8、A.row!=B.row)return 0;elseC.row=A.row;C.col=A.col; for(i=0;iA.row;i+)for(j=0;jA.col;j+)C.aij=A.aij+B.aij;return 1;/矩阵减法 int 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;iA.row;i+)for(j=0;jA.col;j+)C.aij=A.aij-B.aij;return 1;/矩阵乘法int Mul(Matrix
9、 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;iA.row;i+) for(j=0;jA.col;j+)C.aij=0; for(i=0;iA.row;i+) /A的行数 for(j=0;jA.col;j+) /A的列数和B的行数 for(k=0;kA.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
10、;n=A.row;for(i=0;in ;i+)for(j=0;j(n *2);j+) if(jn) C.a ij=A.a ij; else if(j=n+i) C.a ij=1.0;else C.a ij=0.0;for(k=0;kn ;k+)for(i=0;in ;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;in ;i+)p=C.aii;for(j=0;jn*2;j+)C.aij=C.aij/p;float y=1.0;for(i=0;in;i+)y=y*C.aii;fo
11、r(i=0;in;i+)for(j=0;jn;j+)A.aij=C.aij+n;printf(逆运算结果:n);for(i=0;in;i+)for(j=0;jn;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;iA.row;i+) for(j=0;jA.col;j+)C.aji=A.aij; /矩阵行列式的值 void Determinant(Matrix A) int count100; int sum=0;int n;n
12、=A.row; /矩阵的阶nfor (int p = 0; p n; p+) int k = 0; int j = p%n;countp= A.akp;for (int i = 1; i =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*n-1-p *= A.akj;for (int i = 0; i n; i+)sum+= (counti-counti + n);printf( %dn,sum); /输出函数void
13、 print(Matrix A) int i,j;for(i=0;iA.row;i+)for(j=0;jA.col;j+)printf( %d ,A.aij);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
14、); 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); pr
15、intf(输出下三角矩阵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);/输出矩阵B printf(矩阵B类型为(输入数字选择):); scanf(%d,&x); if(x=1) CreateMatrixUppertri(p,B); printf(输
16、出上三角矩阵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) pr
17、intf(请选择运算方式(输入数字选择):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;专心-专注-专业
限制150内