Подорожуй з gofrie.com

Презентація підручника Володимира Васильовича Бублика «Об’єктно-орієнтоване програмування»

18 лютого ц.р. о 15 год. в аудиторії 1/223 презентація підручника Володимира Васильовича Бублика «Об’єктно-орієнтоване програмування»

Комплекс одних з найпопулярніших у на факультеті курсів тепер набув довершеної форми підручника! Все, що ви вчили (або вчитимете) на лекціях та практичних з ПП, ООП та МООП, узагальнено, розширено і систематизовано. У книжці розібрано майже 1000 прикладів, що навчать не просто програмувати, а розробляти придатні до нових застосувань безпечні та гнучкі програми, використовуючи весь потенціал мови С++. Якщо ви плануєте робити кар’єру програміста, це видання може стати вашою настільною книжкою на багато років.

Спеціальний гість – спонсор видання, генеральний директор компанії «Інфопульс» Олексій Сігов.

Задача: Клас Time

Реалізувати клас Time за наведеною нижче специфікацією.

Увага! Час має нормалізуватися при створенні об'єкта.
Наприклад Time a(8, 75, 210) після створення має мати атрибути Hours = 9, Minutes= 18, Seconds == 30

Зразки виводу:
1) Для Time(1,1,1) — 01:01:01
2) Для Time(23,59,59) — 23:59:59

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

class Time
{
public:
	struct BadTime;
	typedef int Hours;
	typedef int Minutes;
	typedef int Seconds;
	
	Time (const Hours& h, const Minutes& m, const Seconds& s);
	Time (const Seconds &s=0);
	Time (const Time&);
	~Time(){};
	Time& operator=(const Time&);
	
	operator int() const;

	const double ToHours() const;
	const int ToSeconds() const;

	// Selectors
	const Hours& getHours() const;
	const Minutes& getMinutes() const;
	const Seconds& getSeconds() const;

	// Modifiers
	void setHours(const Hours&);
	void setMinutes(const Minutes&);
	void setSeconds(const Seconds&);

	const Time& operator++();
	const Time operator++(int);
	const Time& operator--();
	const Time operator--(int);

private:
	// Mutable attributes in order to allow normalizing in const objects
	mutable Hours _hours;
	mutable Minutes _minutes;
	mutable Seconds _seconds;

	void normalizeTime() const;
};

Time& operator+=(Time&, const Time&);
const Time operator+(const Time&, const Time&);

const bool operator==(const Time&, const Time&);
const bool operator!=(const Time&, const Time&);
const bool operator>(const Time&, const Time&);
const bool operator<(const Time&, const Time&);
const bool operator>=(const Time&, const Time&);
const bool operator<=(const Time&, const Time&);

ostream& operator<<(ostream&, const Time&);

struct Time::BadTime
{
	Time::Hours _hours;
	Time::Minutes _minutes;
	Time::Seconds _seconds;
};

Задача: Комплексні числа (алгебраїчна і тригометрична форми)

Реалізувати два варіанти класу комплексних чисел за доданими специфікаціями:
УВАГА! Період тригонометричних чисел має округлюватися до 2*PI

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

const double PI = 3.141592653589793238462643383279;

class AComplex;
class TComplex
{
private:
	double _ro, _phi;
	// Зведення по модулю 2PI
	void normalizePhi();

public:
	TComplex (const double& ro=0, const double& phi=0);
	TComplex (const TComplex&);
	TComplex (const AComplex&);
	~TComplex();

	TComplex& operator= (const TComplex&);

	double& mod();
	double& arg();

	const double& mod() const;
	const double& arg() const;

	const double re() const;
	const double im() const;
};

TComplex& operator+=(TComplex&, const TComplex&);
TComplex& operator-=(TComplex&, const TComplex&);
TComplex& operator*=(TComplex&, const TComplex&);
TComplex& operator/=(TComplex&, const TComplex&);

const TComplex operator* (const TComplex&, const TComplex&);
const TComplex operator/ (const TComplex&, const TComplex&);

class TComplex;
class AComplex
{
private:
	double _re, _im;

public:
	AComplex (const double& re=0, const double& im=0);
	AComplex (const TComplex&);
	AComplex (const AComplex&);
	~AComplex();

	AComplex& operator= (const AComplex&);

	double& re();
	double& im();

	const double& re(void) const;
	const double& im(void) const;

	const double mod() const;
	const double arg() const;

	// Спряжене до комплексного числа
	const AComplex conj() const;
};

AComplex& operator+=(AComplex&, const AComplex&);
AComplex& operator-=(AComplex&, const AComplex&);
AComplex& operator*=(AComplex&, const AComplex&);
AComplex& operator/=(AComplex&, const AComplex&);

const bool operator==(const AComplex &, const AComplex &);
const bool operator!=(const AComplex &, const AComplex &);

const AComplex operator+ (const AComplex&, const AComplex&);
const AComplex operator- (const AComplex&, const AComplex&);

Задача: Трикутники

Реалізувати клас трикутників за зразком сигнатури:

Вивід трикутників ABC у вигляді (1;2)(1;2)(3;5), де A, B, C — відповідні точки.

#include <iostream>
using namespace std;

class Point
{
private:
	double _x;
	double _y;

public:
	Point (const double &x = 0, const double &y = 0);
	Point (const Point &);
	~Point();
	Point &operator=(const Point &);
	double &x();
	double &y();
	const double &x()const;
	const double &y()const;
	const double distance(const Point &p) const;
};

ostream &operator<<(ostream&, const Point &);
const Point operator+ (const Point &, const Point &);
Point &operator+=(Point &, const Point &);
const Point operator- (const Point &, const Point &);
Point &operator-=(Point &, const Point &);
const bool operator==(const Point &, const Point &);
const bool operator!=(const Point &, const Point &);

class Triangle
{
public:
	// Segment of triangle
	class Segment 
	{
	private:
		// Assignment is forbidden in this implementation
		Segment &operator=(const Segment &);
		const Point &_a;
		const Point &_b;

	public:
		Segment(const Point &start, const Point &end);
		Segment(const Segment &);
		~Segment();

		const Point &start() const;
		const Point &end() const;

		const double length() const;
                // Найближча відстань від точки до відрізка
		const Point nearest(const Point &) const;
	};

	Triangle(const double &x1=0, const double &y1=0,
	         const double &x2=1, const double &y2=0,
		 const double &x3=0, const double &y3=1);
	Triangle(const Point &a, const Point &b, const Point &c);
	Triangle(const Point &a, const Segment &side);
	Triangle (const Triangle &);
	~Triangle();
	Triangle &operator=(const Triangle &);

	const double perimeter() const;
	const double area() const;

	const Point &apexA() const;
	const Point &apexB() const;
	const Point &apexC() const;

	const Segment &side_a() const;
	const Segment &side_b() const;
	const Segment &side_c() const;

	const double length_a() const;
	const double length_b() const;
	const double length_c() const;

	const Segment &height_a() const;
	const Segment &height_b() const;
	const Segment &height_c() const;

private:
        Point _a, _b, _c;
};

Задача: Сегмент

Реалізувати клас сегментів, який не суперечить наступній сигнатурі:


#include <iostream>
using namespace std;

class Point 
{
private:
    double _x;
    double _y;
public:
    Point(const double &x = 0, const double &y = 0);
    Point(const Point&);
    ~Point(void);
    Point& operator=(const Point &);
    double& x(void);
    double& y(void);
    const double& x()const;
    const double& y()const;
};

//Вивід у вигляді (x; y)
ostream& operator<<(ostream&, const Point&);
const Point operator+(const Point&, const Point&);
Point& operator+=(Point&, const Point&);
const bool operator==(const Point&, const Point&);
const bool operator!=(const Point&, const Point&);

class Segment
{
private:
    const unsigned int _myID;
    Point _a;
    Point _b;
public:
    Segment(const double &x1 = 0, const double &y1 = 0,
            const double &x2 = 0, const double &y2 = 0);
    Segment(const Point &start, const Point &end);
    Segment(const Segment &);
    ~Segment();
    Segment& operator=(const Segment &);
    const Point& start() const;
    const Point& end() const;
    Point& start();
    Point& end();
    const double& startX() const;
    const double& startY() const;
    const double& endX() const;
    const double& endY() const;
    double& startX();
    double& startY();
    double& endX();
    double& endY();
    // Обчислення довжини відрізка
    const double length() const;
    // Обчислення відстані від відрізка до точки
    const double distance(const Point &) const;
    //Ідентифікатор поточного сегменту
    const unsigned int getID() const;
};

// Вивід у вигляді [(x1; y1); (x2; y2)]
ostream& operator<<(ostream&, const Segment &);
const bool operator==(const Segment &, const Segment &);
const bool operator!=(const Segment &, const Segment &);

Задача: Точка

Реалізувати клас точок площини, який не суперечить наступній сигнатурі:

#include <iostream>
using namespace std;

class Point 
{
public:
    Point(double x = 0, double y = 0);
    Point(const Point&);
    ~Point(void);
    Point& operator=(const Point &);
    double& x(void);
    double& y(void);
    double x(void) const;
    double y(void) const;

	//Ідентифікатор поточної точнки
    const unsigned int getID(void) const;
	//Кількість точок, які зараз існують в пам’яті
    static const unsigned int amount(void);
};

ostream& operator<<(ostream&, const Point&);
const Point operator+(const Point&, const Point&);
Point& operator+=(Point&, const Point&);
bool operator==(const Point&, const Point&);
bool operator!=(const Point&, const Point&);