题目描述
在向量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;
}