Student.gomel.by
На главную ... Контакты ... Университеты ... Частые вопросы ...
Заказать курсовую в Гомеле ...
Репетитор по информатике ...
Условия ...
Так сколько же стоит?


Заказать лабораторную работу на С++ (Гомель)


ЛАБОРАТОРНАЯ РАБОТА №5. ПРОИЗВОДНЫЕ КЛАССЫ И ИЕРАРХИИ КЛАССОВ



1) Реализуйте простую графическую систему с использованием графических средств Win32 API. Абстрактный класс


class Shape
{
protected:
HDC hdc; //контекст устройства на котором рисуем
int width; //толщина линий
COLORREF color; //цвет линий
HPEN hpen; //перо для рисования
public:
Shape(HDC hd)
{ hdc = hd; width = 1; color = RGB(0, 0, 0); }
void SetWidth(int w);
void SetColor(COLORREF c);
// функция рисования должна переопределяться в производных
// классах
virtual void Draw(void) = 0;
};

является общим интерфейсом для классов Dot (точка), Line (линия), Triangle (треугольник), Rectangle (прямоугольник), Ellipse (эллипс). Line задается парой объектов Point, который не является производным от Shape, Triangle задается тройкой (массивом) объектов Point. Предусмотреть возможность установки для всех фигур толщины и цвета линии, цвета заливки. Shape невидим до вызова функции Draw(). Пример использования:

Shape * p = 0;
...
Point pt[3] = {{20,10},{40,60,},{30,25}};
p = new Triangle(pt);
p->SetWidth(3);
p->SetColor(RGB(20, 200, 150));
p->Draw();
...


2) Определите класс


class Person //любой человек
{
protected:
char fio[100]; //ФИО
char date_of_birth[12]; //дата рождения
char pol[5] //пол
Person * next; //указатель на следующего в списке
public:
// ...
void SetPersonInfo(char*, char*, char*);
//добавить следующего в список
//функция вывода информации переопределяется в
//производных классах
virtual void PersonInfo(void);
};

Производным от него будет класс Employee (сотрудник), в котором содержится дополнительная информация о должности сотрудника.

Создайте производный от Employee класс Manager (менеджер), в котором дополнительными свойствами будут наименование отдела. Объявите в классе переменную Person * employers, которая будет указывать на список сотрудников.

Создайте производный от Employee класс Chief (директор), в котором дополнительным свойством будет наименование фирмы. Объявите в классе переменную Person * managers, которая будет указывать на список менеджеров.

В классы Manager и Chief необходимо добавить функции добавления соответственно сотрудника и менеджера (AddEmployee() и AddManager()).

В программе создайте фирму «Рога и Копыта», директор Остап Бендер, Шура и Паниковский – менеджеры. У каждого менеджера должно быть по три сотрудника. Пример использования:


Chief * ch = new Chief(“Рога и копыта”);
ch->SetPersonInfo(“Остап Бендер”, “12.12.1212”, “м”);
Manager * m1 = new Manager(“Рога”);
m1->SetPersonInfo(“Шура”, “01.01.0101”, “м”);
Manager * m2 = new Manager(“Копыта”);
m1->SetPersonInfo(“Паниковский”, “10.10.1010”, “м”);
ch->AddManager(m1);
ch->AddManager(m2);
...

3) Автомобильный транспорт описывается классом «Автомобиль» (Automobile), который содержит следующую информацию: марка автомобиля, тип двигателя (карбюраторный или дизельный), мощность двигателя в л.с., масса автомобиля, пробег в км.

«Легковой автомобиль» (Car) производный от «Автомобиля» содержит дополнительную информацию: расход топлива на 100 км, время разгона до 100 км/ч в секундах, количество пассажирских мест.

«Грузовой автомобиль» (Lorry) производный от «Автомобиля» содержит дополнительную информацию: грузоподъемность в тоннах, тип кузова (открытый или закрытый).

«Автобус» (Bus) производный от «Легкового автомобиля» содержит дополнительную информацию: количество стоячих мест.

Необходимо создать парк автомобилей автобазы в виде списка или массива, где каждый элемент представляет собой указатель на базовый класс Automobile, а указывает на объект производного класса.

В базовом классе определить чисто виртуальную функцию Load(int), которая в производном классе Lorry определяется как загрузка груза, а в классах Car и Bus – посадка пассажиров. В базовом и производных классах необходимо определить виртуальную функцию Print(), которая выводит на экран сведения об автотранспорте. Каждый класс должен содержать конструктор с параметрами.

4) Разработать следующую иерархию классов для ролевой игры:


class Weapon
{
protected:
//имя
char name[20];
//сила удара
int blow_power;
//сила защиты
int protect_power;
public:
//конструктор
Weapon(int bp, int pp)
{
blow_power = bp;
protect_power = pp;
}
//ударить
virtual int Strike();
//защититься
virtual int Protect(int power);
//возвратить имя оружия
char * GetName();
};


class Shield:public Weapon //щит
{/*
в классе необходимо определить конструктор и
переопределить функции Strike() и Protect()
*/};


class Club:public Weapon //дубинка
{/*
в классе необходимо определить конструктор и
переопределить функции Strike() и Protect()
*/};


class Sword:public Weapon //меч
{/*
в классе необходимо определить конструктор и
переопределить функции Strike() и Protect()
*/};

Конструктор класса Weapon устанавливает значения силы удара и защиты.

Функция Strike() генерирует случайное число в диапазоне от 0 до blow_power, уменьшает blow_power на значение равное частному от деления сгенерированного числа на 10 и возвращает сгенерированное число.

Функция Protect() получает силу удара, генерирует случайное число в диапазоне от 0 до protect_power, уменьшает protect_power на значение равное частному от деления сгенерированного числа на 10, вычисляет разницу между силой удара power и сгенерированным числом и, если результат положительный то возвращается это число, если нет то возвращается 0. Возвращаемое значение есть сила повреждения.

Все классы реализовать в отдельном h-файле, имя которого совпадает с именем класса.

5) Разработать иерархию классов для ролевой игры:


class Personage
{
protected:
//имя
char name[20];
//удача в атаке
int luck_attack;
//удача в защите
int luck_guard;
//здоровье
int health;
//оружие нападения
Weapon * weapon_attack;
//оружие защиты
Weapon * weapon_guard;
public:
Personage(char *);
virtual void Attack(Personage*);
virtual void Guard(int);
//false – игрок еще жив, иначе true
bool IsDead() { return (health <= 0); }
//установить оружие атаки
void SetWeaponAttack(Weapon * w)
{
weapon_attack = w;
}
//установить оружие защиты
void SetWeaponGuard(Weapon * w)
{
weapon_guard = w;
}
};


class Warrior:public Personage //воин
{/*
в классе необходимо определить конструктор и
переопределить функции Attack() и Guard()
*/};


class Monster:public Personage //монстр
{/*
в классе необходимо определить конструктор и
переопределить функции Attack() и Guard()
*/};

Функция Attack() инициирует атаку игроком противника. В начале функция выбирает случайным образом оружие и вычисляет силу удара. Затем вычисляется удача в атаке по следующей формуле:


удача_в_атаке = случайное_число(-сила_удара/2, сила_удара/2)

Сила удара суммируется с удачей и передается функции Guard() противника.

Функция Guard() инициирует защиту от нападения противника. Вначале функция выбирает случайно оружие для защиты и вычисляет силу повреждения. Затем вычисляет удачу в защите по аналогичной для атаки схеме, вычитает удачу из силы повреждения и полученный результат вычитается из здоровья.

Все классы реализовать в отдельном h-файле, имя которого совпадает с именем класса.

6) Разработать класс Combat для моделирования поединка между двумя персонажами (задание №5) с использованием оружия (задание №4). Конструктор класса должен запрашивать тип персонажей и предлагать на выбор оружие. Функция Start() должна случайно выбирать игрока, который будет ходить (атаковать). Результаты ходов должны отображаться на экране, например:


ход 1:
атака имя: сила_удара удача рез_сила здоровье
защита имя: сила_поврежд удача рез_поврежд здоровье
...
ход 5:
атака имя: сила_удара удача рез_сила здоровье
защита имя: сила_поврежд удача рез_поврежд здоровье
...

Как только игрок погибает бой прекращается.


class Combat
{
Personage * p1; //игрок 1
Personage * p2; //игрок 2
Personage * a_player; //атакующий игрок
Personage * g_player; //защищающийся игрок
public:
Combat();
~Combat();
void Start();
};

Все классы реализовать в отдельном h-файле, имя которого совпадает с именем класса.




ЛАБОРАТОРНАЯ РАБОТА №1. ПЕРЕХОД ОТ ЯЗЫКА С К ЯЗЫКУ С++

ЛАБОРАТОРНАЯ РАБОТА №2. КЛАССЫ

ЛАБОРАТОРНАЯ РАБОТА №3. ОБЪЕКТЫ КЛАССОВ

ЛАБОРАТОРНАЯ РАБОТА №4. ПЕРЕОПРЕДЕЛЕНИЕ ОПЕРАТОРОВ

ЛАБОРАТОРНАЯ РАБОТА №5. ПРОИЗВОДНЫЕ КЛАССЫ И ИЕРАРХИИ КЛАССОВ

ЛАБОРАТОРНАЯ РАБОТА №6. ШАБЛОНЫ

ЛАБОРАТОРНАЯ РАБОТА №7. ОБРАБОТКА ИСКЛЮЧЕНИЙ

ЛАБОРАТОРНАЯ РАБОТА №8. ДИНАМИЧЕСКАЯ ИДЕНТИФИКАЦИЯ И ПРИВЕДЕНИЕ ТИПА




Вы на сайте:


Student.Gomel.by


репетитор: французский язык, литовский язык, польский язык Предлагаем Вам снять квартиру на сутки в Гомеле рядом с вокзалом. Квартира расположена недалеко от вокзала в 10 минутах ходьбы.