[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;
}

 

posted @ 2022-08-11 22:13  Fionaa  阅读(76)  评论(0)    收藏  举报