首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

谁能帮小弟我看看错在哪里

2012-03-06 
哪位高手能帮我看看错在哪里定义:向量相乘对应位置的数相乘。(v1,v2)*(v3,v4)(v1*v3,v2*v4)向量与数相乘向

哪位高手能帮我看看错在哪里
定义:
向量相乘              对应位置的数相乘。(v1,   v2)*(v3,   v4)   =   (v1*v3,   v2*v4)

向量与数相乘      向量每一个位置的数与该数相乘。(v1,   v2)*a   =   (v1*a,   v2*a)

数与向量相乘      数与向量中各维的平均数相乘。a*(v1,v2)   =   (a*v1,   a*v2)

数与数相乘          两数的普通乘法。


#include   <iostream>
#include   <cstdlib>
#include   <ctime>
#include   <string>
#include   <stdexcept>
using   namespace   std;
/*****************************************************/
class   Vector;
class   Number;

class   Math{
public:
string   toString(){return   " ";}
string   multiply(Vector   *Vval){return   " ";}
string   multiply(Number   *Nval){return   " ";}
};

class   Vector:public   Math{
public:
Vector();
int   GetVec(int   i);
virtual   string   toString();
virtual   string   multiply(Vector   &Vval);
virtual   string   multiply(Number   &Nval);
private:
int   vec[10];
};

class   Number:public   Math{
public:
Number();
int   GetNum();
virtual   string   toString();
virtual   string   multiply(Vector   &Vval);
virtual   string   multiply(Number   &Nval);
private:
int   num;
};

/*****************************************************/
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;
}
system( "pause ");
}
/****************************************************/
Vector::Vector()
{
int   temp;
for(int   i   =   0   ;   i   !=   10   ;   i++){
temp   =   rand()%20   +   1;
vec[i]   =   temp;
}
}

int   Vector::GetVec(int   i)
{
if(i   <=   9   &&   i   > =   0){
return   vec[i];
}
else{
throw   runtime_error( "i   should   be   between   0   and   9 ");


}
}

string   Vector::toString()  
{
cout < < " <Vector> ";
for(int   i   =   0   ;   i   !=   10   ;   i++){
cout < <vec[i] < < "     ";
}
cout < <endl;
return   " ";
}

string   Vector::multiply(Vector   &Vval)
{
for(int   i   =   0   ;   i   !=   10   ;   i++){
vec[i]   =   vec[i]   *   Vval.GetVec(i);
}
return   " ";
}

string   Vector::multiply(Number   &Nval)
{
for(int   i   =   0   ;   i   !=   10   ;   i++){
vec[i]   =   vec[i]   *   Nval.GetNum();
}
return   " ";
}

/**********************************/

Number::Number()
{
num   =   rand()%20   +   1;
}

int   Number::GetNum()
{
return   num;
}

string   Number::toString()
{
cout < < " <Number> ";
cout < <num < <endl;
return   " ";
}

string   Number::multiply(Vector   &Vval)
{
int   ave(0);
for(int   i   =   0   ;   i   !=   10   ;   i++){
ave   +=   Vval.GetVec(i);
}
ave   /=   10;
num   *=   ave;
return   " ";
}

string   Number::multiply(Number   &Nval)
{
num   *=   Nval.GetNum();
return   " ";
}

编译没有错误,但是没有达到预定的要求

[解决办法]
//sorry
=======
class Math{
public:
virtual string toString(){return " ";}
virtual string multiply(Vector& Vval){return " ";}
virtual string multiply(Number& Nval){return " ";}
};

[解决办法]
//楼主的错误...
//这个是以前的, 同样的功能, LZ参考下.
#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] < < ", ";
}
stream < <data[9] < < ") ";
string str;
stream> > str;
return str;
}

virtual void multiply(Math* other)
{
vector <double> vother;
other-> GetData(vother);
if (vother.size()==1) {
for (int i=0; i <10; ++i) data[i] *= vother[0];
}
else {
for (int i=0; i <10; ++i) data[i] *= vother[i];
}

}

virtual double mean()
{
double sum = 0;
for (int i=0; i <10; ++i) sum += data[i];
return sum /10;
}


virtual void GetData(vector <double> & _data)
{
for (int i=0; i <10; ++i) _data.push_back(data[i]);
}

virtual void SetData(const vector <double> & _data)
{
int _dataSize = _data.size();
for (int i=0; i < min(10, _dataSize); ++i) data[i] = _data[i];
}

private:

double data[10];
};


int 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;
}

system( "pause ");
}

[解决办法]
其实是这样的,cout < < "乘数: " < < p[i]-> toString() < < endl;
< <运算符肯定是从左像右进行,但是在执行之前必须确保 < <运算符后面有参数,所以先要获得函数的返回值,就是说函数是最先执行的

热点排行