矢量类例子
//*如果方法得到一个新的对象 考虑用构造函数去完成
ep:
vector Vector::operator + (const Vector & b) const
{
return Vector(x+b.x,y+b.y); //返回一个构造函数实例
}
//*ctime
包含time()原型 time(0)当前时间
//*rand()通过初始种子活的随机数 srand()可以覆盖默认种子
///////////////////////////////////////
///////////////////mian.cpp////////////
#include <iostream>
#include <cstdlib> //rand() stand()
#include <ctime>
#include "vector.h"
int main(void)
{
using namespace std;
using VECTOR::Vector;
srand(int(time(0))); //seed random-num
double direction;
Vector step;
Vector resault(0.0,0.0);
unsigned long steps=0;
double target;
double dstep;
cout<<"enter target distance(q to quit):";
while(cin>>target)
{
cout<<"enter step length: ";
if (!(cin>>dstep))
break;
while(resault.magval()<target)
{
direction=rand()%360;
step.set(dstep,direction,'p');
resault=resault+step;
steps++;
}
cout<<"after "<<steps<<" steps, the subject "
"has the following location: \n";
cout<<resault<<endl;
resault.polar_mode();
cout<<"or\n"<<resault<<endl;
cout<<"average outward distance per step= "
<<resault.magval()/steps<<endl;
steps=0;
resault.set(0.0,0.0);
cout<<"enter target distance (q to quit): ";
}
cout<<"bye!\n";
return 0;
}
///////////////////////////////////////////
///////////////vector.h/////////////////////
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR
{
class Vector
{
private:
double x;
double y;
double mag;
double ang;
char mode;
//for seting val
void set_mag();
void set_ang();
void set_x();
void set_y();
public:
Vector();
Vector(double n1,double n2,char form='r');
void set(double n1,double n2,char form='r');
~Vector();
double xval() const {return x;}
double yval() const {return y;}
double magval() const {return mag;}
double angval() const {return ang;}
void polar_mode();
void rect_mode();
//operatir
Vector operator+(const Vector & b) const;
Vector operator-(const Vector & b) const;
Vector operator-() const;
Vector operator*(double n) const;
//friend
friend Vector operator * (double n,const Vector & a);
friend std::ostream & operator << (std::ostream & os,const Vector & v);
};
}
#endif
///////////////////////////////////////////////////
////////////////////vector.cpp/////////////////////
#include <cmath>
#include "vector.h"
#define Rad_to_deg 2.36
namespace VECTOR
{
//for seting val
void Vector::set_mag()
{
mag=sqrt(x*x+y*y);
}
void Vector::set_ang()
{
if (x==0.0 && y==0.0)
ang=0.0;
else
ang=atan2(y,x);
}
void Vector::set_x()
{
x=mag*cos(ang);
}
void Vector::set_y()
{
y=mag*sin(ang);
}
Vector::Vector()
{
x=y=mag=ang=0.0;
mode='r';
}
Vector::Vector(double n1,double n2,char form)
{
mode=form;
if (form=='r')
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if (form=='p')
{
mag=n1;
ang=n2/Rad_to_deg;
set_x();
set_y();
}
else
{
std::cout<<"incorrect 3rd argument to Vector()--";
std::cout<<"Vector set to 0\n";
x=y=mag=ang=0.0;
mode='r';
}
}
void Vector::set(double n1,double n2,char form)
{
mode=form;
if (form=='r')
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if (form=='p')
{
mag=n1;
ang=n2/Rad_to_deg;
set_x();
set_y();
}
else
{
std::cout<<"incorrect 3rd argument to Vector()--";
std::cout<<"Vector set to 0\n";
x=y=mag=ang=0.0;
mode='r';
}
}
Vector::~Vector()
{
}
void Vector::polar_mode()
{
mode='p';
}
void Vector::rect_mode()
{
mode='r';
}
//operatir
Vector Vector::operator + (const Vector & b) const
{
return Vector(x+b.x,y+b.y);
}
Vector Vector::operator-(const Vector & b) const
{
return Vector(x-b.x,y-b.y);
}
Vector Vector::operator-() const
{
return Vector(-x,-y);
}
Vector Vector::operator*(double n) const
{
return Vector(n*x,n*y);
}
//friend
Vector operator * (double n,const Vector & a)
{
return a*n;
}
std::ostream & operator << (std::ostream & os,const Vector & v)
{
if (v.mode=='r')
os<<"(x,y)=("<<v.x<<","<<v.y<<")";
else if (v.mode=='p')
{
os<<"(m,a)=("<<v.mag<<","<<v.ang*Rad_to_deg<<")";
}
else
os<<"Vector object mode is invalid";
return os;
}
}