bobnie 发表于 2008-6-17 16:17:34

帮忙看下!!!!

帮忙看下!!!!
这个程序用于求方阵的行列式,方法是用第一行倍加到其余行,使其余行首元素归零.....最后得到上三角阵,把对角线上元素相乘即得行列式值.
错误已经发现,就是/*......*/之间的部分,请问怎么错了?
#include <stdio.h>
#include <math.h>
void main()
{
      int size,//方阵的阶数
                h,j,k,//控制变量
                switchtime=0;//交换次数
      float D,//存放方阵
                  result=1,//行列式值
            temp,//交换中介
                  flag;//倍加系数
      FILE *fp;//文件指针

      fp=fopen("fzsj.txt","r");
      fscanf(fp,"%d",&size);//读取方阵阶数

      for(h=0;h<size;h++)//读取方阵数据
                for(j=0;j<size;j++)
                        fscanf(fp,"%f",&D);

      for(k=0;k<size;k++)
      {
      /*      for(h=k;h<size;h++)//寻找首元素非零的行
                        if(D!=0)
                              break;//找到后退出此循环
               
               
                if(h>k)
                {
                        for(j=k;j<size;j++)//交换两行
                        {
                              temp=D;
                              D=D;
                              D=temp;
                        }
                        switchtime++;//换行控制变量自增
                }
*/
               
                for(h=k+1;h<size;h++)//倍加归零
                {
                        flag=D/D;
                        for(j=k;j<size;j++)
                              D-=D*flag;
                }
      }

      for(h=0;h<size;h++)
                result*=D;
      /*for(h=0;h<switchtime;h++)
                result=(-result);
    */
      printf("%f\n",result);
}

dragon_ 发表于 2008-6-17 18:22:37

给你个能用的代码吧。
这段代码是用选主元的Gauss消去法(就是你说的化为对角阵)解线性方程组的程序。先把矩阵化为上三角阵,再解方程。你把解方程组的代码删了就行了。void solve(double fdao, double vec_delta, double f)
{
int i, j, k, ik;
double tmp, mik;

            for(k = 0; k < M-1; k++)
            {
                ik = k;
               
                for(i = k; i < M; i++)if(fabs(fdao) < fabs(fdao))ik = i;//找出行首元最大的行;
            
                for(j = k; j < M; j++)
                {
                  tmp = fdao; fdao = fdao; fdao = tmp;//交换当前行与最大行;
                }
               
                tmp = f; f = f; f = tmp;
            
                for(i = k + 1; i < M; i++)
                {
                  mik = fdao / fdao;
               
                  for(j = k; j < M; j++)fdao = fdao - mik * fdao;
               
                  f-= mik * f;
                }
            }
      
            vec_delta = f / fdao;//以下为解方程;
      
            for(k = M-2; k >= 0; k--)
            {
                tmp = 0;
            
                for(j = k+1; j < M; j++)tmp+= fdao * vec_delta;
            
                vec_delta = (f - tmp) / fdao;
            }
}选主元的Gauss消去法仍然是数值分析的内容。

bobnie 发表于 2008-6-17 21:20:57

回复 2# 的帖子

我的目的不是想得到一个能用的程序,这只是个学习过程,我还是想知道我的程序哪里错了,不然我睡不着觉啊,呵呵,还望大哥帮忙!/*,,,,,,,,,,*/中间的部分到底怎么错了?

bobnie 发表于 2008-6-17 22:31:02

不经意间不知道怎么回事这个程序居然又能用了,难道。。。。。?太让我费解了!

dragon_ 发表于 2008-6-18 01:15:55

找bug也是个学习过程。所以自己找吧。:loveliness:

bobnie 发表于 2008-6-18 10:08:47

回复 5# 的帖子

我只是凭借着以前对C的一点知识加上兴趣来学习,由于是业余,能力显然也很弱,以后还请多费心指导.
页: [1]
查看完整版本: 帮忙看下!!!!