您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数据结构课程设计-特殊矩阵计算器
特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵A和B,计算A+B、A-B、A*B、B*A、A(或B)的逆、A(或B)的转置、A(或B)的行列式等,具体要求如下:①A、B均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。②A、B的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。③各运算若可行,则打印结果;若不可行,则给出提示信息。④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵API。涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。#includestdio.h#includemath.h#definemax100typedefstruct{introw,col;//定义矩阵行数、列数inta[max][max];}Matrix;//存储结构typedefstruct{intarray[max];intn;//定义矩阵的阶}M;MatrixA,B,C,D;Mp;//*************矩阵的压缩存储*********************//intCompressMatrix(intm,inti,intj,intn){intk;if(m==1){if(i=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;returnk;}if(m==2){if(i=j)k=i*(i+1)/2+j+1;elsek=0;returnk;}if(m==3){if(i=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;returnk;}if(m==4){if(i!=j)k=0;elsek=i+1;returnk;}if(m==5){if(i==j)return1;elsereturn0;}return0;}//*************矩阵定义*********************////上三角矩阵//voidCreateMatrixUppertri(M&a,Matrix&A){inti,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;in;i++)for(j=0;jn;j++){t=CompressMatrix(1,i,j,n);A.a[i][j]=a.array[t];}}//下三角矩阵voidCreateMatrixLowertri(M&a,Matrix&A){inti,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;in;i++)for(j=0;jn;j++){t=CompressMatrix(2,i,j,n);A.a[i][j]=a.array[t];}}//对称矩阵voidCreateMatrixSymmetry(M&a,Matrix&A){inti,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.array[i]);for(i=0;in;i++)for(j=0;jn;j++){t=CompressMatrix(3,i,j,n);A.a[i][j]=a.array[t];}}//对角矩阵voidCreateMatrixDiagonal(M&a,Matrix&A){inti,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;in;i++)for(j=0;jn;j++){t=CompressMatrix(4,i,j,n);A.a[i][j]=a.array[t];}}//单位矩阵voidCreateMatrixUnit(M&a,Matrix&A){inti,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;in;i++)for(j=0;jn;j++){t=CompressMatrix(5,i,j,n);A.a[i][j]=a.array[t];}}//*************矩阵运算*********************////矩阵加法intAdd(MatrixA,MatrixB,Matrix&C){inti,j;if(A.row!=B.row)return0;else{C.row=A.row;C.col=A.col;for(i=0;iA.row;i++)for(j=0;jA.col;j++)C.a[i][j]=A.a[i][j]+B.a[i][j];}return1;}//矩阵减法intSub(MatrixA,MatrixB,Matrix&C){inti,j;if(A.row!=B.row)return0;else{C.row=A.row;C.col=A.col;for(i=0;iA.row;i++)for(j=0;jA.col;j++)C.a[i][j]=A.a[i][j]-B.a[i][j];}return1;}//矩阵乘法intMul(MatrixA,MatrixB,Matrix&C){inti,j,k;if(A.row!=B.row)return0;else{C.row=A.row;C.col=A.col;for(i=0;iA.row;i++)for(j=0;jA.col;j++)C.a[i][j]=0;for(i=0;iA.row;i++)//A的行数for(j=0;jA.col;j++)//A的列数和B的行数for(k=0;kA.col;k++)//B的列数C.a[i][j]+=A.a[i][k]*B.a[k][j];}return1;}//矩阵的逆运算voidInverse(MatrixA){MatrixC;floatp,q;intk,i,j,n;n=A.row;for(i=0;in;i++)for(j=0;j(n*2);j++){if(jn)C.a[i][j]=A.a[i][j];elseif(j==n+i)C.a[i][j]=1.0;elseC.a[i][j]=0.0;}for(k=0;kn;k++){for(i=0;in;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;in;i++){p=C.a[i][i];for(j=0;jn*2;j++)C.a[i][j]=C.a[i][j]/p;floaty=1.0;for(i=0;in;i++)y=y*C.a[i][i];for(i=0;in;i++)for(j=0;jn;j++)A.a[i][j]=C.a[i][j+n];printf(逆运算结果:\n);for(i=0;in;i++){for(j=0;jn;j++)printf(%d,A.a[i][j]);printf(\n);}}}//矩阵转置voidTans(MatrixA,Matrix&C){inti,j;C.row=A.row;C.col=A.col;for(i=0;iA.row;i++)for(j=0;jA.col;j++)C.a[j][i]=A.a[i][j];}//矩阵行列式的值voidDeterminant(MatrixA){intcount[100];intsum=0;intn;n=A.row;//矩阵的阶nfor(intp=0;pn;p++){intk=0;intj=p%n;count[p]=A.a[k][p];for(inti=1;in;i++){k++;j++;k=k%n;j=j%n;count[p]*=A.a[k][j];}}for(p=n-1;p=0;p--){intk=0;intj=p%n;count[2*n-1-p]=A.a[k][p];for(inti=1;in;i++){k++;j--;k=(k+n)%n;j=(j+n)%n;count[2*n-1-p]*=A.a[k][j];}}for(inti=0;in;i++)sum+=(count[i]-count[i+n]);printf(%d\n,sum);}//输出函数voidprint(MatrixA){inti,j;for(i=0;iA.row;i++){for(j=0;jA.col;j++)printf(%d,A.a[i][j]);printf(\n);}}//菜单函数voidshowMenu(){printf(特殊矩阵计算器\n);printf(选项1:上三角矩阵\n);printf(选项2:下三角矩阵\n);printf(选项3:对称矩阵\n);printf(选项4:对角矩阵\n);printf(选项5:单位矩阵\n);}voidshowMenu2(){printf(输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n);printf(选项1:矩阵相加\n);printf(选项2:矩阵相减\n);printf(选项3:矩阵相乘\n);printf(选项4:矩阵的逆矩阵\n);printf(选项5:矩阵转置\n);printf(选项6:矩阵行列式\n);}//主函数intmain(){charifcontinue;intx;inty;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){CreateMatrixS
本文标题:数据结构课程设计-特殊矩阵计算器
链接地址:https://www.777doc.com/doc-6312056 .html