danissimoae / OOP-Sem4-Makeev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Лабораторная работа 1. «Кнопки и Формы»

Тип приложения: GUI, desktop; язык: без ограничений.

Создание простейшего desktop-приложения с графическим интерфейсом пользователя (GUI) в любой среде (Visual Studio - Windows Forms Application или WPF; C++ Builder - VCL Application; С++ и Qt Framework и т.д.).

• Создание простейшего приложения с GUI o форма, меню, пункты меню o добавлять на форму разнообразные стандартные объекты и изучать их свойства, влияющие на внешний вид и поведение • Управление простейшими событиями (при происходящих событиях должна появляться какая-либо реакция приложения, позволяющая понять, что событие произошло) o нажатие/отпускание мыши, перемещение мыши, нажатие/отпускание клавиши o выбор пункта меню o перерисовка (как и для чего использовать событие Paint – обратите внимание, не надо делать программу Paint, надо разобраться, как использовать событие Paint: показать это событие в списке событий, разобраться, когда оно происходит и как его использовать) o таймер (как использовать событие таймера для организации задержек) o изменение размера окна (как и для чего использовать событие SizeChanged) • Управление событиями, влияние объектов друг на друга (при каком-либо событии, связанным с одним объектом, должно что-то меняться в другом объекте). • Управление событиями и обработчиками событий: один обработчик на несколько событий разных объектов (например, три различные кнопки, один обработчик, нажатая кнопка меняет цвет), программный вызов обработчиков (вызов метода-обработчика в программе), программный вызов событий (вызов методов типа PerformClick). • Управление свойствами объектов в design time и в runtime: выделить два главных свойства каждого объекта и научиться изменять их как до запуска программы, так и во время работы приложения. • Изучить (знать, для каких целей используются и как работают) все стандартные элементы управления: o В случае Visual Studio - Windows Forms Application: все компоненты с закладок «Стандартные элементы управления», «Контейнеры», плюс меню и таймер. o В случае C++ Builder - VCL Application: все компоненты с закладок «Standard», «Additional», «Win32», «System». o В остальных случаях – аналогичный набор основных компонент • Для всех стандартных компонентов из предыдущего пункта необходимо понять их назначение (для чего используется чаще всего), и выделить основное свойство (одно или два) или основной метод (например, для текстового поля ввода – свойство, хранящее текст, для выпадающего списка – список элементов и номер выбранного и т.д.). Необходимо у каждого типового компонента выделить его главные свойства (одно-два) и научиться манипулировать ими до запуска программы и во время её работы. • Динамическое создание и уничтожение объектов интерфейса: o создание элементов интерфейса как реакция на события: при нажатии мышкой на любое место на форме, должен создаваться объект любого типового класса (например, кнопка). Элемент обязательно должен иметь обработчик события (например, если создаются кнопки, то при нажатии на них должна появляться реакция)

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

Разработанное простейшее приложение должно содержать как можно больше (не меньше 15) разных (разнотипных, то есть не 15 кнопок!) взаимодействующих компонент. Необходимо уметь незамедлительно вносить необходимые изменения в программу по заданиям преподавателя вида: «При наведении мыши на такой-то объект должно происходить то-то и то-то с другим объектом».

Самые главные элементы, на которые необходимо обратить внимание и их свойства и события: кнопка (текст, нажатие, активность), текстовое поле (текст, изменение текста, активность), выпадающий список (текст, список элементов, номер выбранного списка, изменение выбранного элемента, активность), статический текст (текст), чекбокс (текст, признак выбранности, изменение выбранности, активность), радио-кнопка (текст, признак выбранности, изменение выбранности), панель (размеры), разделитель (привязка), список выбора (элементы, изменение выбранных элементов), закладки (активная закладка, переключение закладок) и т.д.

Главное в первой лабораторной - научиться технологии создания GUI-приложений, а для этого приложение должно быть максимально разнообразным, и наличие смысла в приложении – вторично и даже вредно. Грубо говоря, программа вообще может ничего полезного не делать, но лишь бы там было больше 15 (в идеале - как можно больше) разнообразных (разнотипных, разноклассовых) компонент и как можно более разнообразные события и варианты взаимодействий.

Лабораторная работа 2. «Объекты и Классы»

Тип приложения: консольное; язык: c++.

Определение и реализация тестовых классов, и написание программы, иллюстрирующей их использование (код, делающий нечто, и при этом обязательный отладочный вывод в консоль, для контроля того, какие методы вызываются – особенно важен отладочный вывод во всех конструкторах и деструкторах).

Лабораторная работа может включать несколько программ, не стоит пытаться писать все сразу в одну программу и строго последовательно. Например, сначала стоит написать определение и реализацию простого объекта, создать его статически и динамически, проверить вызов атрибутов и методов. Затем определить конструкторы и деструкторы и проверить их работу. Затем научиться определять классы-наследники. Затем научиться переопределять методы и создавать виртуальные методы (не требуется в этой лабораторной, но вдруг?) и проверить их использование, и так далее. Настоятельно не рекомендуется в качестве методов использовать переопределяемые операции (++, <<, >> и т.д.). Рекомендуемые объекты для манипуляций: геометрические фигуры (точки, линии, квадраты, круги, эллипсы), математические объекты (вектора, матрицы) и т.д. Нерекомендуемые объекты для манипуляций (преподаватель плохо разбирается в этой предметной области, да и надоело): Warrior, Weapon, HP, Damage, и т.д.

• Определения o классов o атрибутов, методов o классов-наследников o конструкторов (обязательно несколько: без параметров, с параметрами, с параметром-объектом того же класса), деструкторов o доступности атрибутов и методов (показать, как влияют модификаторы private, protected, public) • Реализация o методов объектов o реализация методов сразу в определении или после определения o конструкторов, деструкторов • Создание и использование (обращение к атрибутам, вызов методов) o статически создаваемых объектов («MyClass obj;») o динамически создаваемых объектов («MyClass *obj = new MyClass();») o объектов с помощью различных конструкторов (у каждого создаваемого объекта должны быть: конструктор без параметров, с параметрами, с параметром-объектом того же класса – конструктор копирования) o инициализация полей класса в списке инициализации конструктора o помещение объектов в переменные различных типов (объяснять, чем отличается MyBase * obj = new MyBase() от MyBase * obj = new MyDeriv()) o объектов классов-наследников (проверить и продемонстрировать, какие конструкторы классов при этом вызываются) o композиция объектов: атрибутом одного объекта класса A является другой объект класса B (не указатель!), инициализируемый в списке инициализации конструктора класса A; показать, когда этот объект класса B удаляется o композиция объектов: атрибутом одного объекта класса A является указатель на другой объект класса B, создаваемый в конструкторе класса A и уничтожаемый в деструкторе класса A; композируемые классы должны определяться отдельно (не один в другом); при композиции показать, в чем разница, если объект класса А хранит прямо объект класса В или указатель на объект класса В. • Уничтожение o статически созданных объектов o динамически созданных объектов o объектов классов-наследников (проверить и продемонстрировать, какие деструкторы классов при этом вызываются)

Лабораторная работа требует уверенного понимания и работы с указателями. Студенты должны четко понимать всё, что происходит при выполнении строки MyBase * obj = new MyDeriv() (создается переменная-указатель, создается объект в памяти и возвращается его адрес, этот адрес записывается в созданную переменную-указатель).

В рамках лабораторной работы необходимо написать достаточно примеров, чтобы разобраться и понимать, например, суть того, что будет, если: • в классе-предке есть конструктор и деструктор, а в классе-потомке нет ни того, ни того; что происходит при создании предка, при создании потомка? • в классе-предке и в классе потомке есть и конструкторы и деструкторы: в каком порядке они вызываются при создании и удалении объекта? • в переменную-указатель на базовый класс поместить объект-потомок: какие методы можно вызывать, какие нет?

Лабораторная работа 3. «Контейнер»

Тип приложения: консольное; язык: без ограничений.

Определение и реализация класса-контейнера разнообразных объектов (принадлежащих различным классам, имеющим общего предка), и написание программы, иллюстрирующей использование контейнера. Контейнер должен быть максимально универсальным, это не должен быть контейнер фигур, животных или любых других конкретных объектов; вы должны иметь возможность использовать его для хранения любых объектов, которые у вас в будущем могут появиться. Если умеете пользоваться шаблонами (дженериками и т.д.), используйте их; если не умеете – создавайте контейнер указателей на какой-то самый базовый класс, но этот класс должен быть максимально абстрактный. Предназначение контейнера – хранить объекты, которые в него помещаются. Для создаваемого контейнера вы должны тщательно продумать, как вы будете его использовать для хранения объектов, какие типовые действия вы будете с контейнером производить.

• Функции контейнера объектов o добавление объектов (в начало, в конец), вставка объектов (в середину) o изъятие объектов (с удалением самого объекта и без) o переход по объектам, если это применимо (текущий, предыдущий, последующий, проверка наличия) o получение очередного объекта из контейнера или объекта по индексу o поочередное обращение к каждому объекту контейнера; вызов функций, реализуемых всеми классами объектов контейнера • Функции основной программы: код, который в случайном порядке: o создаёт объекты o добавляет в контейнер o использует (для упрощённого вывода) o удаляет из контейнера

Контейнер должен представлять собой объект, создаваемый и используемый в основной программе. Контейнер должно вести себя (снаружи) или как массив, или как список (на выбор студента). Контейнер должно быть организовано внутри или как массив, или как список (на выбор студента). Студент должен понимать отличие двух предыдущих предложений. Основная программа должна демонстрировать использование основных функций контейнера и запускать цикл из 100, 1000 и 10000 случайных действий и подсчитывать время работы. Действия должны случайным образом выбираться из списка: создание и вставка в случайное место контейнера нового объекта, удаление и уничтожение случайного объекта, запуск любого метода у случайного объекта из контейнера.

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

Если вы затрудняетесь работать с одно- и двусвязными списками, не используйте их: цель работы в создании контейнера, а не в работе со списками. Если вы не работаете уверенно с template, не используйте их.

В контейнере не разрешается использование контейнеров STL, так как создание аналогичных классов и является основной задачей данной лабораторной работы.

Лабораторная работа 4. Часть 1 из 2: «Круги на форме»

Тип приложения: GUI; язык: без ограничений.

• Создать простейшее приложение с GUI, содержащее: o определение простейшего класса CCircle с координатами и постоянным радиусом; o форму с объектом для рисования (например, PaintBox); o два элемента checkbox для управления поведением • Реализовать следующее поведение: o при нажатии мышкой на форме создается новый объект CCircle с координатами нажатия и помещается в контейнер; o при событии Paint должны отрисовываться на форме все объекты из контейнера • Реализовать следующее поведение с выделением объектов: o хотя бы один объект из существующих на форме всегда является выделенным и отрисовывается отлично от других объектов; o выделенными могут быть несколько объектов; o выделение происходит при нажатии ЛКМ (левой клавиши мыши) на объект CCircle на форме; при нажатии на область формы, где пересекаются несколько кругов, могут выделяться они все или какой-то один из них o при нажатии на кнопку Del, все выделенные объекты должны удаляться o при выделении объекта с помощью ЛКМ и удерживаемой клавиши Ctrl, выделенными становятся несколько объектов o несколько изменяемых пользователем флагов (элементы checkbox) управляют логикой поведения:  checkbox для указания, работает ли клавиша Ctrl  checkbox для указания, выделяется только один объект при нажатии на их пересечение, или все, в которые попала мышка.

При работе над заданием обратите внимание на то, чтобы не нарушать инкапсуляцию объектов. Нельзя запрашивать у объектов их координаты и проверять, попала ли в них мышка – это должен решать сам объект. Нельзя запрашивать у объектов их координаты и рисовать их на форме – рисовать себя на форме должен сам объект, и так далее.

Лабораторная работа 4. Часть 2 из 2: «MVC»

Тип приложения: GUI; язык: без ограничений.

• Создать простейшее приложение с GUI, содержащее: o три целых числа A, B и C со значением в пределах от 0 до 100; o каждое из чисел должно отображаться и редактироваться в 3 разных компонентах: в textBox, numericUpDown, trackBar (или аналогичных в других языках), при этом редактирование числа в одном поле должно приводить к изменению отображения этого числа во всех других полях; o второе число всегда должно быть не меньше первого и не больше третьего; o приложение должно сохранять значения чисел между запусками (запоминать при закрытии и восстанавливать значения при открытии); • Разработанное приложение должно быть реализовано в стиле MVC: o хранение трёх чисел должно быть организовано в виде отдельного объекта-модели; o все пересчёты, проверки и сохранение должны выполняться в объекте-модели; o изменение A и C должно реализовывать разрешающее поведение (при нарушении ограничений порядка модель сама перестраивается, чтобы их выполнить, введённое пользователем значение A и C сохраняется) o изменение B должно реализовывать запрещающее поведение (при нарушении ограничений порядка модель откатывает внесённые пользователем изменения) или ограничивающее поведение (при нарушении ограничений порядка модель корректирует введённое значение так, чтобы оно было как можно ближе к заданному пользователем). • Пример макета приложения приведён ниже:

Лабораторная работа 5. «Жизненный цикл объектов С++ и Виртуальность»

Тип приложения: консольное; язык: c++.

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

• Определения o перекрываемых методов (показать на примере случай, когда вызывается перекрываемый метод, а когда наследуемый) o виртуальных методов, в т.ч. деструкторов (показать на примере, когда вызывается наследуемый виртуальный метод, а когда базовый) • Реализация o проверки на принадлежность некоторому классу o безопасного приведения типов (dynamic_cast)
o безопасного приведения типов (вручную) • Передача объектов как параметров в функции и возвращения объектов как результата из функции, контроль их жизненного цикла • Умные указатели unique_ptr и shared_ptr, их влияние на жизненный цикл объектов

About


Languages

Language:Python 70.4%Language:C++ 29.6%