C++Primer Plus第十一章类的使用,课后练习2,还是醉汉回家的故事 2 修改私有变量处理极坐标

对 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值