数据结构课程设计-特殊矩阵计算器.docx

上传人:b****9 文档编号:116190 上传时间:2022-10-03 格式:DOCX 页数:13 大小:21.33KB
下载 相关 举报
数据结构课程设计-特殊矩阵计算器.docx_第1页
第1页 / 共13页
数据结构课程设计-特殊矩阵计算器.docx_第2页
第2页 / 共13页
数据结构课程设计-特殊矩阵计算器.docx_第3页
第3页 / 共13页
数据结构课程设计-特殊矩阵计算器.docx_第4页
第4页 / 共13页
数据结构课程设计-特殊矩阵计算器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构课程设计-特殊矩阵计算器.docx

《数据结构课程设计-特殊矩阵计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计-特殊矩阵计算器.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构课程设计-特殊矩阵计算器.docx

特殊矩阵计算器

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-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1