Наследование. Абстрактные классы. Шаблоны классов

Лабораторная работа №6.

(Срок до 4.05.2013)

  1. Наследование.

Выполняют: Косяков, Левина, Лесун, Талейко.

Создать класс MUSIC (музыкальная композиция). Включить в описание класса следующие поля:

  • уникальный числовой идентификатор;
  • название композиции;
  • музыкальный жанр (песня, опера, симфония, другое);
  • автор композиции;
  • имя первого исполнителя;
  • длительность звучания;
  • год создания;
  • текущий рейтинг (число от 0 до 100).

Все поля, кроме последнего, не могут изменяться после создания объекта.

Реализовать:

  • конструктор, задающий значения полей и обеспечивающий уникальность идентификатора;
  • конструктор копирования, обеспечивающий уникальность идентификатора для нового объекта;
  • вывод информации о композиции в выходной поток.
  • изменение значения текущего рейтинга;
  • сравнение двух композиций на равенство по длительности звучания;

Создать класс-потомок REMAKE (римейк). Дополнительно включить в описание этого класса следующие поля:

  • название римейка;
  • исполнитель римейка;
  • год создания римейка.

Реализовать механизм создания римейка на основе оригинальной композиции. Написать консольное приложение, демонстрирующее работу с созданными классами.

Выполняют: Малышко, Потенко, Стефанович, Трухановец, Черноморд

Создать класс «персонаж ролевой игры». Включить в описание класса следующие поля:

- имя персонажа;

- состояние (нормальное, ослаблен, мертв);

- раса (человек, гном, эльф, орк, дракон, …);

- текущее значение здоровья персонажа (неотрицательная величина);

- максимальное значение для здоровья персонажа (50);

Реализовать:

- конструктор, задающий значения полей;

- перегрузку оператора вывода информации о персонаже в выходной поток.

- сравнение персонажей по проценту здоровья (отношению текущего здоровья персонажа к максимальному количеству здоровья);

- потерю персонажем здоровья в случае столкновения с другим персонажем. При столкновением с персонажем подобным себе он теряет 10 единиц здоровья, при столкновением с персонажем другой расы он теряет 15 единиц здоровья. Если процент здоровья персонажа становится менее 10, персонаж автоматически переходит из состояния «здоров» в состояние «ослаблен». Если текущее значение здоровья равно 0, персонаж автоматически переходит из любого состояния в состояние «мертв».

- восполнение здоровья путем выпивания глотка живой воды. Каждый глоток приносит пять единиц здоровья, но его количество не может превысить максимального значения. Если процент здоровья персонажа становится большим или равным 10, персонаж автоматически переходит из состояния «ослаблен» в состояние «здоров». Мертвый персонаж не может пить живую воду;

Создать класс-потомок «персонаж, владеющий магией». Дополнительно включить в описание этого класса следующие поля:

- текущее значение магической энергии (маны) (неотрицательная величина);

- максимальное значение маны.

Мана расходуется на произнесение заклинаний. Если текущее значение маны меньше того количества, которое требуется для произнесения какого-либо заклинания, заклинание не может быть произнесено, а количество маны остается неизменным.

Реализовать:

- конструктор, задающий значения полей;

- перегрузку оператора вывода информации о персонаже в выходной поток.

- заклинание «добавление здоровья». Суть этого заклинания – увеличить текущее значение здоровья какого-либо персонажа (в том числе и себя) до заданного магом (но не больше максимального для того персонажа, которого лечат) или до предела, задаваемого текущим значением маны. На единицу добавленного здоровья расходуется две единицы маны.

Написать приложение, демонстрирующее работу с созданными классами.

2. Абстрактные классы

Выполняют: Косяков, Левина, Лесун, Талейко.

Разработать классы областей на плоскости, иерархия которых приведена на рисунке ниже.

Область на плоскости

|

+--Эллипс

| |

| +--Круг

|

+--Многоугольник

|

+--Правильный многоугольник

Рис. Иерархия областей на плоскости

Базовый класс иерархии имеет следующий интерфейс:

class Area

{

virtual ~Area() {}

virtual double perimeter() = 0; // периметр

virtual double area() = 0; // площадь

};

Для проверки работоспособности классов написать тестирующую программу, в которой вызываются все методы классов.

Выполняют: Малышко, Потенко, Стефанович, Трухановец, Черноморд

Разработать классы треугольников, иерархия которых приведена на рисунке ниже.

Треугольник

|

+--Равнобедренный треугольник

| |

| +--Равносторонний треугольник

| |

| +---------------------------+

| |

+--Прямоугольный треугольник |

| |

+---------------------------+--Прямоугольный

равнобедренный

треугольник

Рис. Иерархия треугольников

Базовый класс иерархии имеет следующий интерфейс:

class Triangle

{

virtual ~ Triangle () {}

virtual double perimeter() = 0; // периметр

virtual double area() = 0; // площадь

};

Для проверки работоспособности классов написать тестирующую программу, в которой вызываются все методы классов.

3. Шаблоны классов

Выполняют: Косяков, Левина, Лесун, Талейко.

Реализовать шаблон класса ListDeque, который имеет следующий интерфейс:

// дек – двустороння очередь на списке

template <class T> class ListDeque

{

struct node // элемент дека

{

T item; // данные

node* next; // указатель на следующий элемент

node* prev; // указатель на предыдущий элемент

};

// указатели на первый и последний элементы в списке

struct node *head, *tail;

public:

// конструкторы

ListDeque(); // по умолчанию

ListDeque(const ListDeque<T>& d); // копирования

~ListDeque(); // деструктор

void pop(const T& n); // включить элемент в голову дека

void ins(const T& n); // включить элемент в хвост дека

T push(); // исключить элемент из головы дека

T del(); // исключить элемент из хвоста дека

bool isEmpty(); // дек пустой?

};

Определение и реализацию шаблона класса поместить в заголовочный файл deque.h.

Для проверки работоспособности шаблона класса ListDeque написать тестирующую программу, в которой из шаблона класса ListDeque создаются различные шаблонные классы и вызываются все методы этих шаблонных классов.

Выполняют: Малышко, Потенко, Стефанович, Трухановец, Черноморд

Реализовать шаблон класса Set, который имеет следующий интерфейс:

template <class T> class Set

{

int size; // размер множества

int count; // количество элементов в множестве

T* p; // указатель на массив элементов

public:

// конструктор по умолчанию

Set(const int& _size = 0);

// конструктор копирования

Set(const Set<T>& s);

// деструктор

~Set();

// функции члены класса

int getSize() const; // размерность множества

int getCount() const; // количество элементов в множестве

void include(const T& n); // включить элемент

void exclude(const T& n); // исключить элемент

void empty(); // удаление из множества всех элементов

bool isInSet(const T& n) const; // элемент в множестве?

// операторы члены класса

Set<T>& operator =(const Set<T>& s); // присваивание

Set<T>& operator +=(const Set<T>& s); // объединение

Set<T>& operator -=(const Set<T>& s); // разность

Set<T>& operator *=(const Set<T>& s); // пересечение

// операторы друзья класса

friend Set<T> operator +(const Set<T>& s1,

const Set<T>& s2); // объединение

friend Set<T> operator -(const Set<T>& s1,

const Set<T>& s2); // разность

friend Set<T> operator *(const Set<T>& s1,

const Set<T>& s2); // пересечение

// операторы ввода-вывода

friend istream& operator >>(istream& in, Set<T>& s);

friend ostream& operator <<(ostream& out, const Set<T>& s);

};

Определение и реализацию шаблона класса поместить в заголовочный файл set.h.

Для проверки работоспособности шаблона класса Set написать тестирующую программу, в которой из шаблона класса Set создаются различные шаблонные классы и вызываются все методы этих шаблонных классов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: