КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Общие требования ко всем лабораторным работам.
Лабораторная работа 1. «Кнопки и Формы» Тип приложения: GUI; язык: без ограничений. Создание простейшего приложения с графическим интерфейсом пользователя (GUI) в любой среде (Visual Studio - Windows Forms Application; C++ Builder - VCL Application).
В рамках лабораторной работы необходимо разобраться:
Также в рамках лабораторной работы необходимо изучить (знать, для каких целей используются и как работают) все стандартные элементы управления:
Для всех компонентов необходимо понять их назначение (для чего используется чаще всего), и выделить основное свойство или основной метод (например, для текстового поля ввода – свойство, хранящее текст, и т.д.). Разработанное простейшее приложение должно содержать как можно больше (не меньше 10) разных взаимодействующих компонент. Необходимо уметь незамедлительно вносить необходимые изменения в программу по заданиям преподавателя вида: «При наведении мыши на такой-то объект должно происходить то-то и то-то с другим объектом».
Лабораторная работа 2. «Объекты и Классы» Тип приложения: консольное; язык: c++. Определение и реализация тестовых классов, и написание программы, иллюстрирующей их использование (код, делающий нечто, и при этом обязательный отладочный вывод в консоль, для контроля того, какие методы вызываются – особенно важен отладочный вывод во всех конструкторах и деструкторах). Лабораторная работа должна включать несколько программ, не стоит пытаться писать все сразу в одну программу и строго последовательно. Например, сначала стоит написать определение и реализацию простого объекта, создать его статически и динамически, проверить вызов атрибутов и методов. Затем определить конструкторы и деструкторы и проверить их работу. Затем научиться определять классы-наследники. Затем научиться перекрывать методы и создавать виртуальные методы и проверить их использование, и так далее. Настоятельно НЕ рекомендуется в качестве методов использовать переопределяемые операции (++, <<, >> и т.д.). Рекомендуемые объекты для манипуляций: геометрические фигуры (точки, линии, квадраты, круги, эллипсы), математические объекты (вектора, матрицы) и т.д.
В рамках лабораторной работы необходимо написать достаточно примеров, чтобы разобраться и понимать, например, суть того, что будет, если:
Лабораторная работа 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; язык: без ограничений.
Лабораторная работа 5. «Виртуальность» Тип приложения: консольное; язык: c++. Определение и реализация тестовых классов, и написание программы, иллюстрирующей их использование. Лабораторная работа должна включать несколько программ, по мере изучения соответствующих понятий из лекционного курса, не стоит пытаться писать все сразу в одну программу и строго последовательно.
Для проверки на принадлежность некоторому классу необходимо реализовать:
Продемонстрировать опасное приведение типов и предварительную проверку типа с помощью реализованного метода 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, и передавать их в каждую из трех функций, объясняя при этом, когда и почему вызывается какой конструктор или деструктор.
В рамках лабораторной работы необходимо написать достаточно примеров, чтобы разобраться и понимать, например, суть того, что будет, если:
Проиллюстрировать примерами кода ответы на следующие вопросы:
Лабораторная работа 6. «Визуальный редактор» Тип приложения: GUI; язык: без ограничений. На основе Л.Р.4 реализовать простейший визуальный редактор векторных объектов (круг, квадрат, треугольник, отрезок, и т.д.) со следующей функциональностью:
Лабораторная работа 7. «Группировка и сохранение» Тип приложения: GUI; язык: без ограничений. Развитие приложения из Л.Р.6:
Функция хранилища, которая занимается сохранением объектов в некоторый файл, не должна знать о деталях организации сохраняемых объектов. Она должна вызывать виртуальную функцию save() у базового объекта, тем самым, предоставляя объекту самому возможность записать в файл то, что ему нужно для восстановления.
Примерный алгоритм сохранения хранилища в текстовый файл должен выглядеть так:
Самой сложной для реализации хранилища является функция восстановления объектов из хранилища. Понятно, что наряду с виртуальной функцией save() у базового объекта, у него должна быть и виртуальная функция load(). Однако проблема состоит в следующем. Пусть требуется загрузить очередной объект из хранилища. Надо вызвать метод load() у объекта, но объект ведь еще не создан! А объект какого класса необходимо создать, чтобы вызвать у него метод load()?
Примерный алгоритм загрузки содержимого хранилища из текстового файла должен выглядеть так:
Лабораторная работа 8. «Дерево объектов» Тип приложения: GUI; язык: без ограничений. Развитие приложения из Л.Р.7:
Объект TreeView должен уметь полностью перестроить свое содержимое исходя из текущего содержимого хранилища, в котором могут в произвольных комбинациях встречаться отдельные объекты и группы объектов. Для этого нужна рекурсивная функция processNode(TreeNode tn, StorageObject o), алгоритм работы которой в общих чертах выглядит так:
processNode(TreeNode tn, StorageObject o) { Создай у узла дерева tn новый дочерний узел t; Если объект o является группой, то: Для всех объектов oo из группы o: processNode(t, oo); }
Объект TreeView должен автоматически узнавать, когда в хранилище происходят изменения. Для этого в рамках паттерна Observer, объект TreeView должен «подписаться» на объект Storage и, получая уведомления, перестраивать свое содержимое при любых изменениях в объекте Storage. Выделенные объекты в дереве должны становиться выделенными объектами в хранилище и на рабочем поле и наоборот.
|