对 Vector 类的头文件(程序清单 11.13)和实现文件(程序清单 11.14)进行修改,
使其不再存储矢量的长度和角度,而是在 magval()和 angval()被调用时计算它
们。应保留公有接口不变(公有方法及其参数不变),但对私有部分(包括一些私有方
法)和方法实现进行修改。然后,使用程序清单 11.15对修改后的版本进行测试,结果应该与以前相同,因为 Vector 类的公有接口与原来相同。
//练习11-2;
#ifndef VECTOR_H_
#define VECTOR_H_
#include<iostream>
namespace VECTOR
{
class Vector
{
public:
//坐标类型,直角坐标,极坐标
enum Mode { RECT, POL };
private:
double x; //直角坐标x方向坐标
double y; //直角坐标方向坐标
Mode mode; //直角坐标,极坐标模式选择
void _convertPolarToRect(double length,double angle);
void _converRectToPolar(double& length, double& angle)const;
public:
explicit Vector(double x = 0, double y = 0, Mode form = RECT);//用默认值减少无参的构造函数的编写
void reset(double x = 0, double y = 0, Mode form = RECT); //用默认值减少无参的多态的的编写
double xval()const { return x; } //report x val
double yval()const { return y; } //report y val
double magVal()const; //report magnitude
double angval()const; //report angle
void polar_mode(); //set mode to POL
void rect_mode(); //set mode to RECT
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
#if 1
//vect.cpp == methods for the Vector class
//练习11-2;
#include<cmath>
#include"vector.h" //includes<iostream>
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
using std::endl;
namespace VECTOR
{
//////////////////////////////////////////
//非成员辅助函数和常量
/////////////////////////////////////////
const double Rad_to_deg = 45.0 / atan(1.0);
//should be about 57.2957795130823
static double converRatToDeg(double rad)
{
return rad * Rad_to_deg;
}
static double converDegToRad(double deg)
{
return deg / Rad_to_deg;
}
////////////
//私有函数//
void Vector::_convertPolarToRect(double length, double angle)
{
x = length * cos(angle);
y = length * sin(angle);
}
void Vector::_converRectToPolar(double& length, double& angle)const
{
length = sqrt(x * x+ y * y);
angle = (0 == x&& 0 ==y) ? 0 : atan2(y, x);
}
//////////////////////////////////////////
//公有函数和成员变量
/////////////////////////////////////////
//x,y对应直角坐标x,y,or 极坐标length,angle
Vector::Vector(double x, double y, Mode form)
{
mode = form;
if (form == RECT)
{
this->x = x;
this->y = y;
}
else if (form == POL)
{
//用x,y转换为极坐标length,angle
_convertPolarToRect(x, converDegToRad(y));
}
else
{
;
}
}
double Vector::magVal()const
{
double length, angle;
_converRectToPolar(length, angle);
return (length);
}
double Vector::angval()const
{
double length, angle;
_converRectToPolar(length, angle);
return (converDegToRad(angle));
}
void Vector::reset(double x, double y, Mode mode)
{
*this = Vector(x, y, mode);
}
void Vector::polar_mode()//set to polay mode
{
mode = POL;
}
void Vector::rect_mode() // set to rectangular mode
{
mode = RECT;
}
//operator overloading
//add two Vectors
Vector Vector::operator+(const Vector& b)const
{
return Vector(x + b.x, y + b.y);
}
//sub vector b from a
Vector Vector::operator-(const Vector& b)const
{
return Vector(x - b.x, y - b.y);
}
//reverse sign of Vector
Vector Vector::operator-()const
{
return Vector(-x, -y);
}
//multyply vector by n
Vector Vector::operator*(double n)const
{
return Vector(n*x,n*y);
}
//friend methods
//multiply n by Vector a
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.magVal() << ", " << v.angval() << ")";
}
else
os << "Vector object mode is invalid";
return os;
}
}//end namespace VECTOR
#endif // 1
按要求main.c测试文件未作任何更改
#pragma region 练习3.cpp
/*
*/
#if 1
#include <iostream>
#include<cstdlib> //rand,srand() prototypes
#include<ctime>//time()prototype
#include"vector.h"
int main()
{
using namespace std;
using VECTOR::Vector;
srand(time(0));//seed random-number generator
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 << "steps++ " << steps << ",magVal() = " << result.magVal() << endl;
}
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 << "Bye!\n";
cin.clear();
while (cin.get() != '\n')
{
continue;
}
return 0;
}
#endif