#include<stdio.h>
#define m 3//矩阵的行数
#define n 4//矩阵的列数
float a[m][n];
void main()
{
void out1();//test1
void out2();//test2
void out3();//test3
float temp;
int i,j,ii,jj,b,c,e;
printf("请依次输入原矩阵元素:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
{
printf("a[%d][%d]=",i+1,j+1);
scanf("%f",&a[i][j]);
printf("\n");
}
}
printf("\n输入的原矩阵为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
//下面是行变换
c=0;//反应的列(当前列)
b=0;//下降的行数
e=0;//每发现一列有非零元素就加一
for(j=0;j<=n-1&&j<=m-1;j++)
{
for(i=b;i<=m-1;i++) //判断该列是否全为0,找出第一个不是0的元素
{
if(a[i][c]!=0)
{
e=e+1;
break;
}
if(i==m-1&&a[i][c]==0)
{
c=c+1;
break;
}
}
if(i==m-1&&a[i][c]==0)
continue;
if(i!=c)
{
for(jj=0;jj<=n-1;jj++) //将该行移至理论要求应在的行
{
temp=a[i][jj];
a[i][jj]=a[b][jj];
a[b][jj]=temp;
}
}
out1();//test1
temp=a[b][c];
for(jj=0;jj<=n-1;jj++)//将该元素取值1,该行其他元素随之变换
a[b][jj]/=temp;
out2();//test2
for(ii=0;ii<=m-1;ii++)//将从该列开始的对应元素作相应变换
{
if(ii==b)
continue;
temp=a[ii][c];//该列元素
for(jj=c;jj<=n-1;jj++)//右侧的元素
a[ii][jj]=a[ii][jj]-temp*a[b][jj];
out3();//test3
}
c=c+1;
b=e;
}
//输出
printf("\n\n对应的行最简矩阵为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
//三个测试函数
void out1()
{
int i,j;
printf("\n\n矩阵行变换为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
void out2()
{
int i,j;
printf("\n\n矩阵化1变为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
void out3()
{
int i,j;
printf("\n\n矩阵化0变为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
#define m 3//矩阵的行数
#define n 4//矩阵的列数
float a[m][n];
void main()
{
void out1();//test1
void out2();//test2
void out3();//test3
float temp;
int i,j,ii,jj,b,c,e;
printf("请依次输入原矩阵元素:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
{
printf("a[%d][%d]=",i+1,j+1);
scanf("%f",&a[i][j]);
printf("\n");
}
}
printf("\n输入的原矩阵为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
//下面是行变换
c=0;//反应的列(当前列)
b=0;//下降的行数
e=0;//每发现一列有非零元素就加一
for(j=0;j<=n-1&&j<=m-1;j++)
{
for(i=b;i<=m-1;i++) //判断该列是否全为0,找出第一个不是0的元素
{
if(a[i][c]!=0)
{
e=e+1;
break;
}
if(i==m-1&&a[i][c]==0)
{
c=c+1;
break;
}
}
if(i==m-1&&a[i][c]==0)
continue;
if(i!=c)
{
for(jj=0;jj<=n-1;jj++) //将该行移至理论要求应在的行
{
temp=a[i][jj];
a[i][jj]=a[b][jj];
a[b][jj]=temp;
}
}
out1();//test1
temp=a[b][c];
for(jj=0;jj<=n-1;jj++)//将该元素取值1,该行其他元素随之变换
a[b][jj]/=temp;
out2();//test2
for(ii=0;ii<=m-1;ii++)//将从该列开始的对应元素作相应变换
{
if(ii==b)
continue;
temp=a[ii][c];//该列元素
for(jj=c;jj<=n-1;jj++)//右侧的元素
a[ii][jj]=a[ii][jj]-temp*a[b][jj];
out3();//test3
}
c=c+1;
b=e;
}
//输出
printf("\n\n对应的行最简矩阵为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
//三个测试函数
void out1()
{
int i,j;
printf("\n\n矩阵行变换为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
void out2()
{
int i,j;
printf("\n\n矩阵化1变为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}
void out3()
{
int i,j;
printf("\n\n矩阵化0变为:\n");
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5g",a[i][j]);
printf("\n\n");
}
}