其中有涉及到:名称空间,类的封装,符号重载,友元函数,但这个程序还不够完美,有些地方还有待提高。
1. vector.h文件
#ifndef VECTOR_H_
#define VECTOR_H_
#include<iostream>
class vector
{
private:
double x;
double y;
double mag;//length of vector
double ang;//direction of vector
char mode;//'r'=rectangular,'p'=polar
//private methods for setting values
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;}//report x value
double yval()const {return y;}
double magval()const{return mag;}//report magnitude
double angval()const{return ang;}
char modeval()const{return mode;}
void polar_mode();//set mode to 'p'
void rect_mode();
//operator overloading
vector operator +(const vector &b)const;
vector operator -(const vector &b)const;
vector operator -()const;
vector operator*(double n)const;
//friends
friend vector operator*(double n,const vector &a);
friend std::ostream &operator<<(std::ostream & os,const vector &v);
};
#endif
2. vector.cpp
#include "vector.h"
#include <cmath>
#include <string>
using namespace std;
const double Rad_to_deg=57.2957795130823;
void vector::set_x()
{
x=mag*cos(ang);
}
void vector::set_y()
{
y=mag*sin(ang);
}
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);
}
vector::vector()
{
x=y=mag=ang=0.0;
mode='r';
}
vector::vector(double n1,double n2,char form)
{
mode=form;
if(mode='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
{
cout<<"Incorrect 3rd argument to vector()--";
cout<<"vector set to 0"<<endl;
x=y=mag=ang=0.0;
mode='r';
}
}
void vector::set(double n1,double n2,char form)
{
mode=form;
if(mode=='r')
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if (mode=='p')
{
mag=n1;
ang=n2/Rad_to_deg;
set_x();
set_y();
}
else
{
cout<<"Incorrect 3rd argument to vector()--";
cout<<"vector set to 0"<<endl;
x=y=mag=ang=0.0;
mode='r';
}
}
vector::~vector()
{
}
void vector::polar_mode()
{
mode='p';
}
void vector::rect_mode()
{
mode='r';
}
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);
}
vector operator*(double n,const vector &a)
{
return a*n;
}
std::ostream & operator<<(std::ostream &os,const vector &v)
{
if(v.modeval()=='r')
os<<"(x,y)=("<<v.xval()<<","<<v.yval()<<")";
else if(v.modeval()=='p')
{
os<<"(m,a)=("<<v.magval()<<","<<v.angval()*Rad_to_deg<<")";
}
else
os<<"vector object mode is invalid";
return os;
}
3.randwalk.cpp
#include "vector.h"
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
srand(time(0));//seed random-number generator
double direction;
vector step;
vector result(0.0,0.0);
unsigned long steps=0;//总共走的步数
double target;//设置的目标距离
double dstep;//迈出的距离
cout<<"Enter target distance(q to quit):"<<endl;
while(cin>>target)
{
cout<<"Enter step length:"<<endl;//输入步长
cin>>dstep;
if(0==dstep)
break;
while(result.magval()<target)
{
direction=rand()%360;
/* cout<<"direction="<<direction<<endl;*/
step.set(dstep,direction,'p');
result=result+step;
steps++;
}
cout<<"After "<<steps<<" steps,the subject has the following location:"<<endl;
cout<<result<<endl;
result.polar_mode();
cout<<"or\n"<<result<<endl;
/*cout<<"steps="<<steps<<endl;*/
cout<<"Average outward distance per step="<<result.magval()/steps<<endl;
steps=0;
result.set(0.0,0.0);
cout<<"Enter target distance(q to quit):"<<endl;
}
cout<<"Bye!\n";
return 0;
}
4.实验结果: