[C++ Primer Plus] 第11章、使用类——(一)程序清单
程序清单11.13~11.15(Vector实现矢量操作:模拟随机漫步)
vector.h
//头文件vector.h 类定义 #ifndef VECTOR_H_ #define VECTOR_H_ #include<iostream> namespace VECTOR { class Vector { public: enum Mode { RECT, POL }; private: double x; double y; double mag; double ang; Mode mode; void set_mag(); 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; } double yval() const { return y; } double magval() const { return mag; } double angval() const { return ang; } void polar_mode(); void rect_mode(); 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
vector.cpp
#include "vector.h" //包含#include<iostream> #include<cmath> 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); 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 = RECT; } Vector::Vector(double n1, double n2, Mode form) { mode = form; if (form == RECT) { x = n1; y = n2; set_mag(); set_ang(); } else if (form == POL) { mag = n1; ang = n2; set_x(); set_y(); } else { cout << "不正确!vector设置为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_mag(); set_ang(); } else if (form == POL) { mag = n1; ang = n2 / Rad_to_deg; set_x(); set_y(); } else { cout << "不正确!vector设置为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-() const { return Vector(-x, -y); } Vector Vector::operator*(double n) const { return Vector(x *n, y*n); } //friends 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*Rad_to_deg << ")"; else os << "Vector object mode is invalid."; return os; } }
main.cpp
#include<iostream> #include "vector.h" #include<cstdlib> //包含rand()、srand() #include<ctime> //包含time() int main() { using namespace std; using VECTOR::Vector; //using声明 /*给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数。 因为电脑取随机数是伪随机,只要种子一样,则取出来的数一定一样。 这里用time(0)这个内函数,则是返回了当前的时间值,这样将使得种子为一个不固定的数,这样产生的随机数就不会每次执行都一样了 srand()就是给rand()提供种子seed。如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的。*/ 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的值是0-359中的一个随机数 direction = rand() % 360; step.reset(dstep, direction, Vector::POL); result =result + step; steps++; } cout << "After " << step << " steps,the subject has the following location:\n"; cout << result << endl; result.polar_mode(); cout << " or\n" << result << endl; cout << "Average outword distance per step = " << result.magval() / steps << endl; steps = 0; result.reset(0.0, 0.0); cout << "Enter target distance (q to quit): "; } cout << "Bye!\n"; cin.clear(); while (cin.get() != '\n') continue; system("pause"); return 0; }


浙公网安备 33010602011771号