Читайте также:
|
|
Предметная область: «Летательные Аппараты»
Пример реализации на языке 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
Список использованной литературы
1. Архангельский А.Я. Программирование в C++ Bulder. М.: Бином, 2003.
2. Дейтел X., Дейтел П. Как программировать на Си. -М: Бином, 2000.
3. Паннас К., Мюррей У. Программирование на Си и Си++. -К.:Ирина, BHV, 2000.
4. Дьюхарст С., Старк К. Программирование на Си++. - Киев, 1993.
5. Белецклй Я. Турбо Си++. Новая разработка. - М.: Машиностроение,1994.
6. Уэйт М., Прата С., Мартин Д. Язык Си. - М.: Мир, 1988.
7. Фокс Дж. Программное обеспечение и его разработка. - М.: Мир, 1985.
8. Лингер Р. и др. Теория и практика структурного программирования. - М.:Мир, 1982.
9. Гудман С., Хидетниени С. Введение в разработку и анализ алгоритмов. -М.: Мир, 1982.
10. Мейер Б., Бодуэн К. Методы программирования. Т. I и 2. - М.: Мир,1984.
11. Зиглер К. Методы проектирования программных систем. - М.: Мир, 1985.
12. Петров А.В. и др. Вычислительная техника в инженерных и экономических расчетах: Учебник для вузов. - М.: Bill, 1984.
13. Шнейдерман Б. Психология программирования. - М.: Радио и связь, 1984.-304с.– 2007.
Дата добавления: 2015-11-04; просмотров: 34 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создание объектов. Конструкторы и деструктор | | | Цели и задачи освоения дисциплины |