#C++PrimerPlus# Chapter11_Exersice2_randwalk_v3

修改Example13,Example14中的类定义和成员函数定义。使在公有借口不变的情况下,不再存储极坐标下的坐标值。

在Example13,Example14,Example15的基础上修改。因公有借口不变,所以randwalk.cpp不用做任何修改。

vector.h,vector.cpp修改后的程序清单如下:


 

// vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cmath>

namespace VECTOR
{
    class Vector
    {
    public:
        enum Mode {RECT, POL};
    private:
        double x;
        double y;
        Mode mode;
    public:
        Vector();
        Vector(double n1, double n2, Mode = RECT);
        void reset(double n1, double n2, Mode = RECT);
        ~Vector();
        double xval() const {return x;}
        double yval() const {return y;}
        double magval() const {return sqrt(x * x + y * y);}
        double angval() const {return atan2(y, x);}
        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;
        friend Vector operator*(double n, const Vector& a);
        friend std::ostream& operator<<(std::ostream& os, const Vector& v);
    };
}

#endif


 

// vector.cpp
#include <iostream>
#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);

    Vector::Vector()
    {
        x = y = 0.0;
    }

    Vector::Vector(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
        {
            x = n1;
            y = n2;
        }
        else if (form == POL)
        {
            x = n1 * cos(n2);
            y = n1 * sin(n2);
        }
    }

    void Vector::reset(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
        {
            x = n1;
            y = n2;
        }
        else if (form == POL)
        {
            x = n1 * cos(n2);
            y = n1 * sin(n2);
        }
    }

    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(n * x, n * 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) = (" << sqrt(v.x * v.x + v.y * v.y)
               << ", " << atan2(v.y, v.x) * Rad_to_deg << ")";
        return os;
    }
}


 

randwork.cpp不变,结束。

 

posted @ 2013-05-04 18:06  庄懂  阅读(177)  评论(0编辑  收藏  举报