请高手看看for循环哪里出错了
#include <stdio.h> #include <math.h>
#include <malloc.h>
void main()
{
int n;
printf( "请输入你所求解的逆矩阵的阶数:n= ");
scanf( "%d ",&n);
float choose_the_main(float **a,float *b,int k,int n);
void input_output(float **a,float **c,float **q,int n);
void course(float **a,float **c,float **q,float *b,int n);
float **a,*b,**c,**q;
int i;
a=(float **)malloc(sizeof(float *)*n);
b=(float *)malloc(sizeof(float )*n);
c=(float **)malloc(sizeof(float *)*n);
q=(float **)malloc(sizeof(float *)*n);
for(i=0;i <n;i++)
{
*(a+i)=(float *)malloc(sizeof(float )*n);
*(c+i)=(float *)malloc(sizeof(float )*n);
*(q+i)=(float *)malloc(sizeof(float )*n);
}
printf( "您现在做的是%d阶矩阵的逆矩阵求解\n ",n);
input_output(a,c,q,n);
course(a,c,q,b,n);
}
/*定义列选主元函数*/
float choose_the_main(float **a,float *b,int k,int n)
{
float d,t;
int l,i,j;
d=a[k-1][k-1];
l=k-1;
for(i=k;i <n;i++)
{
if(fabs(a[i][k-1]> fabs(d)))
{
d=a[i][k-1];
l=i;
}
}
if(d==0)
printf( "The system is error!\n ");
else
{
if(l!=k-1)
{
for(j=k-1;j <n;j++)
{
t=a[l][j];
a[l][j]=a[k-1][j];
a[k-1][j]=t;
}
t=b[l];b[l]=b[k-1];b[k-1]=t;
}
}
return (d);
}
/*输入输出函数--读入数据*/
void input_output(float **a,float **c,float **q,int n)
{
int i,j;
printf( "请按行的顺序依次输入矩阵中元素的值(共%d项): ",n*n);
for(i=0;i <=n-1;i++)
for(j=0;j <=n-1;j++)
scanf( "%f ",&a[i][j]);
for(i=0;i <n;i++)
for(j=0;j <=n-1;j++)
{
if(i==j) c[i][j]=1;
else c[i][j]=0;
q[i][j]=a[i][j];
}
printf( "您输入的(AE)矩阵为(利用(AE)--> (E(A的逆)):\n ");
for(i=0;i <=n-1;i++)
{
for(j=0;j <=n-1;j++)
printf( "%.5f ",a[i][j]);
for(j=0;j <=n-1;j++)
printf( "%.5f ",c[i][j]);
printf( "\n ");
}
printf( "\n ");
}
/*利用A和A的逆的乘积等于E,即Ax=E,进行n次循环求出A的逆*/
void course(float **a,float **c,float **q,float *b,int n)
{
float sum=0,h;
int i,j,k,p,flag=0;
for(p=0;p <n;p++)
{
for(j=0;j <n;j++)
b[j]=c[j][p];
for(i=0;i <n;i++)
for(j=0;j <=n-1;j++)
{
a[i][j]=q[i][j];
}
/*调用列选主元函数,然后进行消元*/
for(k=1;k <=n-1;k++)
{
h=choose_the_main(a,b,k,n);
if(h==0)
{
printf( "因为矩阵的行列式的值为0,所以不能用此程序做!程序退出!\n ");
flag=1;
break;
}
else
{
for(i=k;i <n;i++)
a[i][k-1]=a[i][k-1]/a[k-1][k-1];
for(i=k;i <n;i++)
for(j=k;j <n;j++)
a[i][j]=a[i][j]-a[i][k-1]*a[k-1][j];
for(i=k;i <n;i++)
b[i]=b[i]-(a[i][k-1]*b[k-1]);
}
}
if(flag==1) break;
/*回代求出方程组的解,并打印*/
if(h!=0)
{
b[n-1]=b[n-1]/a[n-1][n-1];
for(i=n-2;i> =0;i--)
{
for(j=i+1;j <n;j++)
sum=sum+a[i][j]*b[j];
b[i]=(b[i]-sum)/a[i][i];
sum=0;
}
for(j=0;j <n;j++)
c[j][p]=b[j];
}
}
if(flag==0)
{
printf( "所求矩阵的逆矩阵为:\n ");
for(i=0;i <=n-1;i++)
{
for(j=0;j <=n-1;j++)
printf( "%.5f ",c[i][j]);
printf( "\n ");
}
}
}