c++学習日記の使用クラスランダムウォークをシミュレートする

5525 ワード

                  ,                。        ,            。                 。            ,               。
                   
vector.h  
#ifndef VECTOR_H_
#define VECTOR_H_
#include
namespace VECTOR
{
	class Vector
	{
	public:
		enum Mode{RECT,POL};
		// RECT  for rectangular ,POL for ploar modes
	private:
		double x;   // horizontal value
		double y;   // vertical value
		double mag; // length of vector
		double ang; // direction of vector in degrees
		Mode mode;  //RECT or POL
		//private methods for setting values
		void set_mage();
		void set_ang();
		void set_x();
		void set_y();
	public:
		Vector();
		Vector(double n1,double n2,Mode form = RECT);
		void reset(double n1,double n2,Mode form = RECT);
		~Vector();
		double xval() const {return x;}  //report x value
		double yval() const {return y;}  //report y value
		double magval() const {return mag;}// report magnitude
		double angval() const {return ang;}//report angle
		void polar_mode();  //set mode to pol
		void rect_mode();   // set mode to rect
		//operator overloading
		Vector operator + (const Vector &b) const;
		Vector operator - (const Vector &b) const;
		Vector operator * (double n) const;
		Vector operator - () const;
		//friends
		friend Vector operator * (double n,const Vector &a);
		friend std::ostream & operator <
vector.cpp  
#include
#include"vector.h"
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
namespace VECTOR
{
	const double Rad_to_deg = 45.0/atan(1.0);//should be about 57.2957795130823
	//private methods
	//calculates magnitude from x and y
	void Vector::set_mage()
	{
		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);
	}
	//set x,y from polar coordinate
	void Vector::set_x()
	{
		x=mag*cos(ang);
	}
	void Vector ::set_y()
	{
		y=mag*sin(ang);
	}
	//public methods
	Vector::Vector()
	{
		x = y = mag = ang = 0.0;
		mode=RECT;
	}
	Vector::Vector(double n1,double n2,Mode form)
	{
		mode = form;
		if(form==RECT)
		{
			x=n1;
			y=n2;
			set_mage();
			set_ang();
		}
		else if(form==POL)
		{
			mag=n1;
			ang=n2;
			set_x();
			set_y();
		}
		else
		{
			cout << "incorrect 3rd argument to vector()---";
			cout << "vector set to 0
"; x=y=mag=ang=0.0; mode=RECT; } } void Vector::reset(double n1,double n2,Mode form) { mode = form; if(form==RECT) { x=n1; y=n2; set_mage(); set_ang(); } else if(form==POL) { mag=n1; ang=n2; set_x(); set_y(); } else { cout << "incorrect 3rd argument to vector()---"; cout << "vector set to 0
"; x=y=mag=ang=0.0; mode=RECT; } } Vector::~Vector() { } void Vector::polar_mode() { mode = POL; } void Vector::rect_mode() { mode = RECT; } 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*(double n) const { return Vector(n*x,n*y); } Vector Vector::operator - () const { return Vector(-x,-y); } Vector operator *(double n,const Vector &a) { return a*n; } std::ostream & operator << (std::ostream &os,const Vector &v) { if (v.mode==Vector::RECT) { os << "(x,y) = (" <
main()  
#include 
#include 
#include
#include "vector.h"
int main()
{
	using namespace std;
	using VECTOR::Vector;
	srand(time(0));
	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)";
	while (cin >> target)
	{
		cout << "enter step length:";
		if(!(cin>>dstep))
			break;
		while(result.magval()