题目描述
(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;
}