数据结构课程设计特殊矩阵计算器.docx
- 文档编号:25290682
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:18
- 大小:16.83KB
数据结构课程设计特殊矩阵计算器.docx
《数据结构课程设计特殊矩阵计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计特殊矩阵计算器.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计特殊矩阵计算器
特殊矩阵计算器
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",&,&;
n=;
=n;
printf("请输入%d个数:
",n*(n+1)/2);
[0]=0;
for(i=1;i<=n*(n+1)/2;i++)
scanf("%d",&[i]);
for(i=0;i for(j=0;j t=CompressMatrix(1,i,j,n); [i][j]=[t]; } } //下三角矩阵 voidCreateMatrixLowertri(M&a,Matrix&A){ inti,j,t,n; printf("请输入下三角矩阵的行数和列数(行数与列数相同): "); scanf("%d%d",&,&; n=; =n; printf("请输入%d个数: ",n*(n+1)/2); [0]=0; for(i=1;i<=n*(n+1)/2;i++) scanf("%d",&[i]); for(i=0;i for(j=0;j t=CompressMatrix(2,i,j,n); [i][j]=[t]; } } //对称矩阵 voidCreateMatrixSymmetry(M&a,Matrix&A){ inti,j,t,n; printf("请输入对称矩阵的行数和列数(行数与列数相同): "); scanf("%d%d",&,&; n=; =n; printf("请输入%d个数: ",n*(n+1)/2); for(i=0;i scanf("%d",&[i]); for(i=0;i for(j=0;j t=CompressMatrix(3,i,j,n); [i][j]=[t]; } } //对角矩阵 voidCreateMatrixDiagonal(M&a,Matrix&A){ inti,j,t,n; printf("请输入对角矩阵的行数和列数(行数与列数相同): "); scanf("%d%d",&,&; n=; =n; printf("请输入%d个数: ",n); [0]=0; for(i=1;i<=n;i++) scanf("%d",&[i]); for(i=0;i for(j=0;j t=CompressMatrix(4,i,j,n); [i][j]=[t]; } } //单位矩阵 voidCreateMatrixUnit(M&a,Matrix&A){ inti,j,t,n; printf("请输入单位矩阵的行数和列数(行数与列数相同): "); scanf("%d%d",&,&; n=; =n; [0]=0; [1]=1; for(i=0;i for(j=0;j t=CompressMatrix(5,i,j,n); [i][j]=[t]; } } //*************矩阵运算*********************// //矩阵加法 intAdd(MatrixA,MatrixB,Matrix&C) { inti,j; if! = return0; else { =; =; for(i=0;i<;i++) for(j=0;j<;j++) [i][j]=[i][j]+[i][j]; } return1; } //矩阵减法 intSub(MatrixA,MatrixB,Matrix&C) { inti,j; if! = return0; else { =; =; for(i=0;i<;i++) for(j=0;j<;j++) [i][j]=[i][j][i][j]; } return1; } //矩阵乘法 intMul(MatrixA,MatrixB,Matrix&C) { inti,j,k; if! = return0; else { =; =; for(i=0;i<;i++) for(j=0;j<;j++) [i][j]=0; for(i=0;i<;i++)//A的行数 for(j=0;j<;j++)//A的列数和B的行数 for(k=0;k<;k++)//B的列数 [i][j]+=[i][k]*[k][j]; } return1; } //矩阵的逆运算 voidInverse(MatrixA){ MatrixC; floatp,q; intk,i,j,n; n=; for(i=0;i for(j=0;j<(n*2);j++){ if(j [i][j]=[i][j]; elseif(j==n+i) [i][j]=; else [i][j]=; } for(k=0;k for(i=0;i if(i! =k){ p=[i][k]/[i][i]; for(j=0;j<(n*2);j++){ q=[i][j]*p; [i][j]=[i][j]-q; } } } } for(i=0;i p=[i][i]; for(j=0;j [i][j]=[i][j]/p; floaty=; for(i=0;i y=y*[i][i]; for(i=0;i for(j=0;j [i][j]=[i][j+n]; printf("逆运算结果: \n"); for(i=0;i for(j=0;j printf("%d",[i][j]); printf("\n"); } } } //矩阵转置 voidTans(MatrixA,Matrix&C) { inti,j; =; =; for(i=0;i<;i++) for(j=0;j<;j++) [j][i]=[i][j]; } //矩阵行列式的值 voidDeterminant(MatrixA){ intcount[100]; intsum=0; intn; n=;//矩阵的阶n for(intp=0;p intk=0;intj=p%n; count[p]=[k][p]; for(inti=1;i k++;j++; k=k%n; j=j%n; count[p]*=[k][j]; } } for(p=n-1;p>=0;p--){ intk=0;intj=p%n; count[2*n-1-p]=[k][p]; for(inti=1;i k++;j--; k=(k+n)%n; j=(j+n)%n; count[2*n-1-p]*=[k][j]; } } for(inti=0;i sum+=(count[i]-count[i+n]); printf("%d\n",sum); } //输出函数 voidprint(MatrixA) { inti,j; for(i=0;i<;i++) { for(j=0;j<;j++) printf("%d",[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(); //输出矩阵A printf("矩阵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); } //输出矩阵B printf("矩阵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) { case1: if(Add(A,B,C)) print(C); else printf("运算错误\n"); printf("**********************************\n"); break; case2: if(Sub(A,B,C)) print(C); else printf("运算错误\n"); printf("**********************************\n"); break; case3: if(Mul(A,B,C)) print(C); else printf("运算错误\n"); printf("----------------------------------\n"); if(Mul(B,A,C)) print(C); else printf("运算错误\n"); printf("**********************************\n"); break; case4: Inverse(A); printf("----------------------------------\n"); Inverse(B); printf("**********************************\n"); break; case5: Tans(A,C); print(C); printf("----------------------------------\n"); Tans(B,C); print(C); printf("**********************************\n"); break; case6: Determinant(A); printf("----------------------------------\n"); Determinant(B); printf("**********************************\n"); break; default: printf("请输入正确的选项! \n"); printf("**********************************\n"); } getchar(); ifcontinue=getchar(); if(ifcontinue! ='Y') break; } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 特殊 矩阵 计算器