行列式求值(化为对角式)
采用的是多文件编译,作者环境是 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 &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<