这个C++有关问题可解么
这个C++问题可解么?
定义:
向量相乘 à 对应位置的数相乘。 (v1, v2)*(v3, v4) = (v1*v3, v2*v4)
向量与数相乘 à 向量每一个位置的数与该数相乘。 (v1, v2)*a = (v1*a, v2*a)
数与向量相乘 à 数与向量中各维的平均数相乘。 a*(v1,v2) = (a*v1, a*v2)
数与数相乘 à 两数的普通乘法。
请提供Math, Vector, Number的类声明和定义,使得任意向量或数可以相乘。测试函数如下,直接使用请勿修改。
注:假设Vector为10维向量。用随机数生成所需要的数(包括Vector的每一维或Number的值)。
void main(){
srand((unsigned)time(NULL));
Vector a,b;
Number c,d;
Math* p[2]={&a, &c};
for (int i = 0; i < 2; i++)
{
//与向量相乘
cout < < "乘数: " < < p[i]-> toString() < < endl;
cout < < "被乘数: " < < b.toString() < < endl;
p[i]-> multiply(&b); //p[i]=p[i]*b;
cout < < "积: " < < p[i]-> toString() < < endl;
cout < < "--------------- " < < endl;
//与实数相乘
cout < < "乘数: " < < p[i]-> toString() < < endl;
cout < < "被乘数: " < < d.toString() < < endl;
p[i]-> multiply(&d); //p[i]=p[i]*d;
cout < < "积: " < < p[i]-> toString() < < endl;
cout < < "--------------- " < < endl;
}
}
------解决方案--------------------
#include <iostream>
#include <string>
#include <strstream>
#include <ctime>
#include <vector>
using namespace std;
class Math
{
public:
Math(){};
~Math(){};
virtual string toString(){ return " "; }
virtual void multiply(Math* other) {}
virtual double mean() {return 0;}
virtual void GetData(vector <double> & _data){}
virtual void SetData(const vector <double> & _data) {}
};
class Number:public Math
{
public:
Number() { data = rand();}
~Number(){}
virtual string toString()
{
strstream stream;
stream < <data;
string str;
stream> > str;
return str;
}
virtual void multiply(Math* other)
{
data *= other-> mean();
}
virtual double mean() { return data;}
double GetData() { return data;}
void SetData( double _data) { data = _data;}
virtual void GetData(vector <double> & _data)
{ _data.push_back(data);}
virtual void SetData(const vector <double> & _data)
{if (_data.size()> 0) data = _data[0];}
private:
double data;
};
class Vector:public Math
{
public:
Vector()
{ for (int i=0; i <10; ++i) data[i] = rand();}
~Vector(){}
virtual string toString()
{
strstream stream;
stream < < "( ";
for (int i=0; i <9; ++i) {
stream < <data[i] < < ", ";
}
定义:
向量相乘 à 对应位置的数相乘。 (v1, v2)*(v3, v4) = (v1*v3, v2*v4)
向量与数相乘 à 向量每一个位置的数与该数相乘。 (v1, v2)*a = (v1*a, v2*a)
数与向量相乘 à 数与向量中各维的平均数相乘。 a*(v1,v2) = (a*v1, a*v2)
数与数相乘 à 两数的普通乘法。
请提供Math, Vector, Number的类声明和定义,使得任意向量或数可以相乘。测试函数如下,直接使用请勿修改。
注:假设Vector为10维向量。用随机数生成所需要的数(包括Vector的每一维或Number的值)。
void main(){
srand((unsigned)time(NULL));
Vector a,b;
Number c,d;
Math* p[2]={&a, &c};
for (int i = 0; i < 2; i++)
{
//与向量相乘
cout < < "乘数: " < < p[i]-> toString() < < endl;
cout < < "被乘数: " < < b.toString() < < endl;
p[i]-> multiply(&b); //p[i]=p[i]*b;
cout < < "积: " < < p[i]-> toString() < < endl;
cout < < "--------------- " < < endl;
//与实数相乘
cout < < "乘数: " < < p[i]-> toString() < < endl;
cout < < "被乘数: " < < d.toString() < < endl;
p[i]-> multiply(&d); //p[i]=p[i]*d;
cout < < "积: " < < p[i]-> toString() < < endl;
cout < < "--------------- " < < endl;
}
}
------解决方案--------------------
#include <iostream>
#include <string>
#include <strstream>
#include <ctime>
#include <vector>
using namespace std;
class Math
{
public:
Math(){};
~Math(){};
virtual string toString(){ return " "; }
virtual void multiply(Math* other) {}
virtual double mean() {return 0;}
virtual void GetData(vector <double> & _data){}
virtual void SetData(const vector <double> & _data) {}
};
class Number:public Math
{
public:
Number() { data = rand();}
~Number(){}
virtual string toString()
{
strstream stream;
stream < <data;
string str;
stream> > str;
return str;
}
virtual void multiply(Math* other)
{
data *= other-> mean();
}
virtual double mean() { return data;}
double GetData() { return data;}
void SetData( double _data) { data = _data;}
virtual void GetData(vector <double> & _data)
{ _data.push_back(data);}
virtual void SetData(const vector <double> & _data)
{if (_data.size()> 0) data = _data[0];}
private:
double data;
};
class Vector:public Math
{
public:
Vector()
{ for (int i=0; i <10; ++i) data[i] = rand();}
~Vector(){}
virtual string toString()
{
strstream stream;
stream < < "( ";
for (int i=0; i <9; ++i) {
stream < <data[i] < < ", ";
}