#include <iostream>
#include <string>
using namespace std;

class Buoy{
protected: 
	float	latitude;
	float	longitude;
	string	bname;
	const	long	year;
	static  long	bcount;
public:
	// accessors and mutators
	long	Year();
	float	Latitude();	
	void	Latitude(float _v);
	long	LatitudeDegrees();
	long    LatitudeMinutes();
	float	Longitude();
	long    LongitudeDegrees();
	long    LongitudeMinutes();
	void    Longitude(float _v);
	string  Key();
	string	Name();
	void	Name(string _v);
	// behaviour method
	virtual	void    toString();
	// utility methods
	// constructors
	Buoy();										   // default
	Buoy(float _va,float _vo,string _vn,long _vy); // initialise 1
	Buoy(float _va,float _vo,string _vn);          // initialise 2
	Buoy(const Buoy & _b);							   // copy 
	static	long	Count();
	bool	operator==(Buoy & _b);
	void	operator+(float _f);
private:
	long	toMinutes(float _v);
}; // end class declare  Buoy
class	SpyBuoy : public Buoy
{
protected:
	long	incidents;
public:
	long	Incidents();
	void	Incidents(long _v);
	void    toString();
	SpyBuoy();
	SpyBuoy(float _va,float _vo,string _vn,long _vy,long _vi);
	SpyBuoy(float _va,float _vo,string _vn,long _vi); 
	SpyBuoy(const SpyBuoy & _s);
};
class	WeatherBuoy : public Buoy
{
protected:
	long	seatemp;
public:
	long	SeaTemp();
	void	SeaTemp(long _v);
	void	toString();
	WeatherBuoy();
	WeatherBuoy(float _va,float _vo,string _vn,long _vy,long _vs);
	WeatherBuoy(float _va,float _vo,string _vn,long _vs); 
	WeatherBuoy(const WeatherBuoy & _w);
};

long  Buoy::Year() {return year;}
float Buoy::Latitude(){return	latitude;}
long  Buoy::LatitudeDegrees() {return (long) latitude;}
long  Buoy::LatitudeMinutes() {return toMinutes(latitude);}
long  Buoy::LongitudeDegrees(){return (long) longitude;}
long  Buoy::LongitudeMinutes() {return toMinutes(longitude);}
void  Buoy::Latitude(float _v)
	{if (_v < 20)
		latitude = 20;
	else if (_v > 60)
		latitude = 60;
	else
		latitude = _v;
	}
float Buoy::Longitude(){return	longitude;}
void  Buoy::Longitude(float _v)
	{if (_v < 50)
		longitude = 50;
	else if (_v > 80)
		longitude = 80;
	else
		longitude = _v;
	}
string  Buoy::Key()  {return bname;}
string	Buoy::Name() {return bname;}
void    Buoy::Name(string _v)
{
	if (bname == "") bname = _v;
}
void	Buoy::toString()
{
cout << "GENERIC BUOY " <<  this->latitude << " " << this->longitude << " " << this->bname << " "
<< this->year << endl;
}
long	Buoy::toMinutes(float _v)
{
	return (long) ((_v - long(_v)) * 60);
}
Buoy::Buoy() : year(2008), latitude(37.5), longitude(78.0), bname("NEW") 
{
	bcount++;
}
Buoy::Buoy(float _va,float _vo,string _vn,long _vy) 
: year(_vy), latitude(_va), longitude(_vo), bname(_vn)
{
	Latitude(latitude);
	Longitude(longitude);
	bcount++;
}
Buoy::Buoy(float _va,float _vo,string _vn) 
: year(2008), latitude(_va), longitude(_vo), bname(_vn)
{
	Latitude(latitude);
	Longitude(longitude);
	bcount++;
}
Buoy::Buoy(const Buoy &_b) : year(_b.year), latitude(_b.latitude), longitude(_b.longitude),
bname(_b.bname + "  II ")
{
	bcount++;
}
long	Buoy::Count() {return bcount;}
long	Buoy::bcount = 0;
bool	Buoy::operator==(Buoy & _b)
{
	if (this->latitude != _b.latitude) return false;
	if (this->longitude != _b.longitude) return false;
	return false;
}
void	Buoy::operator+(float _f)
{
	this->latitude += _f;
	this->Latitude(this->latitude);
}
// end implementation Buoy
long	SpyBuoy::Incidents(){return	incidents;}
void	SpyBuoy::Incidents(long _v){incidents = _v;}
SpyBuoy::SpyBuoy() 
{	Buoy();	incidents = 0;};
SpyBuoy::SpyBuoy(float _va,float _vo,string _vn,long _vy,long _vi)
:	Buoy(_va,_vo,_vn,_vy) , incidents(_vi) {};
SpyBuoy::SpyBuoy(float _va,float _vo,string _vn,long _vi)
:	Buoy(_va,_vo,_vn), incidents(_vi) {};
SpyBuoy::SpyBuoy(const SpyBuoy & _s)
: Buoy(_s), incidents(_s.incidents){};
void	SpyBuoy::toString()
{
cout << "SPY BUOY " <<  this->latitude << " " << this->longitude << " " << this->bname << " "
<< this->year << endl;
}
// end implementation Spy Buoy
long	WeatherBuoy::SeaTemp(){	return seatemp;};
void	WeatherBuoy::SeaTemp(long _v){seatemp = _v;};
WeatherBuoy::WeatherBuoy():Buoy(), seatemp(3) {};
WeatherBuoy::WeatherBuoy(float _va,float _vo,string _vn,long _vy,long _vs)
: Buoy(_va,_vo,_vn,_vy) , seatemp(_vs) {};
WeatherBuoy::WeatherBuoy(float _va,float _vo,string _vn,long _vs) 
:	Buoy(_va,_vo,_vn), seatemp(_vs) {};
WeatherBuoy::WeatherBuoy(const WeatherBuoy & _w)
: Buoy(_w), seatemp(_w.seatemp) {};
void	WeatherBuoy::toString()
{
cout << "W BUOY " <<  this->latitude << " " << this->longitude << " " << this->bname << " "
<< this->year << endl;
}
// end implementation Weather Buoy
