vector.h
#ifndef PRO1_VECTOR_H#define PRO1_VECTOR_H#include <iostream>using namespace std;namespace VECTOR{ class Vector { private: double x; double y; double mag; double ang; char mode; // 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'); ~Vector(); void set(double n1, double n2, char form = 'r'); 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(); // 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 ostream &operator << (ostream & os, const Vector & vector); };}#endif //PRO1_VECTOR_H
vector.cpp
#include "vector.h"#include <cmath>using std::sin;using std::cos;using std::atan2;using std::cout;using std::ostream;namespace VECTOR{ const double Rad_to_deg = 57.2957795130823; // private methods // calculates magnitude from x and y 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{ cout << "Incorrect 3rd argument to Vector()-- "; 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{ cout << "Incorrect 3rd argument to Vector()-- "; 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';} Vector Vector::operator+(const VECTOR::Vector &b) const { return Vector(x + b.x, y + b.y); } Vector Vector::operator-(const VECTOR::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; } ostream & operator<< (ostream & os, const Vector & vector){ if (vector.mode == 'r') { os << "(x,y) = " << vector.x << ", " << vector.y ; } else if (vector.mode == 'p') { os << "(m, a) = " << vector.mag << ", " << vector.ang * Rad_to_deg ; } else os << "Vector object mode is invalid"; return os; }}
使用Vector类模拟随机行走
#include <iostream>#include <cstdlib>#include "module4/vector.h"using namespace std;// 使用Vector类模拟随机行走void randwalk(){ using VECTOR::Vector; srand(time(0)); double direction; Vector step; Vector result(0.0, 0.0); unsigned long steps = 0; double dstep; double target; 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.set(dstep, direction, 'p'); 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.set(0.0, 0.0); cout << "Enter target distance (q to quit): "; } cout << "Bye!\n";}int main() { randwalk(); return 0;}