Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример решения задания






Предметная область: «Летательные Аппараты»

Пример реализации на языке C++:

//

// Летательные Аппараты (ЛА)

//

 

#include < conio.h>

#include < iostream.h>

#include < string.h>

 

// Перечисление, которое задает возможные состояния

// Летательного Аппарата - " на земле" и " в воздухе"

enum Flying { onGround = 0, inAir };

 

//

// Класс: Летательный Аппарат (или ЛА)

//

class FlyDevice

{

private:

char name[100]; // Имя летательного аппарата

 

protected:

Flying state; // Состояние

 

public:

// Конструктор ЛА по умлочанию - без параметров

FlyDevice(): state(onGround)

{

setName(" Неопознанный Летающий Объект");

cout < < " FlyDevice:: FlyDevice\t " < < getName() < < endl;

 

}

 

// Конструктор ЛА с параметром - именем ЛА

FlyDevice(char *n)

{

state = onGround;

setName(n);

cout < < " FlyDevice:: FlyDevice\t " < < getName() < < endl;

}

 

// Деструктор ЛА

virtual ~FlyDevice()

{

cout < < " FlyDevice:: ~FlyDevice\t " < < getName() < < endl;

}

 

// Два метода, которые осуществляют доступ к закрытой переменной name

// Модификатор const говорит о том что переменная не должна изменяться

virtual void setName(const char *n) { strcpy(name, n); }

virtual char* getName() { return name; }

 

// Виртуальный метод - " летать" мозжет быть перекрыт в классах-потомках

virtual void fly()

{

state = inAir;

cout < < " FlyDevice:: fly\t\t " < < getName()

< < " в воздухе! " < < endl;

};

};

 

//

// Класс: Планер - безмоторный ЛА.

// Планер поднимается другим самолетом на определенную высоту

// и далее парит в восходящих воздушных потоках

//

class Glider: public FlyDevice

{

protected:

int windForce; // Сила ветра в баллах

int startHeight; // Начальная высота

 

public:

const static int STORM = 7; // Недопустимо сильный ветер

const static int MIN_HEIGHT = 500; // Минимальная стартовая высота

 

// Конструктор Планера - инциализирует класс-родитель

Glider(char* name): FlyDevice(name), startHeight(0), windForce(0)

{

cout < < " Glider:: Glider\t\t " < < getName() < < endl;

}

 

// " Перекрываем" виртуальный метод класса-родителя

virtual void fly();

 

// Методы доступа к переменным windForce и startHeight

int getHeight() { return startHeight; }

void setHeight(int h) { startHeight = h; }

 

int getWindForce() { return windForce; }

void setWindForce(int wf) { windForce = wf; }

};

 

// Пример описания тела метода вне описания класса

void Glider:: fly()

{

if (getWindForce() < STORM & & getHeight() > = MIN_HEIGHT)

{

cout < < " Glider:: fly\t\t " < < getName()

< < " Высота=" < < getHeight()

< < " Сила Ветра=" < < getWindForce()

< < endl;

FlyDevice:: fly();

}

else

{

cout < < " Glider:: fly\t\t " < < getName()

< < " Нелетные условия полета" < < endl;

}

};

 

// Перечисление, которое задает возможные состояния

// Двигателя - " остановлен", " запущен"

enum EngineState { stopped = 0, started };

 

//

// Класс: Самолет - моторный ЛА.

//

class Airplane: public FlyDevice

{

protected:

int fuel; // Запас топлива

EngineState engine; // Состояние двигателя

 

public:

const static int MIN_FUEL = 100; // Минимальное количество горючего

 

// Конструктор класса - инциализирует класс-родитель

Airplane(char* name): FlyDevice(name), engine(stopped), fuel(0)

{

cout < < " Airplane:: Airplane\t " < < getName() < < endl;

}

 

// Деструктор класса - освобождаем ресурсы, очиащаем состояния

~Airplane()

{

if (state == inAir) {

ground();

}

if (engine == started) {

cout < < " Airplane:: ~Airplane\t " < < getName()

< < " Остановить двигатель" < < endl;

engine = stopped;

} else {

cout < < " Airplane:: ~Airplane\t " < < getName() < < endl;

}

}

 

virtual void addFuel(int f)

{

fuel += f;

cout < < " Airplane:: addFuel\t " < < getName()

< < " Горючее=" < < fuel < < endl;

}

 

// Объявление virtual для метода fly - лишнее,

// так как метод уже объявлен виртуальным в классе-родителе.

virtual void fly();

virtual void ground();

};

 

void Airplane:: fly()

{

if (fuel > MIN_FUEL) {

if (engine! = started) {

cout < < " Airplane:: fly\t\t " < < getName()

< < " Запуск двигателя" < < endl;

engine = started;

}

cout < < " Airplane:: fly\t\t " < < getName()

< < " Горючее=" < < fuel < < endl;

 

// Вызвается метод класса-родителя

FlyDevice:: fly();

 

// Горючее расходуется при полете

fuel -= 50;

 

} else {

cout < < " Airplane:: fly\t\t " < < getName()

< < " Не хватает горючего! " < < endl;

}

}

 

// Новый метод Самолета - " Приземлиться"

void Airplane:: ground()

{

cout < < " Airplane:: ground\t " < < getName()

< < " Приземлиться" < < endl;

state = onGround;

}

 

void main()

{

clrscr();

 

{

// Скобки ограничивают область видимости переменных

cout < < endl < < " *** Тест класса Glider ***" < < endl;

Glider gl(" Scooter-FX12");

gl.setHeight(Glider:: MIN_HEIGHT + 100);

gl.fly();

// Здесь будет вызван деструктор объекта gl

}

 

{

// Скобки ограничивают область видимости переменных

cout < < endl < < " *** Тест класса Airplane ***" < < endl;

Airplane plane(" TY-134");

plane.fly();

 

plane.addFuel(Airplane:: MIN_FUEL + 300);

plane.fly();

plane.fly();

plane.fly();

plane.ground();

// Здесь будет вызван деструктор объекта plane

}

 

{

cout < < endl < < " *** Тест полиморфизма классов ***" < < endl;

FlyDevice *a, *b;

 

// Динамическое создание объектов

a = new Glider(" Glider-AQ23");

b = new Airplane(" LA-46");

 

a-> fly();

b-> fly();

 

cout < < " Имя объекта a = " < < a-> getName() < < endl;

cout < < " Имя объекта b = " < < b-> getName() < < endl;

 

// При динамическом создании объектов

// необходимо явно освобождать ресурсы

delete a; // неявно вызывается деструктор Glider

delete b; // неявно вызывается деструктор Airplane

}

}

Результат выполнения программы:

*** Тест класса Glider ***

FlyDevice:: FlyDevice Scooter-FX12

Glider:: Glider Scooter-FX12

Glider:: fly Scooter-FX12 Высота=600 Сила Ветра=0

FlyDevice:: fly Scooter-FX12 в воздухе!

FlyDevice:: ~FlyDevice Scooter-FX12

 

*** Тест класса Airplane ***

FlyDevice:: FlyDevice TY-134

Airplane:: Airplane TY-134

Airplane:: fly TY-134 Не хватает горючего!

Airplane:: addFuel TY-134 Горючее=400

Airplane:: fly TY-134 Запуск двигателя

Airplane:: fly TY-134 Горючее=400

FlyDevice:: fly TY-134 в воздухе!

Airplane:: fly TY-134 Горючее=350

FlyDevice:: fly TY-134 в воздухе!

Airplane:: fly TY-134 Горючее=300

FlyDevice:: fly TY-134 в воздухе!

Airplane:: ground TY-134 Приземлиться

Airplane:: ~Airplane TY-134 Остановить двигатель

FlyDevice:: ~FlyDevice TY-134

 

*** Тест полиморфизма классов ***

FlyDevice:: FlyDevice Glider-AQ23

Glider:: Glider Glider-AQ23

FlyDevice:: FlyDevice LA-46

Airplane:: Airplane LA-46

Glider:: fly Glider-AQ23 Нелетные условия полета

Airplane:: fly LA-46 Не хватает горючего!

Имя объекта a = Glider-AQ23

Имя объекта b = LA-46

FlyDevice:: ~FlyDevice Glider-AQ23

Airplane:: ~Airplane LA-46

FlyDevice:: ~FlyDevice LA-46






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.