【id:116】【20分】E. 向量5(友元类)

题目描述

(1)在向量CVector类的代码上,定义n阶矩阵类CMatrix,包含私有数据成员data存储矩阵数据,n存储矩阵阶数。

(2)将CMatrix定义为CVector的友元类。

(3)为CMatrix添加成员函数:CVector multi(const CVector &v1),计算n阶矩阵与n维向量v1的乘积。

(4)为CMatrix添加成员函数,判定矩阵与向量v1是否可计算乘积。

(5)为CMatrix添加需要的构造函数、析构函数和其它成员函数。

主函数输入数据,测试矩阵与向量的乘积。

动态创建n阶矩阵示例代码如下:

int n;
int** data;
int i, j;
cin >> n;
// 先创建n行
data = newint* [n];
// 再创建n列for (i = 0; i < n; i++)
{

    data[i] = newint[n];

}
// 打印矩阵for (i = 0; i < n; i++)
{
    for (j = 0; j < n; j++)
    {
        cin >> data[i][j];
    }

}

输入

测试次数t

对每组测试数据,格式如下

第一行,矩阵阶数n 向量维数m

n阶矩阵

m维向量

输出

对每组测试数据,若矩阵与向量不能计算乘积,输出error;否则输出计算结果

样例查看模式

正常显示查看格式

输入样例1 <-复制

输出样例1

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
class CStudent;//最好都声明一下,避免遇到其他的麻烦
class CMatrix;
class CVector
{
private:
    int* data;//存储n维向量
    int n; //向量维数。
    //添加私有静态成员sum,在初始化对象的同时,统计所有对象的n维向量和sum。
    static int sum;
public:
    friend class CMatrix;//友元类
    //(1)无参构造函数,设置n=5,data的数据分别为0,1,2,3,4;
    CVector()
    {
        n = 5;
        data = new int[5];
        for (int i = 0; i < 5; i++)
        {
            data[i] = i;
        }
    }
    //(2)构造函数,用虚参n1和数组a初始化n和data的数据;
    CVector(int n1, int* a)
    {
        n = n1;
        data = new int[n];
        for (int i = 0; i < n; i++)
        {
            data[i] = a[i];
            sum += a[i];
        }
    }
    //(3)输出函数,按格式输出n维向量的值;
    void print()
    {
        for (int i = 0; i < n-1; i++)
        {
            cout << data[i] << " ";
        }
        cout << data[n - 1];
    }
    //(4)析构函数。
    ~CVector()
    {
        delete[] data; 
    }
    friend CVector add(const CVector v1, const CVector v2);
    CVector(CVector& c)
    {
        this->n = c.n;
        data = new int[n];
        for (int i = 0; i < n; i++)
        {
            data[i] = c.data[i];
        }
    }
    static int getsum();
    static void setsum();
    //增加成员函数float Average(),计算n维向量的平均值并返回。
    float Average()
    {
        float av = 1.0 * sum / this->n;
        return av;
    }
    void set(int n1, int* a)
    {
        n = n1;
        data = new int[n];
        for (int i = 0; i < n; i++)
        {
            data[i] = a[i];
            sum += a[i];
        }
    }
};
int CVector::sum = 0;
int CVector::getsum()
{
    return sum;
}
void CVector::setsum()
{
    sum = 0;
}
CVector add(const CVector v1, const CVector v2)
{
    int* a = new int[v1.n];
    for (int i = 0; i < v1.n; i++)
    {
        a[i] = v1.data[i] + v2.data[i];
    }
    CVector v3(v1.n, a);
    return v3;
}
//在题目向量1的代码上添加类CVector的友元函数add,计算两个向量的和(对应分量相加)。
//定义CStudent类,私有数据成员为:
class CStudent
{
private:
    string name;
    CVector score;
public:
    CStudent() {};
    CStudent(string name1, int n1, int* a)
    {
        name = name1;
        score.set(n1, a);
    }
    void print()
    {
        cout << name << " ";
        score.print();
        cout << ' ' << fixed << setprecision(2) << score.Average() << endl;
        score.setsum();
    }
};
//string name;  // 姓名
//CVector score;  // n个成绩
//(1)在向量CVector类的代码上,定义n阶矩阵类CMatrix,
//包含私有数据成员data存储矩阵数据,n存储矩阵阶数。
class CMatrix
{
private:
    int n;
    int** data;
public:
    CMatrix() {};
    CMatrix(int n1, int** a)
    {
        int i, j;
        n = n1;
        // 先创建n行
        data = new int* [n];
        // 再创建n列
        for (i = 0; i < n; i++)
        {

            data[i] = new int[n];

        }
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                data[i][j] = a[i][j];
            }

        }
    }
    ~CMatrix()
    {
        delete[]data;
    }
    //CVector multi(const CVector &v1),计算n阶矩阵与n维向量v1的乘积。
    CVector multi(const CVector& v1)
    {
        //拿一个数组来存储得到的结果
        int* w = new int[n];
        for (int i = 0; i < n; i++)
        {
            w[i] = 0;
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)//矩阵的行乘以向量的列
            {
                w[i] += data[i][j] * v1.data[j];
            }
        }
        CVector c(n, w);
        return c;
    }
    //(4)为CMatrix添加成员函数,判定矩阵与向量v1是否可计算乘积。
    bool ifright(const CVector& v1)
    {
        if (n == v1.n)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        int** data;
        int i, j;
        cin >> n;
        // 先创建n行
        data = new int* [n];
        // 再创建n列
        for (i = 0; i < n; i++)
        {

            data[i] = new int[n];

        }
        // 打印矩阵
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                cin >> data[i][j];
            }

        }
        CMatrix c1(n, data);
        int n2;
        cin >> n2;
        int* a = new int[n2];
        for (int i = 0; i < n2; i++)
        {
            cin >> a[i];
        }
        CVector v1(n2, a);
        if (c1.ifright(v1))
        {
            c1.multi(v1).print();
        }
        else
        {
            cout << "error" << endl;
        }
    }
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现有两个类 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现的矩阵类 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator+=(const CVector & );//重载+=算符,向量加上向量 CVector operator-(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator-=(const CVector & );//重载+=算符,向量加上向量 CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna CVector& operator+=(const double α);//重载+=算符,向量加上实数alpha BOOL operator==(const CVector &)const;//重载==运算符 BOOL operator!=(const CVector &)const;//重载!=运算符 CMatrix //构造函数 CMatrix(); virtual ~CMatrix(); CMatrix(const CMatrix&);//拷贝构造函数 CMatrix(const size_t& n);//产生n阶单位阵 CMatrix(const size_t& nrow, const size_t& ncol);// CMatrix(const size_t& nrow, const size_t& ncol,const CVector& xdata);//产生nrow行,ncol列矩阵数据由xdata初始化 CMatrix(const size_t& nrow, const size_t& ncol,const double*const pData); CMatrix(const size_t& nrow, const size_t& ncol,const float* const pData); CMatrix(const size_t& nrow, const size_t& ncol,const int* const pData); //公开的成员函数 double At(const size_t& xr,const size_t& xc) const;//这个只能作为右值 CMatrix Trans()const;//A.T()返回矩阵A的转置副本 CVector diag()const;//矩阵上三角化后的对角向量//以此求矩阵的秩,矩阵的行列式等 double det()const;//求矩阵行列式 size_t rank()const;//矩阵的秩 CMatrix Inv()const;//求逆矩阵 inline BOOL IsNullMatrix()const{ return (BOOL)(m_nRowlen==0 || m_nCollen == 0);};//是否是空矩阵 BOOL IsSingularMatrix()const;//是否是奇异矩阵//即行列式为0 友函数 //科学计数法输出//想看较精确的数据的时候 friend void void PrintOut(const CMatrix& M,const size_t& nprecision = 6,std::ostream& os = std::cout); //产生的随机方阵,一般会是非异阵,供测试用 friend CMatrix randMatrix(const size_t &uSize;,int MAX);//随机产生n阶的方阵 //--------------------------重载部-Overloaded Part---------------------------------- CMatrix& operator=(const CMatrix &);//重载=赋值运算符 double& operator()(size_t xr,size_t xc);//重载()运算符,A(i,j)即矩阵A的i行j列的元素, friend std::ostream & operator<<(std::ostream & ,const CMatrix &);//重载<<,可用cout输出矩阵 friend std::ostream & operator<<(std::ostream & ,const CVector&);//重载<<,可用cout输出向量 friend std::istream & operator>>(std::istream & CMatrix &);//重载>>,可用cin输入矩阵 CMatrix operator*(const double α)const;//重载*运算符,矩阵乘以实数alpha CVector operator*(const CVector &)const;//重载*运算符,矩阵乘以向量 CMatrix operator*(const CMatrix &)const;//重载*运算符,矩阵相乘 CMatrix& operator*=(const CMatrix &);//重载*=运算符 CMatrix operator^(const int α)const;//重载^幂运算符,A^alpha,alpha可以为负整数 CMatrix operator+(const CMatrix &)const;//重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==(const CMatrix &)const;//重载==运算符,判断矩阵是否相等 BOOL operator!=(const CMatrix &)const;//重载!=运算符,判断矩阵是否不相等 CVector operator/(const CVector &)const;//重载/除运算符,向量左除矩阵,求Ax=b的x向量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值