特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<stdio.h>#include<math.h>#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",&A.row,&A.col);n=A.row;a.n=n;printf("请输入%d个数:",n*(n+1)/2);a.array[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);A.a[i][j]=a.array[t];}}//下三角矩阵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.array[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);A.a[i][j]=a.array[t];}}//对称矩阵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.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);A.a[i][j]=a.array[t];}}//对角矩阵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.array[0]=0;for(i=1;i<=n;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);A.a[i][j]=a.array[t];}}//单位矩阵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.array[0]=0;a.array[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);A.a[i][j]=a.array[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C) {int i,j;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=A.a[i][j]+B.a[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C) {int i,j;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=A.a[i][j]-B.a[i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C) {int i,j,k;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=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.a[i][j]+=A.a[i][k]*B.a[k][j];}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 [i][j]=A.a [i][j];else if(j==n+i)C.a [i][j]=1.0;elseC.a [i][j]=0.0;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p=C.a [i][k]/C.a [i][i];for(j=0;j<(n *2);j++){q=C.a [i][j]*p;C.a [i][j]=C.a [i][j]-q;}}}}for(i=0;i<n ;i++){p=C.a[i][i];for(j=0;j<n*2;j++)C.a[i][j]=C.a[i][j]/p;float y=1.0;for(i=0;i<n;i++)y=y*C.a[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)A.a[i][j]=C.a[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",A.a[i][j]);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.a[j][i]=A.a[i][j];}//矩阵行列式的值void Determinant(Matrix A) {int count[100];int sum=0;int n;n=A.row; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= A.a[k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= A.a[k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = A.a[k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= A.a[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<A.row;i++){for(j=0;j<A.col;j++)printf(" %d ",A.a[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;}。