Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1467972
  • 博文数量: 213
  • 博客积分: 10418
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 23:49
文章分类

全部博文(213)

文章存档

2014年(1)

2013年(5)

2012年(11)

2011年(2)

2010年(8)

2009年(26)

2008年(160)

分类: C/C++

2008-04-11 00:37:03

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
 
const int n=3;
//设置方程组的维

 
void input_data(float a[n][n])
//输入行列式的相关数据

{
    cout<<"输入要计算的行列式a["<<n<<"]["<<n<<"]:"<<endl;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];
}
 
//////////////////////////////////////////////////////////////////

//

//find_line():找出行(i,,,n)、列为i的最大主元素所在的行,并返回行值

//

//////////////////////////////////////////////////////////////////

int find_line(int i,float a[n][n])
{
    int max_a_line=i;
//max_a_line为最大元素所在的行

    float max_a=a[i][i];
//max_a为最大元素的值

    int out_i=i;
//out_i为i的初始值

    for(i=i+1;i<n;i++)
    {
        if(a[i][out_i]<0)
            if(max_a<-a[i][out_i])
            {
                max_a=-a[i][out_i];
                max_a_line=i;
            };
        if(max_a<a[i][out_i])
        {
            max_a=a[i][out_i];
            max_a_line=i;
        };
    }
    return max_a_line;
}
//////////////////////////////////////////////////////////////////

//

//chang_line():交换两行的从line列到n列的元素

//

//////////////////////////////////////////////////////////////////

void chang_line(int line,int other_line,float a[n][n])
{
    float m;
//m为中间变量

    for(int j=line;j<n;j++)
    {
        m=a[line][j];
        a[line][j]=a[other_line][j];
        a[other_line][j]=m;
    }
}
 
//////////////////////////////////////////////////////////////////

//

//clear_num():消去第i列、i行以下的元素

//

//////////////////////////////////////////////////////////////////

void clear_num(int i,float a[n][n])
{
    int line=i,j;
    float m;
    for(i=i+1;i<n;i++)
    {
        m=-a[i][line]/a[line][line];
        for(j=line;j<n;j++)
        {
            a[i][j]=a[i][j]+m*a[line][j];
        };
    }
}
//////////////////////////////////////////////////////////////////

//

//print_num():输出行列式的元素

//

//////////////////////////////////////////////////////////////////

void print_num(float a[n][n])
{
    cout << setiosflags(ios::fixed);
//和下一句结合起来用来设定小数位的位数

    cout << setprecision(6);
    for(int i=0;i<n;i++)
    {
        cout<<"┃ ";
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<"┃"<<endl;
    }
    cout<<endl<<endl;
}
//////////////////////////////////////////////////////////////////

//

//calculate_det():计算行列式的值

//

//////////////////////////////////////////////////////////////////

float calculate_det(float a[n][n])
{
    float det=1;
    int i=0,j;
    input_data(a);
    do{
        
//print_num(a);

        j=find_line(i,a);
        if(i!=j)
        {
            chang_line(i,j,a);
            det=-det;
        };
        if(a[i][i]==0)
            return 0;
        det=det*a[i][i];
        if(i<n-1)
            clear_num(i,a);
        i++;
    }while(i<n);
    return det;
}
 
void main ()
{
    float a[n][n];
    cout<<"行列式的值为:"<<calculate_det(a)<<endl;
}

阅读(3920) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-06-09 10:10:53

输入要计算的行列式a[3][3]: 2 1 1 3 2 2 3 2 3 ┃ 2.000000 1.000000 1.000000 ┃ ┃ 3.000000 2.000000 2.000000 ┃ ┃ 3.000000 2.000000 3.000000 ┃ ┃ 3.000000 2.000000 2.000000 ┃ ┃ -0.000000 -0.333333 -0.333333 ┃ ┃ 0.000000 0.000000 1.000000 ┃ 行列式的值为:0.000000 请按任意键继续. . .

chinaunix网友2009-06-09 09:39:30

┃ 3.000000 2.000000 2.000000 ┃ ┃ 3.000000 2.000000 3.000000 ┃ ┃ 1.000000 5.000000 2.000000 ┃ 行列式的值为:0.000000 请按任意键继续. . .

chinaunix网友2009-06-09 09:13:27

┃ 2.000000 1.000000 4.000000 1.000000 1.000000 2.000000 ┃ ┃ 3.000000 2.000000 1.000000 2.000000 1.000000 6.000000 ┃ ┃ 3.000000 2.000000 1.000000 3.000000 4.000000 3.000000 ┃ ┃ 1.000000 5.000000 1.000000 2.000000 3.000000 4.000000 ┃ ┃ 1.000000 5.000000 1.000000 2.000000 3.000000 6.000000 ┃ ┃ 3.000000 2.000000 3.000000 4.000000 5.000000 4.000000 ┃ 行列式的值为:0.000000 请按任意键继续. . .