易码技术论坛

 找回密码
 加入易码
搜索
查看: 1091|回复: 5

[求助] 帮忙看下!!!!

[复制链接]
发表于 2008-6-17 16:17:34 | 显示全部楼层 |阅读模式
帮忙看下!!!!
这个程序用于求方阵的行列式,方法是用第一行倍加到其余行,使其余行首元素归零.....最后得到上三角阵,把对角线上元素相乘即得行列式值.
错误已经发现,就是/*......*/之间的部分,请问怎么错了?
#include <stdio.h>
#include <math.h>
void main()
{
        int size,//方阵的阶数
                h,j,k,//控制变量
                switchtime=0;//交换次数
        float D[99][99],//存放方阵
                  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[h][j]);

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

        for(h=0;h<size;h++)
                result*=D[h][h];
        /*for(h=0;h<switchtime;h++)
                result=(-result);
    */
        printf("%f\n",result);
}
发表于 2008-6-17 18:22:37 | 显示全部楼层
给你个能用的代码吧。
这段代码是用选主元的Gauss消去法(就是你说的化为对角阵)解线性方程组的程序。先把矩阵化为上三角阵,再解方程。你把解方程组的代码删了就行了。
  1. void solve(double fdao[M][M], double vec_delta[M], double f[M])
  2. {
  3. int i, j, k, ik;
  4. double tmp, mik;

  5.             for(k = 0; k < M-1; k++)
  6.             {
  7.                 ik = k;
  8.                
  9.                 for(i = k; i < M; i++)  if(fabs(fdao[ik][k]) < fabs(fdao[i][k]))  ik = i;//找出行首元最大的行;
  10.             
  11.                 for(j = k; j < M; j++)  
  12.                 {
  13.                     tmp = fdao[k][j]; fdao[k][j] = fdao[ik][j]; fdao[ik][j] = tmp;//交换当前行与最大行;
  14.                 }
  15.                
  16.                 tmp = f[k]; f[k] = f[ik]; f[ik] = tmp;
  17.             
  18.                 for(i = k + 1; i < M; i++)
  19.                 {
  20.                     mik = fdao[i][k] / fdao[k][k];
  21.                
  22.                     for(j = k; j < M; j++)  fdao[i][j] = fdao[i][j] - mik * fdao[k][j];
  23.                
  24.                     f[i]-= mik * f[k];
  25.                 }
  26.             }
  27.         
  28.             vec_delta[M-1] = f[M-1] / fdao[M-1][M-1];//以下为解方程;
  29.         
  30.             for(k = M-2; k >= 0; k--)
  31.             {
  32.                 tmp = 0;
  33.             
  34.                 for(j = k+1; j < M; j++)  tmp+= fdao[k][j] * vec_delta[j];
  35.             
  36.                 vec_delta[k] = (f[k] - tmp) / fdao[k][k];
  37.             }
  38. }
复制代码
选主元的Gauss消去法仍然是数值分析的内容。
 楼主| 发表于 2008-6-17 21:20:57 | 显示全部楼层

回复 2# 的帖子

我的目的不是想得到一个能用的程序,这只是个学习过程,我还是想知道我的程序哪里错了,不然我睡不着觉啊,呵呵,还望大哥帮忙!/*,,,,,,,,,,*/中间的部分到底怎么错了?
 楼主| 发表于 2008-6-17 22:31:02 | 显示全部楼层
不经意间不知道怎么回事这个程序居然又能用了,难道。。。。。?太让我费解了!
发表于 2008-6-18 01:15:55 | 显示全部楼层
找bug也是个学习过程。所以自己找吧。
 楼主| 发表于 2008-6-18 10:08:47 | 显示全部楼层

回复 5# 的帖子

我只是凭借着以前对C的一点知识加上兴趣来学习,由于是业余,能力显然也很弱,以后还请多费心指导.
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-25 13:48 , Processed in 0.010252 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表