问题 E: 向量5(友元类)

题目描述

 

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

将CMatrix定义为CVector的友元类。

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

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

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

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

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

int n;
int **data;
int i, j;

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

for (i=0; i<n; i++)
  for (j=0; j<n; j++)

  cin>>data[i][j];

输入

测试次数t

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

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

n阶矩阵

m维向量

输出

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

样例输入

1 3 1 0 0 0 1 0 0 0 1 3 1 2 3

样例输出

1 2 3
代码如下:
#include<iostream>
using namespace std;
class CMatrix;//友元类的定义
class CVector{//不加括弧
    protected:
    int n;
    int *data;

    public:
    CVector(int _n){
        n=_n;
        data=new int [n];
        for(int i=0;i<n;i++) data[i]=0;
    };
    CVector(int _n,int *_data){
        n=_n;
        data=new int [n];
        for (int i=0; i<n; i++)
       
        data[i]=_data[i];
        
    }
    ~CVector(){delete data;}
    void print(){
        for(int i=0;i<n;i++)
        cout<<data[i]<<' ';
        cout<<endl;
    }
    friend class CMatrix;//友元类的定义

};
class CMatrix{
    private:
    int n;
    int **data;


    public:
    CMatrix(){};
    CMatrix(int _n,int **_data){
       n=_n;
       data=new int *[n];
       for(int i=0;i<n;i++) data[i]=new int [n]; 
       for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
        data[i][j]=_data[i][j];
    }
    CVector Multi(const CVector &V1){//涉及算法//定义友元类可以访问private和protected
        CVector sum(V1.n);
        for(int j=0;j<V1.n;j++)
        for(int i=0;i<V1.n;i++)
        sum.data[j]+=V1.data[i]*data[j][i];
        
        return sum;
        
    };
    bool mul(int m,int n){//bool函数里面或者写成   {if(m==n)return true; else return false;}
        return m==n;
    }
    ~CMatrix(){delete []data;}
};
int main(){
    int test;
    cin>>test;
    while(test--){
        int n,m;
        int **data;
        int i, j;
        cin>>n;
        data=new int*[n];  //先创建n行
        for(i=0;i<n;i++)
        { data[i]=new int[n]; }  //再创建n列

        for (i=0; i<n; i++)
        for (j=0; j<n; j++)
        cin>>data[i][j];   //动态输入二维数组
        CMatrix cm(n,data);

        cin>>m;
        int *a=new int [m];
        for(i=0;i<m;i++)
            cin>>a[i];
        CVector cv(m,a);
        
        if(cm.mul(m,n)){
            CVector cv2=cm.Multi(cv);
            cv2.print();
        }
        else cout<<"error"<<endl;
        delete []data;//记得delete
        
    }
    return 0;
    
    
}

Guess you like

Origin blog.csdn.net/weixin_49977305/article/details/121063614