c++学习日记之使用类来模拟随机漫步

来源:互联网 发布:淘宝下载安装2017官方 编辑:程序博客网 时间:2024/04/25 00:21
本文主要介绍运算符重载和友元的类设计,通过定义一个矢量类来模拟随机漫步。矢量类分两种模式,直角坐标模式和极坐标模式。该函数允许用户选择行走的距离和补偿。该程序用一个变量表示位置,并报告到达指定距离住所需的部署。
本文的重点是是理解运算符重载和友元函数
代码如下:
vector.h文件
#ifndef VECTOR_H_#define VECTOR_H_#include<iostream>namespace VECTOR{class Vector{public:enum Mode{RECT,POL};// RECT  for rectangular ,POL for ploar modesprivate:double x;   // horizontal valuedouble y;   // vertical valuedouble mag; // length of vectordouble ang; // direction of vector in degreesMode mode;  //RECT or POL//private methods for setting valuesvoid 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 valuedouble yval() const {return y;}  //report y valuedouble magval() const {return mag;}// report magnitudedouble angval() const {return ang;}//report anglevoid polar_mode();  //set mode to polvoid rect_mode();   // set mode to rect//operator overloadingVector operator + (const Vector &b) const;Vector operator - (const Vector &b) const;Vector operator * (double n) const;Vector operator - () const;//friendsfriend 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"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 yvoid Vector::set_mage(){mag=sqrt(x * x + y * y);}void Vector::set_ang(){if(x==0.0&&y==0.0)ang=0.0;elseang=atan2(y,x);}//set x,y from polar coordinatevoid Vector::set_x(){x=mag*cos(ang);}void Vector ::set_y(){y=mag*sin(ang);}//public methodsVector::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\n";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\n";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) = (" <<v.x << ", " << v.y << ")";}else if (v.mode==Vector::POL){os << "(m,a)= (" <<v.mag << ", " << v.ang << ")";}elseos << "Vector object maod is invalid";return os;}}


main()函数
#include <iostream>#include <cstdlib>#include<ctime>#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()<target){direction=rand()%360;step.reset(dstep,direction,Vector::POL);result = result + step;steps++;}cout << "after " << steps << "steps,the subject has the following location:\n";cout <<result << endl;result.polar_mode();cout << "or\n" << result <<endl;cout << "average outward distance per step = " << result.magval()/steps << endl;steps=0;result.reset(0.0,0.0);cout << "enter target distance(q to quit):";}cout << "byte\n";cin.clear();while(cin.get()!='\n')continue;return 0 ;}


运行结果如下:
                                             
0 0
原创粉丝点击