C++ Exercises(十四)--解线性方程组

 帮一个朋友做的作业题,现在真是什么专业都要学编程了呀。。
复制代码
//向量类
/*
**author:phinecos
**date:7/17/2008
*/
class CVector
{
public:
    CVector(unsigned int d=0);//由向量的维数创建向量,向量元素值初始化为
    CVector(unsigned int d, double* pe);//由向量的维数和向量元素数组创建数组
    CVector(double x, double y);//由两个元素生成二维向量
    CVector(double x, double y, double z);//由三个元素生成三维向量
    CVector(CVector& v);//复制构造函数

    ~CVector();//析构函数

    CVector& operator =(const CVector& v);//重载赋值运算符
    CVector& operator +(void);//重载一元运算符+
    CVector operator +(const CVector& v) const;//重载二元运算符+
    CVector& operator -(void);//重载一元运算符-
    CVector operator -(const CVector& v) const;//重载二元运算符-
    CVector operator *(const CVector& v) const;//重载二元运算符*,表示向量的叉乘(向量积)
    double operator %(const CVector& v) const;//重载二元运算符%,表示向量的点乘(数量积)
    CVector operator *(const double& d) const;//重载二元运算符*,表示向量的数乘

    double& operator [](const unsigned int i);//重载操作符[],对指定向量元素进行操作

    unsigned int GetDegree() const;//获取向量维数
    void printElements();
    friend class CLinearEquation;

private:
    double* pElement;    //向量元素存储地址
    unsigned int nDegree;//向量的维数
    void initByZero();//初始化为
    void initByArray(double* pe);//用数组初始化
    void alloc(unsigned int n=0);//分配空间
    void reverse();//变号
    void destory();
};

复制代码

向量类实现
复制代码
class CVector;//前向声明
//矩阵类
/*
**author:phinecos
**date:7/17/2008
*/
class CMatrix
{
public:
    CMatrix(unsigned int r=0,unsigned int c=0);    //由矩阵的行数和列数创建矩阵类对象,并为矩阵元素分配存储空间,将矩阵初始化为单位矩阵;
    CMatrix(const char* pFileName);    //由矩阵存储文件名创建矩阵类对象,文件格式可参考附录,但不限于采用此格式;
    CMatrix(const CMatrix& m); //复制构造函数,由已有矩阵类对象创建新的矩阵类对象;    

    unsigned int GetRowsNum() const;//获取矩阵的行数    
    unsigned int GetColumnsNum() const;//获取矩阵的列数    

    double& operator ()(unsigned int r, unsigned int c);//重载运算符(),用于提取指定行(r)列(c)的元素值
    CMatrix& operator =(const CMatrix& m);    //重载运算符=,用于矩阵之间相互赋值    
    CMatrix& operator +() const;//重载一元运算符+,即取矩阵本身    
    CMatrix operator -() const;//重载一元运算符-,即矩阵元素取相反数    
    CMatrix operator +(const CMatrix& m) const;//重载二元运算符+,即两个矩阵求和
    CMatrix operator -(const CMatrix& m) const;//重载二元运算符-,即两个矩阵求差    
    CMatrix operator *(const CMatrix& m) const;//重载二元运算符*,即两个矩阵求积
    CMatrix operator *(const double& x) const;//重载二元运算符*,即矩阵与数相乘
    CMatrix operator *(CVector& v) const;//重载二元运算符*,即矩阵与向量相乘
    CMatrix operator /(const double& x ) const;//重载二元运算符/,即矩阵与数相除
    CMatrix operator ^(const int& t) const;//重载二元运算符^,即矩阵求t次幂
    void operator -=(const CMatrix& m);    //重载二元运算符-=,即自减运算
    void operator +=(const CMatrix& m);//重载二元运算符-=,即自加运算
    void operator *=(const double x);//重载二元运算符*=,即自乘运算(矩阵)

    CMatrix Tranpose() const;//求矩阵的转置的函数
    CMatrix Invert() const;//求矩阵的逆的函数
    void Zeros();//矩阵归零化,将当前矩阵的所有元素归零
    void Unit();//矩阵单元化,将当前矩阵转换为单位矩阵
    int AddRow(double* pe, unsigned int nr);//在矩阵的nr行位置插入一行,数据存放地址为pe,返回行标
    int AddColumn(double* pe, unsigned int nc);//在矩阵的nc列位置插入一列,数据存放地址为pe,返回列标 
    double* DeleteRow(unsigned int nr);//删除矩阵nr行,返回该行元素值(临时存储地址)
    double* DeleteColumn(unsigned int nc);//删除矩阵nc列,返回该列元素值(临时存储地址)

    friend class CLinearEquation;//声明友元类CLinearEquation
    friend class CVector;//声明友元类CVector

    //析构函数,释放存储矩阵元素的空间
    virtual ~CMatrix(void);
    //void printMatrix()const;
private:
    double* pElement;//元素存储区
    unsigned int nRow;//行数
    unsigned int nColumn;//列数
    void destroy();
    void alloc(unsigned int n=0);//分配空间
protected:
    virtual void InitFromFile(const char* pFileName);//从文件中初始化
public:
    virtual int MatOut(const char* pFileName); //将矩阵以pFileName为文件名进行文件输出
};

复制代码

矩阵类实现
复制代码
#include "matrix.h"

class CVector;
//线性方程组类
/*
**author:phinecos
**date:7/17/2008
*/
class CLinearEquation :public CMatrix
{
public:
    CLinearEquation(void);
    CLinearEquation(CMatrix& coe, CVector& con );//通过系数矩阵和常数向量创建线性方程组
    CLinearEquation(const char* pFile);//通过数据文件创建线性方程组
    CLinearEquation(unsigned int ne, unsigned int nv);//通过方程个数和未知数创建线性方程组
    ~CLinearEquation(void);

public:
    int AddVariable(double *pcoe, unsigned int pc);//为方程组增加一个变量,其系数矩阵增加一列,pcoe为增加系数地址,pc为增加系数列的序号,为最前面,默认追加在尾部,成功返回未知数个数,否则为-1
    int AddEquation(double *pcoe, double con, unsigned int pr);//为方程组增加一个方程,其系数矩阵增加一行,pcoe为增加系数地址,con为增加方程的常数项,pr为增加系数行的序号,为最前面,默认追加在尾部,成功返回方程个数,否则为-1
    int DeleteVariable(unsigned int pc);//删除方程组中第pc个未知数,并删除其系数列
    int DeleteEquation(unsigned int pr);//删除方程组中第pr个方程
    CVector Gaussian();//高斯消元法解线性方程组
    int CLinearEquation::MatOut(const char* pFileName);
public:
    CVector* Constant;//方程组的常数向量,新增成员
    //方程组系数矩阵,继承成员,不可见
    //方程组中方程个数,继承成员,矩阵行数,不可见
    //方程组中未知数个数,继承成员,矩阵列数,不可见
private:
    void InsertConstant(double num,int pos);
    void DeleteConstant(unsigned int pos);
    void InitFromFile(const char* pFileName);
};

复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/07/17/1245284.html,如需转载请自行联系原作者
上一篇:linux awk命令详解


下一篇:使用OpenCASCADE的Math功能解线性方程组