数据结构课程设计-特殊矩阵计算器.docx
《数据结构课程设计-特殊矩阵计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计-特殊矩阵计算器.docx(13页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计-特殊矩阵计算器.docx](https://file1.bdocx.com/fileroot1/2022-10/3/7c0b7fb5-0572-4ad7-adec-e24771ce3be3/7c0b7fb5-0572-4ad7-adec-e24771ce3be31.gif)
特殊矩阵计算器
1、特殊矩阵计算器
问题描述:
创建两个特殊矩阵A和B,计算A+B、A-B、A*B、B*A、A(或B)的逆、A(或B)的转置、A(或B)的行列式等,具体要求如下:
①A、B均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
②A、B的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵API。
涉及算法及知识:
特殊矩阵的压缩存储、矩阵相关运算。
#include
#include
#definemax100
typedefstruct{
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;
else
k=0;
returnk;
}
if(m==2){
if(i>=j)
k=i*(i+1)/2+j+1;
else
k=0;
returnk;
}
if(m==3){
if(i>=j)
k=i*(i+1)/2+j;
else
k=j*(j+1)/2+i;
returnk;
}
if(m==4){
if(i!
=j)
k=0;
else
k=i+1;
returnk;
}
if(m==5){
if(i==j)
return1;
else
return0;
}
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;i for(j=0;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;i for(j=0;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;i scanf("%d",&a.array[i]);
for(i=0;i for(j=0;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;i for(j=0;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;i for(j=0;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;i for(j=0;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;i for(j=0;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;i for(j=0;j C.a[i][j]=0;
for(i=0;i for(j=0;j for(k=0;k 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;i for(j=0;j<(n*2);j++){
if(j C.a[i][j]=A.a[i][j];
elseif(j==n+i)
C.a[i][j]=1.0;
else
C.a[i][j]=0.0;
}
for(k=0;k for(i=0;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 p=C.a[i][i];
for(j=0;j C.a[i][j]=C.a[i][j]/p;
floaty=1.0;
for(i=0;i y=y*C.a[i][i];
for(i=0;i for(j=0;j A.a[i][j]=C.a[i][j+n];
printf("逆运算结果:
\n");
for(i=0;i for(j=0;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;i for(j=0;j C.a[j][i]=A.a[i][j];
}
//矩阵行列式的值
voidDeterminant(MatrixA){
intcount[100];
intsum=0;
intn;
n=A.row;//矩阵的阶n
for(intp=0;p intk=0;intj=p%n;
count[p]=A.a[k][p];
for(inti=1;i k++;j++;
k=k%n;
j=j%n;
count[p]*=A.a[k][j];
}
}
for(p=n-