矩阵运算 c语言编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
void init(int *a,int m,int n)
{//随机产生函数
srand(time(NULL));
int i,j;
for(i=0;i
for(j=0;j
}
}
void input(int *a,int m,int n)
{//用户输入函数
int i,j;
for(i=0;i
for(j=0;j
}
}
void choose(int *a,int m,int n)
{//是随机产生还是用户输入
int i;
printf("是想输入矩阵(输入0)还是随机产生(输入1):\n");
scanf("%d",&i);
switch(i)
{
case 1:init(a,m,n);
break;
case 0:printf("请输入%d个数\n",m*n);
input(a,m,n);
break;
default:printf("你的输入有误,请重新输入:\n");
break;
}
}
void print(int *a,int m,int n)
{//打印函数
int i,j;
for(i=0;i
for(j=0;j
printf("\n");
}
}
//矩阵关于y轴翻转
void juzheny(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
//矩阵关于x轴翻转
void juzhenx(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
//顺时针旋转90°,逆时针旋转270°
void juzhens(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
//逆时针旋转90°,顺时针旋转270°
void juzhenn(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
// 顺/逆时针旋转180°
void juzhens1(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
//矩阵转置
void juzhenzz(int *a,int *b,int m,int n)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
//任意修改矩阵的元素值
void juzhenyz(int *a,int i,int j,int x,int m,int n)
{
*(a+i*n+j)=x;
}
void jiemian()
{
int i;
for(i=0;i<80;i++)
printf("*");
printf("\n");
printf(" ");
}
void menu()
{//菜单界面初始化
int i;
for(i=1;i<3;i++)
printf("\n");
printf("\n关于一些矩阵方面的应用!\n");
for(i=0;i<80;i++)
printf("=");
printf("\n0.查询矩阵中元素所在的行号和列号。 1.任意修改矩阵的元素值。\n");
printf("\n2.矩阵转置。 3.矩阵关于y轴翻转。 4.矩阵关于x轴翻转。\n");
printf("\n5.矩阵顺或逆时针旋转90°或逆或顺时针旋转270°。 \n");
printf("\n6.矩阵旋转180°。7.删除矩阵中该元素所在的行和列,得到了新的二维数组。\n");
printf("\n8.矩阵的逆矩阵。9.矩阵对应行列式的值。10.求矩阵的伴随矩阵。 11.退出系统. \n");
for(i=0;i<80;i++)
printf("=");
printf("\n");
}
int zhanghao()//用户输入用户名账号和密码
{
char str1[80],str2[80],
str[13]={"shenglongfei"};
int next,count=1;
do
{
printf("\\请输入用户名(默认为shenglongfei):");
gets(str1);
printf("\\请输入密码(默认为shenglongfei):");
gets(str2);
if(strcmp(str1,str)==0&&strcmp(str2,str)==0)
next=0;
else
{
if(count>3)
{
printf("\\你错误的次数已超过3次!!!\n");
next=1;
break;
}
printf("\\用户名或密码错误,请重新输入!\n");
next=1;
count++;
}
}while(next);
return next;
}
//查询矩阵中元素所在的行号和列号
void juzhensort(int *a,int x,int m,int n)
{
int i,j,flag=0;
for(i=0;i
for(j=0;j
if(*(a+i*n+j)==x)
{
flag=1;
printf("该数在第%d行和第%d列\n",i+1,j+1);
}
}
}
if(flag==0)
printf("矩阵中没有你要查询的数!\n");
}
int *JUZHEN(int *a,int *b,int i,int j,int m,int n)
{
//删除矩阵中该元素所在的行和列,得到了新的二维数组
int I=0,J;
while(I{ J=0;
while(J
*(b+I*(n-1)+J)=*(a+I*n+J);
J++;
}
J++;
while(J>j&&J
*(b+I*(n-1)+J-1)=*(a+I*n+J);
J++;
}
I++;
}
I++;
while(I>i&&I
J=0;
while(J
*(b+(I-1)*(n-1)+J)=*(a+I*n+J);
J++;
}
J++;
while(J>j&&J
*(b+(I-1)*(n-1)+J-1)=*(a+I*n+J);
J++;
}
I++;
}
return b;
}
double juzhenmc(int *a,int *b,int m,int n)
{//求矩阵对应行列式的值
int i=0,j,*c=NULL,*d=NULL;
double mo=0;
c=(int *)calloc((m-1)*(n-1),sizeof(int));
d=(int *)calloc((m-1)*(n-1),sizeof(int));
for(j=0;j
if(n==1)
mo=(double)(*(a+i*n+j))*pow(-1,i+j+2);
c=JUZHEN(a,b,0,j,m,n);
mo+=(double)*(a+i*n+j)*pow(-1,i+j+2)*juzhenmc(c,d,m-1,n-1);//函数递归调用
}
return mo;
}
int * bansui(int *a,int *b,int m,int n)//求出伴随矩阵
{
int i,j,*c=NULL,*d=NULL,*p=NULL;
int mo;
p=(int *)calloc(m*n,sizeof(int));
c=(int *)calloc((m-1)*(n-1),sizeof(int));
d=(int *)calloc((m-1)*(n-1),sizeof(int));
for(i=0;i
for(j=0;j
c=JUZHEN(a,b,i,j,m,n);
mo=pow(-1,i+j+2)*juzhenmc(c,d,m-1,n-1);
*(p+i*n+j)=mo;
}
}
return p;
}
void JUZHEN1(int *a,int *b,int m,int n)
{//求矩阵的逆矩阵
int *p=NULL,i,j;
p=(int *)calloc(m*n,sizeof(int));
p=bansui(a,b,m,n);
juzhenzz(p,b,m,n);
print(b,n,m);
}
void choose1()
{
int i,*a=NULL,*b=NULL,*c=NULL,*d=NULL,m,n,j,k,x,next,*p=NULL;
do
{
printf("请用户选择功能(0,1,2,3,4,5,....,10,11)!\n");
scanf("%d",&i);
if(i==11)
{
printf("谢谢使用!\n");
exit(0);
}
printf("\请输入多少行多少列的矩阵:\n");
scanf("%d%d",&m,&n);
a=(int *)calloc(m*n,sizeof(int));
b=(int *)calloc(m*n,sizeof(int));
choose(a,m,n);
print(a,m,n);
switch(i)
{
case 0:printf("请输入你要查找的数:\n");//查找矩阵中元素所在的行号和列号
scanf("%d",&x);
juzhensort(a,x,m,n);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 1:do
{ printf("请输入你想修改的行和列以及你修改的数:\n");//任意修改矩阵中的元素
scanf("%d%d%d",&j,&k,&x);
juzhenyz(a,j,k,x,m,n);
print(a,m,n);
printf("你是否想继续修改,是输入1,否输入0:\n");
scanf("%d",&next);
}while(next);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 2:juzhenzz(a,b,m,n);//矩阵转置
printf("转置后的矩阵为:\n");
print(b,n,m);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 3:juzheny(a,b,m,n);//矩阵关于y轴翻转
printf("关于y轴翻转后的矩阵为:\n");
print(b,m,n);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 4:juzhenx(a,b,m,n);//矩阵关于x轴翻转
printf("关于x轴翻转后的矩阵为:\n");
print(b,m,n);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 5:juzhens(a,b,m,n);//矩阵顺或逆时针旋转90°或逆或顺时针旋转270°
printf("矩阵顺时针旋转90°或逆时针旋转270°后为:\n");//顺时针旋转90°,逆时针旋转270°
print(b,n,m);
juzhenn(a,b,m,n);
printf("\矩阵逆时针旋转90°或顺时针旋转270°后为:\n");
print(b,n,m);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 6:juzhens1(a,b,m,n);//矩阵旋转180°
printf("矩阵旋转180°后为:\n");
print(b,m,n);
system("PAUSE");
system("cls");//清屏函数
jiemian();
menu();
break;
case 7:printf("请输入你要删除第几行中的第几列数:\n");//删除矩阵中该元素所在的行和列,得到了新的二维数组
scanf("%d%d",&k,&j);
JUZHEN(a,b,k-1,j-1,m,n);
printf("删除第%d行中的第%d列数后的矩阵为:\n",k,j);
print(b,m-1,n-1);
system("PAUSE");//执行系统命令PAUSE
system("cls");//清屏函数
jiemian();
menu();
break;
case 8:if(m==n&&juzhenmc(a,b,m,n))
{
printf("矩阵的逆矩阵为:\n");
printf("(1/%lf)乘以下面矩阵中的各个元素\n",juzhenmc(a,b,m,n));
JUZHEN1(a,b,m,n);
}
else printf("此矩阵没逆矩阵!\n");
system("PAUSE");//执行系统命令PAUSE
system("cls");//清屏函数
jiemian();
menu();
break;
case 9:if(m==n)
printf("矩阵对应行列式的值为%lf.\n",juzhenmc(a,b,m,n));
else printf("你输入的矩阵不规范!不能求出矩阵对应行列式的值。\n");
system("PAUSE");//执行系统命令PAUSE
system("cls");//清屏函数
jiemian();
menu();
break;
case 10:if(m==n)
{
printf("矩阵对应的伴随矩阵为:\n");
p=bansui(a,b,m,n);
juzhenzz(p,b,m,n);
print(b,n,m);
}
else printf("
你输入的矩阵不规范!不能求出矩阵对应伴随矩阵。\n");
system("PAUSE");//执行系统命令PAUSE
system("cls");//清屏函数
jiemian();
menu();
break;
}
}while(1);
free(a);
free(b);
free(c);
free(d);
free(p);
}
int main(int argc, char *argv[])
{
int m,n,next,*a=NULL,*b=NULL;
jiemian();
menu();
next=zhanghao();
if(next==0)
{
choose1();
}
return 0;
}