Вы находитесь на странице: 1из 30

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

ЛУГАНСКОЙ НАРОДНОЙ РЕСПУБЛИКИ


ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
ЛУГАНСКОЙ НАРОДНОЙ РЕСПУБЛИКИ
«ЛУГАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМЕНИ ВЛАДИМИРА ДАЛЯ»

Кафедра информационных и управляющих систем

КУРСОВАЯ РАБОТА

по _дисциплине «Объектно-ориентированное программирование»___________________


(название дисциплины)

на тему: Разработка объектно-ориентированной модели сюжета сказки ___________________


«Красная шапочка» на основе паттернов проектирования и ее программная______
реализация_____________________________________________________________________________________

студента(ки)_2__курса______группы_ИТ-991______________________________
направление подготовки____09.03.02_Информационные системы и технологии
(шифр и название направление подготовки)

______Галюзин А.А._________ _________________


(фамилия и инициалы) (подпись)

Руководитель проекта
Стоянченко С.С.______________ ___________________
(должность, ученое звание, научная степень, (подпись)
Фамилия и инициалы)

Результат защиты:
Оценка:

Члены комиссии:
_______________ _____
АННОТАЦИЯ
Тематика работы: Разработка компьютерной программы на языке С++, в
которой будет реализован сюжет сказки “КРАСНАЯ ШАПОЧКА”.
Цель: В результате выполнения курсовой работы приобрести навыки
решения различных практических задач, связанных с разработкой программ на С+
+, научиться работать с научно-технической литературой в области
программирования, а также использовать стандарты, справочники по
программному обеспечению ЭВМ.
Работа состоит из введения, 3 разделов, заключения и списка
использованных источников. Объем работы - 28 страниц. В работе представлено 3
диаграммы и 4 рисунок. В работе присутствует описание задачи и методы ее
решения, представление в виде UML диаграмм и реализация данной задачи.
3

СОДЕРЖАНИЕ
ВВЕДЕНИЕ.....................................................................................................................5
1 АНАЛИЗ ЗАДАЧИ КУРСОВОГО ПРОЕКТИРОВАНИЯ И ОСОБЕННОСТЕЙ
ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ............................6
1.1 Описание поставленной проблемы......................................................................6
1.1.1 Сюжет художественного произведения........................................................6
1.1.2 Персонажи художественного произведения.................................................6
1.2 Характеристика технологии объектного ориентированного
программирования.......................................................................................................7
1.2.1 Классические принципы ООП.......................................................................7
1.2.2 Принципы SOLID............................................................................................8
1.2.3 Паттерны проектирования объектно-ориентированных программ............9
Выводы по разделу.................................................................................................12
2 РАЗРАБОТКА UML ДИАГРАММ ПРОЕКТИРУЕМОГО ПРОГРАММНОГО
КОМПЛЕКСА................................................................................................................13
2.1 Характеристика языка UML................................................................................13
2.2 Разработка диаграммы сценариев программируем..........................................13
2.3 Разработка диаграммы классов...........................................................................14
2.4 Разработка диаграммы последовательностей...................................................15
Выводы по разделу....................................................................................................16
3 РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ............................................17
3.1 Выбор о обоснование паттернов проектирования для использования в
программе...................................................................................................................17
3.2 Выбор инструментального языка для разработки программы........................17
3.3 Описание структуры программного комплекса................................................17
3.4 Входная и выходная информация для работы программы..............................18
Выводу по разделу.....................................................................................................18

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
Разраб. Галюзин А.А. Лит. Лист Листов
Провер. Стоянченко С.С.
Реценз.
СОДЕРЖАНИЕ
Н. Контр. Кафедра И и УС
Утверд. .
4

ЗАКЛЮЧЕНИЕ.............................................................................................................19
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ....................................................20
ПРИЛОЖЕНИЕ А.........................................................................................................21
ПРИЛОЖЕНИЕ Б..........................................................................................................23

Лист
КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
5

ВВЕДЕНИЕ

Работа направлена на освоение практических навыков работы в сферах,


связанных с основными разделами дисциплины "Объектноориентированное
программирование", закрепление принципов разработки компьютерных
программ, знаний языка C++, развитие практических навыков программирования
объектно-ориентированных приложений.

Цель работы - разработка компьютерной программы на языке С++ с


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

Задачи работы:
А) анализ методической литературы по заданной теме;
Б) моделирование отношений между объектами по заданному сюжету;
В) разработка программы;
Г) оформление вывода по работе.
Для решения данных задач использованы следующие методы исследования:
анализ, сравнение, систематизация, обобщение теоретических данных, синтез.

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
Разраб. Галюзин А.А. Лит. Лист Листов
Провер. Стоянченко С.С.
Реценз.
ВВЕДЕНИЕ
Н. Контр. Кафедра И и УС
Утверд. .
6

1 АНАЛИЗ ЗАДАЧИ КУРСОВОГО ПРОЕКТИРОВАНИЯ И ОСОБЕННОСТЕЙ


ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

1.1 Описание поставленной проблемы

1.1.1 Сюжет художественного произведения

Таблица 1.1
Сюжет кратко или
1. Мать отправляет Красную
шапочку в лес, навестить свою
больную бабушку
2. Девочка встречает Серого
волка, которому рассказывает о
бабушке и дороге к ее дому.
3. Волк бежит вперед, и, а) Девочка отправилась в лес к
притворившись Красной бабушке
шапочкой, проникает в дом, где б) Плохая встреча
съедает бабушку. в) Волк стал бабушкой
4. Красная шапочка приходит к г) Встреча бабушки и Красной шапочи
бабушке, и удивляется ее д) Красной шапочку съели
рукам, голосу и зубам. е) Освобождение шапочки и бабушки
5. Волк съедает Красную
шапочку.
6. Дровосеку убивают Волка и
выпускают наружу живых
бабушку и Красную шапочку.

1.1.2 Персонажи художественного произведения

1. Красная шапочка. Добрая и отзывчивая девочка, неосторожная,


доверчивая.
2. Серый волк. Коварный обманщик и злодей.
3. Бабушка. Больная старушка.

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
Разраб. Галюзин А.А. Лит. Лист Листов
АНАЛИЗ ЗАДАЧИ
Провер. Стоянченко С.С.
Реценз.
КУРСОВОГО
Н. Контр. ПРОЕКТИРОВАНИЯ Кафедра И и УС
Утверд. .
7

Рисунок 1.1 - Иллюстрация к сюжету произведения

1.2 Характеристика технологии объектного ориентированного


программирования

1.2.1 Классические принципы ООП

1. Наследование — механизм, который позволяет описать новый класс на


основе существующего. При этом свойства и функциональность
родительского класса заимствуются новым классом.
2. Абстракция. Абстракция означает выделение главных, наиболее
значимых характеристик предмета и наоборот — отбрасывание
второстепенных, незначительных.
3. Инкапсуляция — свойство языка программирования, позволяющее
пользователю не задумываться о сложности реализации используемого
программного компонента.
4. Полиморфизм. Полиморфизм — это возможность работать с
несколькими типами так, будто это один и тот же тип.
8

1.2.2 Принципы SOLID


a) Принцип единственной ответственности. Один класс должен решать только
какую-то одну задачу. Он может иметь несколько методов, но они должны
использоваться лишь для решения общей задачи. Все методы и свойства
должны служить одной цели. Если класс имеет несколько назначений, его
нужно разделить на отдельные классы.
b) Принцип открытости/закрытости . Программные сущности (классы, модули,
функции и прочее) должны быть расширяемыми без изменения своего
содержимого. Если строго соблюдать этот принцип, то можно регулировать
поведение кода без изменения самого исходника.
c) Принцип подстановки Барбары Лисков. Любая реализация абстракции
(интерфейса) должна быть взаимозаменяемой в любом месте, в котором
принимается эта абстракция. По сути, когда мы используем в коде
интерфейсы, то используем контракт не только по входным данным,
принимаемым интерфейсом, но и по выходным данным, возвращаемым
разными классами, реализующими этот интерфейс. В обоих случаях данные
должны быть одного типа.
d) Принцип разделения интерфейса. Как и в случае с принципом единственной
ответственности, цель принципа разделения интерфейса заключается в
минимизации побочных эффектов и повторов за счёт разделения ПО на
независимые части.
e) Принцип инверсии зависимостей. Проще говоря: зависьте от абстракций, а не
от чего-то конкретного. Применяя этот принцип, одни модули можно легко
заменять другими, всего лишь меняя модуль зависимости, и тогда никакие
перемены в низкоуровневом модуле не повлияют на высокоуровневый.

1.2.3 Паттерны проектирования объектно-ориентированных программ

Singleton (одиночка). Допустим, нам нужно организовать линию связи


между каждым жителем города. Как вариант, мы можем просто протянуть кабель
от одного дома жителя к другому. Но масштабироваться такая система будет
9

очень плохо, для добавления одного нового жителя к сети потребуется снова
протягивать кабель к каждому старому. Чинить обрывы будет тоже не самой
простой задачей.
Здесь нам пригодится паттерн «Одиночка». Одиночкой в этом случае будет
телефонная станция, и все линии связи будут проходить через нее. Для
добавления нового жителя потребуется только протянуть кабель от его дома до
станции.
Но главное в одиночке то, что создав станцию один раз, ей может
пользоваться сколько угодно людей. Смысл в том, что когда вы скажете «Мне
нужна телефонная станция», вам ответят не «Нужно построить новую», а «Она
находится там-то».
Registry (реестр, журнал записей). Данный паттерн предназначен для
хранения записей, которые в него помещают и возвращения записей, которые у
него запрашивают. Если вернуться к примеру с телефонной станцией, она будет
являться реестром по отношению к телефонным номерам жителей.
Еще один пример одиночки-реестра – бухгалтерия. Фирма не создает
бухгалтерию каждый раз, когда она ей понадобится. В то же время, в бухгалтерии
хранятся записи обо всех сотрудниках фирмы, как в реестре.
Object pool (пул объектов). Этот паттерн также как и предыдущий, содержит
набор объектов, но не все они обязаны быть одиночками.
Multiton (пул «одиночек»). По сути данный паттерн – это реестр одиночек,
каждый из которых имеет имя, по которому к нему можно получить доступ
Factory (фабрика). Фабрика – достаточно точное название для этого
паттерна. Когда вам понадобится пакет сока, вы обращаетесь к фабрике с
соответствующим запросом, она в свою очередь копирует эталон и передает вам
его экземпляр. Что при этом происходит внутри фабрики и как она это делает вас
не беспокоит.
10

Также, фабрики зачастую создаются с учетом производства только одного


вида продукции. То есть, создавать фабрику по производству пакетов с соком с
учетом возможности создания автомобильных покрышек не рекомендуется.
Builder (строитель). Строитель по очень похож на фабрику, но вместо
копирования эталона, строитель содержит в себе весь сложный набор действий,
необходимый для производства. Скажем, на фабрике по производству
апельсинового сока, вы можете заказать только апельсиновый сок, в то время как
у строителя можно запросить березовый сок и он позаботиться как о содержимом
пакета, так и о наклейках и соответствующих надписях, которые вы тоже можете
изменять.
Prototype (прототип). Этот паттерн похож на фабрику, но только фабрика
здесь в самом объекте. К примеру, у вас в руках есть пустой пакет для сока,
которому вы говорите «Хочу ананасовый сок». Пакет в свою очередь копирует
себя и заполняет себя ананасовым соком.В данном случае, пакет является
прототипом и создает на своей основе другие объекты, с требуемыми вам
параметрами.
Factory method (фабричный метод). Данный паттерн является основой
фабрики. В действительности, при создании программы в первую очередь
создается фабричный метод, а на его основе уже создаются фабрики.
Допустим, фабрика производит пакеты с разными соками. Мы можем на
каждый вид сока сделать свою производственную линию, но это не эффективно.
Удобнее сделать одну линию по производству пакетов-основ, а разделение ввести
только на этапе заливки сока, который мы можем определять просто по названию
сока.
Для этого мы создаем основной отдел по производству пакетов-основ и
предупреждаем все подотделы, что они должны производить нужный пакет с
соком про простому «Надо» (т.е. каждый подотдел должен реализовать паттерн
«фабричный метод»). Поэтому каждый подотдел заведует только своим типом
сока и реагирует на слово «Надо».
11

Теперь, если нам потребуется пакет бананового сока, мы просто скажем


отделу по производству бананового сока «Надо», а он в свою очередь скажет
основному отделу по созданию пакетов сока: «Произведи свой обычный пакет, а
этот сок нужно туда залить».
Lazy initialization (отложенная инициализация). Предположим, вы работаете
в бухгалтерии и для каждого сотрудника вы должны подготавливать «отчет о
выплатах». Вы можете в начале каждого месяца делать этот отчет на всех
сотрудников, но некоторые отчеты могут не понадобиться, и тогда скорее всего
вы примените «отложенную инициализацию», то есть вы будете подготавливать
этот отчет только тогда, когда он будет запрошен начальством (вышестоящим
объектом). Однако начальство в любой момент времени может сказать что у него
этот отчет уже есть, но готов он уже или нет, оно не знает и знать не должно.
Данный паттерн служит для оптимизации ресурсов.
Dependency injection (внедрение зависимости). Если нам требуется нанять
нового человека, мы можем не создавать свой отдел кадров, а внедрить
зависимость от компании по подбору персонала. Она, свою очередь, по нашему
запросу «нужен человек», будет либо сама работать как отдел кадров, либо же
найдет другую компанию, которая предоставит данные услуги. «Внедрение
зависимости» позволяет перекладывать и взаимозаменять отдельные части
программы без потери общей функциональности.

Выводы по разделу

1. Таким образом, ООП представлено в виде совокупности объектов.


2. Для того чтобы максимально точно охарактеризовать объект, удобно
использовать принципы ООП.
3. С помощью ООП можно реализовать сюжет сказки “Красная шапочка “.
12

2 РАЗРАБОТКА UML ДИАГРАММ ПРОЕКТИРУЕМОГО ПРОГРАММНОГО


КОМПЛЕКСА

2.1 Характеристика языка UML


UML – это унифицированный графический язык моделирования для
описания, визуализации, проектирования и документирования ОО систем. UML
призван поддерживать процесс моделирования ПС на основе ОО подхода,
организовывать взаимосвязь концептуальных и программных понятий, отражать
проблемы масштабирования сложных систем. Модели на UML используются на
всех этапах жизненного цикла ПС, начиная с бизнес-анализа и заканчивая
сопровождением системы. Разные организации могут применять UML по своему
усмотрению в зависимости от своих проблемных областей и используемых
технологий.

2.2 Разработка диаграммы сценариев программируем


Диаграмма вариантов использования - диаграмма, на которой отражены
отношения, существующие между актёрами и вариантами использования.
Основная задача - представлять собой единое средство, дающее
возможность заказчику, конечному пользователю и разработчику совместно
обсуждать функциональность и поведение системы.

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
v
Разраб. Галюзин А.А. Лит. Лист Листов
Провер. Стоянченко С.С.
Реценз.
РАЗРАБОТКА
Н. Контр. ПРОГРАММНОГО Кафедра И и УС
Утверд. . ОБЕСПЕЧЕНИЯ
13

Рисунок 2.1 – Диаграмма сценариев


2.3 Разработка диаграммы классов

Класс (class)- категория вещей, которые имеют общие атрибуты и


операции.

Классы - это строительные блоки любой объектно-ориентированной


системы. Они представляют собой описание совокупности объектов с общими
атрибутами, операциями. При проектировании объектно-ориентированных систем
диаграммы классов обязательны.
Классы используются в процессе анализа предметной области для
составления словаря предметной области разрабатываемой системы. Это могут
быть как понятия предметной области, так и классы, из которых строится
14

программная система и которые описывают программные сущности. Диаграмма


классов - это набор статических, декларативных элементов модели.
Класс на диаграмме изображается в виде прямоугольника, разделенного
горизонтальными линиями на три части. В первой части указывается название
класса. Вторая часть содержит перечень атрибутов класса, которые
характеризуют тот или иной объект этого класса в модели предметной области.
Третья часть содержит перечень операций, отражающих его поведение в модели
предметной области. Пользователю о внутреннем устройстве классов знать не
нужно. Сокрытие от пользователя внутреннего устройства объектов называется
инкапсуляцией. Иначе говоря, инкапсуляция - это защита отдельных элементов
объекта, не затрагивающих существенных характеристик его как целого.

Рисунок 2.2 – Диаграмма классов


2.4 Разработка диаграммы последовательностей
Диаграммы последовательностей, обычно используемые разработчиками,
моделируют взаимодействия между объектами в едином сценарии использования.
Они иллюстрируют, как различные части системы взаимодействуют друг с
другом для выполнения функции, а также порядок, в котором происходит
взаимодействие при выполнении конкретного случая использования.
15

Проще говоря, диаграмма последовательности показывает различные части


работы системы в “последовательности”, чтобы что-то сделать.

Рисунок 2.3 – Диаграмма последовательности действий


Выводы по разделу
1. UML позволяет визуализировать код программы.
2. Для того чтобы понять сценарий и реализовать сказку удобно
пользоваться диаграммой сценариев.
3. Диаграмма классов позволяет понять суть работы классов в программе.
16

3 РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

3.1 Выбор и обоснование паттернов проектирования для использования в


программе

Паттерн "Команда" (Command) позволяет инкапсулировать запрос на


выполнение определенного действия в виде отдельного объекта. Этот объект
запроса на действие и называется командой. При этом объекты, инициирующие
запросы на выполнение действия, отделяются от объектов, которые выполняют
это действие.
Абстрактная фабрика — это порождающий паттерн проектирования,
который решает проблему создания целых семейств связанных продуктов, без
указания конкретных классов продуктов.

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

Visual Studio 2019 - полнофункциональная и расширяемая интегрированная


среда разработки для создания современных приложений для Android, iOS и
Windows, а также веб-приложений и облачных служб.
С помощью данной среды разработки удается реализовать задуманный код.

3.3 Описание структуры программного комплекса

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


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

Типовая структура программного продукта состоит из отдельных


программных модулей и библиотек процедур, встроенных функций, объектов и
т.п.
Среди множества модулей различают:
- головной модуль - управляет запуском программного продукта
(существует в единственном числе);
- управляющий модуль - обеспечивает вызов других модулей на обработку;
- рабочие модули - выполняют функции обработки;
- сервисные модули и библиотеки, утилиты - осуществляют
обслуживающие функции.
В работе программного продукта активизируются необходимые
программные модули. Управляющие модули задают последовательность вызова
на выполнение очередного модуля. Информационная связь модулей
обеспечивается за счет использования общей базы данных либо межмодульной
передачи данных через переменные обмена.
Роль каждого персонажа реализуется отдельными классами.
Взаимодействие между ними реализуется по средствам паттерна Команда.

3.4 Входная и выходная информация для работы программы

Входная информация:
1. Сюжет сказки
2. Принцип работы программы
Выходная информация:
1. Реализация сюжета сказки
2. ФИО разработчика

Выводы по разделу

1. С помощью паттернов можно улучшить работу программы.


2. Объекты, функции, процедуры помогают реализовать задуманный код.
18

ЗАКЛЮЧЕНИЕ

В ходе курсовой работы получилось реализовать сказку «Красная шапочка»


в программном коде на языке программирования С++.
Код содержит виртуальные классы, имеет больше 6 классов.
Используются различные виды доступа к полям и методам.
Используется паттерны Наблюдатель и Фабричный метод.
Используются конструкторы различных видов.
Код реализован по всем требованиям курсовой работы.

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
Разраб. Галюзин А.А. Лит. Лист Листов
Провер. Стоянченко С.С.
Реценз.
ЗАКЛЮЧЕНИЕ
Н. Контр. Кафедра И и УС
Утверд. .
19

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


1. Андрей Александреску. Современное проектирование на C++.
Обобщенное программирование и прикладные шаблоны проектирования.
Перевод с английского — Издательский дом «Вильямс», 2002 г. 336 с.
2. Страуструп Язык программирования С++. Специальное издание. Пер. с
англ. — М.: Издательство Бином, 2011 г. — 1136 с.
20

ПРИЛОЖЕНИЕ А
1. Диаграмма сценария

2. Диаграмма классов

КР. ИТ-991.077.04.00
Изм. Лист № докум. Подпись Дата
Разраб. Галюзин А.А. Лит. Лист Листов
Провер. Стоянченко С.С.
Реценз.
ПРИЛОЖЕНИЕ
Н. Контр. Кафедра И и УС
Утверд. .
21

3. Диаграмма последовательности
22

ПРИЛОЖЕНИЕ Б

#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
void avt(int& s)
{

if (s==0) { cout << "Жили-были старик да старуха, у них


была дочка Алёнушка да сынок Иванушка.Старик со старухой
умерли.Остались Алёнушка да Иванушка одни -
одинёшеньки."<<endl;
cout<<"Пошла Алёнушка на работу и братца с собой
взяла.Идут они по дальнему пути, по широкому полю, и
захотелось Иванушке пить." << endl; }
if (s == 1) { cout << "Шли-шли — солнце высоко, колодец
далеко, жар донимает, пот выступает. Стоит коровье копытце
полно водицы." << endl;
}
if (s == 2) {
cout << "Братец послушался, пошли дальше. Солнце
высоко, колодец далеко, жар донимает, пот выступает.Стоит
лошадиное копытце полно водицы." << endl;
}
if (s == 3) {
cout << "Вздохнул Иванушка, опять пошли дальше. Идут,
идут — солнце высоко, колодец далеко, жар донимает, пот
выступает.Стоит козье копытце полно водицы." << endl;
}
if (s == 4) {
cout << "Не послушался Иванушка и напился из козьего
копытца. Напился и стал козлёночком…" << endl;
cout << "Зовёт Алёнушка братца, а вместо Иванушки бежит
за ней беленький козлёночек. Залилась Алёнушка слезами,
села под стожок — плачет," << endl;
cout<<"а козлёночек возле неё скачет. В ту пору
ехал мимо купец : " << endl;

}
if (s == 40) {
23

cout << "Рассказала ему Алёнушка про свою беду." <<


endl;
}
if (s == 400) {
cout << "Аленушка подумала, подумала и пошла за купца
замуж. Стали они жить - поживать, и козлёночек с ними
живёт, ест - пьет с Алёнушкой из одной чашки." <<endl;
cout << "Один раз купца не было дома.Откуда ни
возьмись, приходит ведьма : стала под Аленушкино окошко и
так - то ласково начала звать ее купаться на реку." <<
endl;
cout << "Привела ведьма Алёнушку на реку.Кинулась
на неё, привязала Алёнушке на шею камень и бросила её в
воду.А сама оборотилась Алёнушкой," << endl;
cout<<"нарядилась в ее платье и пришла в её
хоромы.Никто ведьму не распознал.Купец вернулся — и тот не
распознал. Одному козленочку всё было ведомо."<<endl;
cout<<"Повесил он голову, не пьёт, не ест.Утром и
вечером ходит по бережку около воды и зовёт : " << endl;
}
if (s == 5) {
cout << "Узнала об этом ведьма и стала просить мужа —
зарежь да зарежь козлёнка… " << endl;
cout<<"Купцу жалко было козлёночка, привык он к
нему.А ведьма так пристаёт, так упрашивает, — делать
нечего, купец согласился " << endl;
}
if (s == 6) {
cout << "Велела ведьма разложить костры высокие, греть
котлы чугунные, точить ножи булатные." << endl;
cout<<"Козлёночек проведал, что ему недолго жить, и говорит
названому отцу : " << endl;
}
if (s == 60) {
cout << "Побежал козлёночек па речку, стал на берегу и
жалобнехонько закричал" << endl;
}
if (s == 7) {
cout << "А ведьма ищет козлёночка, не может найти и
посылает слугу" << endl;
}
if (s == 70) {
cout << "Пошёл слуга на реку и видит: по берегу бегает
козленочек и жалобнехонько зовёт" << endl;
24

}
if (s == 8) {
cout << "Слуга побежал домой и рассказал купцу про то,
что слышал на речке. Собрали народ, пошли на реку, " <<
endl;
cout << "закинули сети шелковые и вытащили Алёнушку
на берег. Сняли камень с шеи, окунули ее в ключевую воду,
одели ее в нарядное платье." << endl;
cout << "Алёнушка ожила и стала краше, чем была. А
козлёночек от радости три раза перекинулся через голову и
обернулся, мальчиком Иванушкой." << endl;
cout << "Ведьму привязали к лошадиному хвосту и
пустили в чистое поле." << endl;
}
}
void al(int& s)
{
cout << "Аленушка: ";
if (s == 0) {
cout << "Подожди, братец, дойдём до колодца." <<
endl;
}
if (s == 1) {
cout << "Не пей, братец, телёночком станешь!" <<
endl;
}
if (s == 2) {
cout << "Не пей, братец, жеребёночком станешь!" <<
endl;
}
if (s == 3) {
cout << "Не пей, братец, козлёночком станешь!" <<
endl;
}
if (s == 60) {
cout << "Ах, братец мой Иванушка! Тяжел камень на
дно тянет, Шёлкова трава ноги спутала, Жёлты пески на груди
легли." << endl;
}
if (s == 70) {
cout << "Ах, братец мой Иванушка! Тяжел камень на
дно тянет, Шёлкова трава ноги спутала, Жёлты пески на груди
легли." << endl;
}
25

}
void iv(int& s)
{
cout << "Иванушка: ";
if (s == 0) {
cout << "Сестрица Алёнушка, я пить хочу!" << endl;
}
if (s == 1) {
cout << "Сестрица Алёнушка, хлебну я из копытца!"
<< endl;
}
if (s == 2) {
cout << "Сестрица Алёнушка, напьюсь я из копытца!"
<< endl;
}
if (s == 3) {
cout << "Сестрица Алёнушка, мочи нет: напьюсь я из
копытца!" << endl;
}
if (s == 5) {
cout << "Алёнушка, сестрица моя!. Выплынь, выплынь
на бережок…" << endl;
}
if (s == 6) {
cout << "Перед смертью пусти меня на речку сходить,
водицы испить, кишочки прополоскать." << endl;
}
if (s == 60) {
cout << "Алёнушка, сестрица моя! Выплынь, выплынь
на бережок. Костры горят высокие, Котлы кипят чугунные,
Ножи точат булатные, Хотят меня зарезати!" << endl;
}
if (s == 70) {
cout << "Алёнушка, сестрица моя! Выплынь, выплынь
на бережок. Костры горят высокие," << endl;
cout<<"Котлы кипят чугунные, Ножи точат булатные, Хотят
меня зарезати!" << endl;
}
}
void kup(int& s)
{
cout << "Купец: ";
if (s == 4) {
cout << "О чём, красная девица, плачешь?";
26

}
if (s == 40) {
cout << "Поди за меня замуж. Я тебя наряжу в злато-
серебро, и козленочек будет жить с нами." << endl;
}
if (s == 6) {
cout << "Ну, сходи." << endl;
}

}
void ved(int& s){
cout << "Ведьма: ";
if (s == 5) {
cout << "Ну, зарежь его…" << endl;
}
if (s == 7) {
cout << "Пойди найди козлёнка, приведи его ко мне."
<< endl;
}
}
class Command{public:
virtual void handle() = 0;
};
class avtor : public Command
{
int& s;
public:
avtor(int& _s):s(_s){}

virtual void handle()


{
avt(s);
}
};
class alena : public Command
{
int& s;
public:
alena(int& _s) :s(_s) {}

virtual void handle()


{
al(s);
}
27

};
class ivan : public Command
{
int& s;
public:
ivan(int& _s) :s(_s) {}

virtual void handle()


{
iv(s);
}
};
class kupez : public Command
{
int& s;
public:
kupez(int& _s) :s(_s) {}

virtual void handle()


{
kup(s);
}
};
class vedma : public Command
{
int& s;
public:
vedma(int& _s) :s(_s) {}

virtual void handle()


{
ved(s);
}
};
class actor {
public:
virtual void info() = 0;
virtual ~actor() {}
};
class aIvan :public actor {
public:
void info() {
cout << "Молодой, непослушный, беззаботный. Стал
козленочком из-за того, что не слушал сестрицу.\n";
28

}
};
class aAlena :public actor {
public:
void info() {
cout << "Умная и работящая девушка, заботилась о
любимом брате. Доверчивая и безобидная. Очень красивая.\n";
}
};
class aVedma :public actor {
public:
void info() {
cout << "Злая и коварная, обманщица, жестокая.\n";
}
};
class aKupez : public actor {
public:
void info() {
cout << "Молодой и красивый, честный и
порядочный.\n";
}
};
class factory {
public:
virtual actor* make() = 0;//Чистая виртуальная функция
показывает, что в производстве будет метод make
virtual ~factory() {}//Виртуальный деструктор
};
class Ivan:public factory {
actor* make() {
return new aIvan; //Создаем объект
}
};
class Alena :public factory {
actor* make() {
return new aAlena;//Создаем объект
}
};
class Vedma :public factory {
actor* make() {
return new aVedma;//Создаем объект
}
};
class Kupez :public factory {
29

actor* make() {
return new aKupez;//Создаем объект
}
};
actor* foo(factory* value) {
return value->make();
}
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Галайда Вадим Юрьевич ИТ-991" << endl<<endl;
cout << "1 - СКАЗКА // 2 - ИНФОРМАЦИЯ О ГЕРОЯХ : "; int
i; cin >> i;
if (i == 1) {
int s = 0;
cout << "0-Продолжить ";
cin >> s;
avtor q(s); q.handle();//Вызов команды
ivan q1(s); q1.handle();
alena q2(s); q2.handle();
cout << "1-Продолжить ";
cin >> s;
q.handle();
q1.handle();
q2.handle();
cout << "2-Продолжить ";
cin >> s;
q.handle();
q1.handle();
q2.handle();
cout << "3-Продолжить ";
cin >> s;
q.handle();
q1.handle();
q2.handle();
cout << "4-Продолжить ";
cin >> s;
q.handle();
kupez q3(s); q3.handle(); s = s * 10; q.handle(); s
= s * 10; q.handle();
cout << "5-Продолжить ";
cin >> s;
q1.handle(); q.handle(); vedma q4(s); q4.handle();
cout << "6-Продолжить ";
30

cin >> s;
q.handle(); q1.handle(); q3.handle(); s = s * 10;
q.handle(); q1.handle(); q2.handle();
cout << "7-Продолжить ";
cin >> s;
q.handle(); q4.handle(); s = s * 10; q.handle();
q1.handle(); q2.handle();
cout << "8-Продолжить ";
cin >> s;
q.handle();
}
else {
Ivan m1; //Переменные для каждого подтипа
Alena m2; //Переменные для каждого подтипа
Kupez m3; //Переменные для каждого подтипа
Vedma m4;//Переменные для каждого подтипа
factory* ptr1 = &m1; //Указатель на объект нужного
типа
factory* ptr2 = &m2;//Указатель на объект нужного
типа
factory* ptr3 = &m3;//Указатель на объект нужного
типа
factory* ptr4 = &m4;//Указатель на объект нужного
типа
actor* Object1 = foo(ptr1); //Создали объект
actor* Object2 = foo(ptr2);//Создали объект
actor* Object3 = foo(ptr3);//Создали объект
actor* Object4 = foo(ptr4);//Создали объект
cout << "БРАТЕЦ ИВАНУШКА" << endl;
Object1->info(); //Вывели информацию.
cout << "СЕСТРИЦА АЛЕНУШКА" << endl;
Object2->info(); cout << "КУПЕЦ" << endl;//Вывели
информацию.
Object3->info(); cout << "ВЕДЬМА" << endl;//Вывели
информацию.
Object4->info();//Вывели информацию.
delete Object1; delete Object2;delete Object3;
delete Object4;//Почистили память
}return 0;}

Вам также может понравиться