Студопедия

КАТЕГОРИИ:

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


Общие требования ко всем лабораторным работам.




  • Программные требования:
    • обязательны комментарии к коду, стиль отступов, именований переменных и функций (любой стиль PEP 7 или подобный)
    • отладочный вывод в консоль в большинстве методов (Л.Р.2,3,5)

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

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

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

 

  • Создание простейшего приложения с GUI
    • форма
    • меню, пункты меню
    • добавлять на форму разнообразные стандартные объекты и изучать их свойства, влияющие на внешний вид и поведение
  • Управление простейшими событиями (при происходящих событиях должна появляться какая-либо реакция приложения, позволяющая понять, что событие произошло)
    • нажатие мыши, перемещение мыши
    • выбор пункта меню
    • нажатие клавиши
    • перерисовка
  • Управление событиями, влияние объектов друг на друга (при каком-либо событии, связанным с одним объектом, должно что-то меняться в другом объекте)
  • Динамическое создание и уничтожение объектов интерфейса:
    • создание элементов интерфейса как реакция на события: при нажатии мышкой на любое место на форме, должен создаваться объект любого типового класса (например, кнопка).

 

В рамках лабораторной работы необходимо разобраться:

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

 

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

  • В случае Visual Studio - Windows Forms Application: все компоненты с закладок «Стандартные элементы управления», «Контейнеры».
  • В случае C++ Builder - VCL Application: все компоненты с закладок «Standard», «Additional», «Win32», «System».

 

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

 

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

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

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

Лабораторная работа должна включать несколько программ, не стоит пытаться писать все сразу в одну программу и строго последовательно. Например, сначала стоит написать определение и реализацию простого объекта, создать его статически и динамически, проверить вызов атрибутов и методов. Затем определить конструкторы и деструкторы и проверить их работу. Затем научиться определять классы-наследники. Затем научиться перекрывать методы и создавать виртуальные методы и проверить их использование, и так далее. Настоятельно НЕ рекомендуется в качестве методов использовать переопределяемые операции (++, <<, >> и т.д.).

Рекомендуемые объекты для манипуляций: геометрические фигуры (точки, линии, квадраты, круги, эллипсы), математические объекты (вектора, матрицы) и т.д.

 

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

 

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

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

 

Лабораторная работа 3. «Хранилище»

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

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

 

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

 

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

 

Если хранилище представляет собой массив, то работа с ним в основной программе должна выглядеть примерно так:

 

// создаем хранилище

MyStorage storage(10);

// добавляем в него объекты

for (int i=0; i<storage.getCount(); i++)

storage.setObject(i, new SomeObject());

// обращаемся поочередно ко всем

for (int i=0; i<storage.getCount(); i++)

storage.getObject(i).someMethod();

 

Если хранилище представляет собой список, то работа с ним в основной программе должна выглядеть примерно так:

 

// создаем хранилище

MyStorage storage();

// добавляем в него объекты

for (int i=0; i<10; i++)

storage.add(new SomeObject());

// обращаемся поочередно ко всем

for (storage.first(); !storage.eol(); storage.next())

storage.getObject().someMethod();

 

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

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

Лабораторная работа 4. «Круги на форме»

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

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

 

Лабораторная работа 5. «Виртуальность»

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

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

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

 

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

 

Для проверки на принадлежность некоторому классу необходимо реализовать:

  • базовый виртуальный метод string classname(), перекрыть его в потомках, проверить работу и показать, какие проблемы возникают при его использовании;
  • базовый виртуальный метод bool isA(string classname), перекрыть его в потомках и показать отличие от метода classname.

 

Продемонстрировать опасное приведение типов и предварительную проверку типа с помощью реализованного метода isA. Продемонстрировать использование стандартных средств языка (dynamic_cast в c++ или аналог на используемом языке).

 

Для проверки механизма передачи объектов как параметров в функции необходимо написать три функции:

 

void func1(Base obj) { ... };

void func2(Base *obj) { ... };

void func3(Base &obj) { ... };

 

Далее необходимо создать простой класс Base и его потомок Desc и реализовать в каждом из них три конструктора и по одному деструктору (в каждой из трех функций и во всех конструкторах должен быть отладочный вывод в консоль):

 

Base() { ... };

Base(Base *obj) { ... };

Base(Base &obj) { ... };

~Base() { ... };

 

Desc() { ... };

Desc(Desc *obj) { ... };

Desc(Desc &obj) { ... };

~Desc() { ... };

 

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

 

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

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

 

Проиллюстрировать примерами кода ответы на следующие вопросы:

  • Зачем нужны виртуальные методы?
  • Зачем нужна проверка на принадлежность некоторому классу?
  • Зачем и в каких случаях требуется производить безопасное приведение типов?

Лабораторная работа 6. «Визуальный редактор»

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

На основе Л.Р.4 реализовать простейший визуальный редактор векторных объектов (круг, квадрат, треугольник, отрезок, и т.д.) со следующей функциональностью:

  • Создание графических объектов на экране:
    • меню, панель инструментов с доступными классами объектов
    • добавление нового объекта в рабочую область
  • Манипуляции объектами в рабочей области:
    • выбор объекта для манипулирования (выделяется цветом или рамкой)
    • изменение цвета, размера, положения
    • удаление объекта из рабочей области
    • контроль выхода за рабочую область (при передвижении объект не должен выходить за границы ни одной своей частью)
  • Программные требования:
    • манипуляции объектами выполняются с помощью клавиатуры, при этом выбор клавиш управления должен быть как можно ближе к используемым обычно для таких задач в среде Windows
    • «хорошая» иерархия классов
    • использование своего хранилища объектов из Л.Р.3
    • отделение взаимодействия с пользователем от логики работы классов

 

Лабораторная работа 7. «Группировка и сохранение»

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

Развитие приложения из Л.Р.6:

  • Группировка, разгруппировка объектов и групп объектов (сгруппированные объекты изменяются только совместно). Реализация группировки объектов должна быть выполнена с помощью паттерна Composite:
    • выделение нескольких объектов в рабочей области и их группировка (с изъятием из хранилища и помещением в специальный объект класса Group, который затем обратно помещается в хранилище);
    • группа ведет себя как единый объект: перемещается, сохраняет относительное положение входящих в нее объектов, не выходит за границы;
    • в группу могут входить другие группы, и т.д.
  • Реализация сохранения и восстановления хранилища из Л.Р.3 с помощью паттерна Abstract Factory или Factory Method:
    • сохранение всех объектов хранилища в (человеко-читаемый) текстовый файл
    • восстановление всех объектов хранилища из текстового файла
  • Факультативно:
    • манипуляции объектами выполняются не только с помощью клавиатуры, но и с помощью мыши
    • реализация команд пользовательского интерфейса с помощью паттерна Command (с возможностью функциональности «undo» - отмены последовательности операций)
    • команды пользовательского интерфейса и типы объектов создаются с помощью подключаемых динамических библиотек (DLL)

 

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

 

Примерный алгоритм сохранения хранилища в текстовый файл должен выглядеть так:

  • Открой файл для записи
  • Сохрани в файл информацию о количестве объектов
  • Для каждого объекта хранилища:
    • Вызови функцию save()
  • Закрой файл

 

Самой сложной для реализации хранилища является функция восстановления объектов из хранилища. Понятно, что наряду с виртуальной функцией save() у базового объекта, у него должна быть и виртуальная функция load(). Однако проблема состоит в следующем. Пусть требуется загрузить очередной объект из хранилища. Надо вызвать метод load() у объекта, но объект ведь еще не создан! А объект какого класса необходимо создать, чтобы вызвать у него метод load()?

 

Примерный алгоритм загрузки содержимого хранилища из текстового файла должен выглядеть так:

  • Открой файл для чтения
  • Прочитай информацию о количестве объектов
  • Столько раз, сколько объектов нужно создать:
    • Узнай из файла, объект какого класса нужно создать
    • Создай объект этого класса
    • Вызови у объекта функцию load()
  • Закрой файл

 

Лабораторная работа 8. «Дерево объектов»

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

Развитие приложения из Л.Р.7:

  • Добавить на форму приложения объект TreeView для отображения текущего содержания хранилища
  • Реализовать синхронизацию объекта TreeView с хранилищем с помощью паттерна Observer

 

Объект TreeView должен уметь полностью перестроить свое содержимое исходя из текущего содержимого хранилища, в котором могут в произвольных комбинациях встречаться отдельные объекты и группы объектов. Для этого нужна рекурсивная функция processNode(TreeNode tn, StorageObject o), алгоритм работы которой в общих чертах выглядит так:

 

processNode(TreeNode tn, StorageObject o)

{

Создай у узла дерева tn новый дочерний узел t;

Если объект o является группой, то:

Для всех объектов oo из группы o:

processNode(t, oo);

}

 

Объект TreeView должен автоматически узнавать, когда в хранилище происходят изменения. Для этого в рамках паттерна Observer, объект TreeView должен «подписаться» на объект Storage и, получая уведомления, перестраивать свое содержимое при любых изменениях в объекте Storage. Выделенные объекты в дереве должны становиться выделенными объектами в хранилище и на рабочем поле и наоборот.


Поделиться:

Дата добавления: 2015-09-15; просмотров: 186; Мы поможем в написании вашей работы!; Нарушение авторских прав


<== предыдущая лекция | следующая лекция ==>
СТАТИСТИЧЕСКАЯ ОТЧЕТНОСТЬ | Зачисление на расчетный счет денежных средств, полученных от покупателей за реализованную продукцию, отражается бухгалтерскими записями;
lektsii.com - Лекции.Ком - 2014-2024 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты