标题:请高手看看for循环哪里出错了
只看楼主
hanjiayu0717
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2012-3-27
结帖率:0
已结贴  问题点数:20 回复次数:2 
请高手看看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 ");
      }
}
}
搜索更多相关主题的帖子: void 矩阵 include course 
2012-03-28 13:10
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
得分:20 
程序代码:
#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++)                    /*  这里不是错误,但为什么你要在j和<n加一个空格呢?为了格式好看吗?我觉得更容易出错.  */
    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 ");
      }
}
}

改正以上练出程序就没有错误了,但是运行好像得不到你要结果.具体我就没有分析了.
2012-03-28 17:04
hanjiayu0717
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2012-3-27
得分:0 
回复 2楼 share32
问题已解决,谢谢
2012-03-28 22:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-364562-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.580174 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved