使用类:vector类来模拟随机行走

其中有涉及到:名称空间,类的封装,符号重载,友元函数,但这个程序还不够完美,有些地方还有待提高。

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.实验结果:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值