行列式求值(化为对角式)
采用的是多文件编译,作者环境是 vc6.0++
文件1 ValDet.h
/********************************************************
本程序采用C++类模式求行列式的值,
类入口
数为CalcDet(ValDet det),用户需要创建对象作为输入.
算法基本思想是将行列式化为对角形式,然后再使对角线上
的值相乘.
,由于算法的原因, 行列式的值装在容器vector中,double型
不能保证精度.
********************************************************/
#ifndef _VALDET_H
#define _VALDET_H //预编译.
#include
#include //使用容器vector.
using namespace std;
class ValDet
{
private:
int lin;
int col; //对角线的当前行,列.
//以下四个函数都是被CalcDet(ValDet det)调用的函数,故设为private型.
int Exchange(vector &M,const int &lin,const int &col,int n);
int FindNonZero(vector &M,const int &lin,const int &col,int n);
void AdjDet(vector &M,int &lin,int &col,int n);
void InDet(vector &m,int &n); public:
ValDet(); //类构造函数.
double CalcDet(ValDet det); //计算函数.类入口函数.
};
#endif
文件二, ValDet.cpp
#include
#include
#include //测试用,用于生成随机行列式值.
#include "ValDet.h" //引入头文件.
using namespace std;
ValDet::ValDet()
{
lin=0; //将对角线当前元素设为0行0列.
col=0; }
int ValDet::Exchange(vector &M,const int &lin,const int &col,int n)
{
int i=lin+1; //从下行开始找.
int j=col; //保存列.
while (i规则,交换两列,最终值乘以-1,此处顺便处理了.
return 1; //若找到,返回1.
}
i++; //没找到,对下一行处理.
}
return 0; //最终没有找到,返回0. }
/********************************************************************
*********
该函数作用是保证当前行上处于对角线位置上的元素值不为0.
若不为0返回1,否则试着找到一行的当前列元素不为0,并使二行的值交换.若找不到,则
返回0.
*********************************************************************
********/
int ValDet::FindNonZero(vector
&M,const int &lin,const int &col,int n)
{
if(M[lin*n+col]==0)
return Exchange(M,lin,col,n);
return 1;
}
/*****************************************************************
此函数的作用是用当前行使以下所有行的当前列值变为0,其他的元素执行 相同操作.
同其他函数,此函数的值采用引用的方法.
*****************************************************************/
void ValDet::AdjDet(vector &M,int &lin,int &col,int n)
{
int i=lin; //当前行.
int k=i+1; //下一行.
while(k &M,int &n) //采用引用的方式. {
srand((unsigned)time(NULL)); //此为测试用,用于随机生成行列式的值.
cout<<"请输入行列式的阶数: "; //测试用.
cin>>n; //输入阶数.
double temp=0; //中间值.
for(int i=0;i>temp; //输入值.
temp=rand()%20; //测试用,随机生成.
M.push_back(temp); //装入容器.
//cout< M; //创建一个容器,用于装元素值.
int n; //行列式的阶数.
InDet(M,n); //输入函数.
while(det.lin #include "ValDet.h"
using namespace std;
int main()
{
ValDet mycalc;
cout<