热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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,如需转载请自行联系原作者

推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
望空心vn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有