Лабораторная работа №1

Вид материалаЛабораторная работа

Содержание


4. Варианты заданий
5. Контрольные вопросы
2. Содержание работы
3. Методические указания
4. Контрольные вопросы
1. Цель работы
3. Методические указания
3.2. Открытое хеширование
4. Варианты заданий
Подобный материал:
1   2   3

^ 4. Варианты заданий


1. Окружность.

2. Выпуклый четырехугольник.

3. Прямоугольник.

4. Квадрат.

5. Параллелограмм.

6. Трапеция.

7. Треугольник.

8. Ромб.


^ 5. Контрольные вопросы


1. Что такое пиксел?

2. Как хранится графическая информация?

3. Как перейти в графический режим? Как вернуться в текстовый режим?

4. Какие имеются средства обработки ошибок, возникающих при работе с графикой?

5. Как осуществить выбор шрифтов?

6. Как установить характер и толщину рисуемой линии?

7. Как установить стиль закраски?

8. Как открыть и закрыть окно на графическом экране?

9. Как получить максимальные значения координат точек по гори­зонтали и вертикали?

10. Как получить текущие координаты указателя позиции в системе координат окна?

11. Какие функции выполняют переустановку указателя позиции?

12. Как можно вывести текст в окно?

13. Как установить способ взаимодействия выводимых прямых линий?

14. Как заполнить цветом произвольную замкнутую фигуру?


Лабораторная работа №2


КЛАССЫ


1. Цель работы


Изучить средства работы с классами на языке С++ и средства разработки многофайловых программ.


^ 2. Содержание работы


1. Ознакомиться со следующими вопросами и понятиями: определение типа данных пользователя с помощью конструкции class, открытая и закрытая части описания класса, определение набора функций класса, интерфейс и реализация класса, реализация понятия модульности в языке С++. Изучить средства разработки многофайловых программ в интегрированной среде Borland C++.

2. Модифицировать программу, разработанную в лабораторной работе №1, так чтобы в ней был определен класс, реализующий понятие геометрической фигуры в графической системе.

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

2.2. Определить атрибуты, необходимые для реализации класса. Поместить атрибуты в закрытую часть описания.

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

Включить в разработанный класс функции

– устанавливающие и изменяющие геометрические и графические характеристики фигуры (set-функции);

– возвращающие геометрические и графические характеристики фигуры (get-функции);

– рисующую фигуру на экране;

– изменяющую положение фигуры на экране;

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

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

2.5. Учесть возможность возникновения ошибок (нулевой радиус, нарушение неравенства треугольника, другие ошибки задания фигуры, ошибки работы с графикой и др.).

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

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

5. Защитить лабораторную работу, ответив на вопросы преподавателя.


^ 3. Методические указания


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

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

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

На самом деле клиента не интересует, и не должно интересовать то, как реализовано выполнение контрактных обязательств. По крайней мере, пока сервер соблюдает свои обязательства.

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

В результате всего сказанного мы можем ввести понятия интерфейса и реализации. Интерфейс – это набор операций, используемый для специфицирования услуг, предоставляемых классом. Интерфейс отражает внешнее поведение объекта. Внутренняя реализация описывает представление этой абстракции и механизмы достижения желаемого поведения объекта.

Модулем называют набор связанных процедур вместе с данными, которые они обрабатывают.

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

В языке C++ модулями являются файлы, которые компилируются отдельно один от другого и затем объединяются в один исполняемый файл при помощи редактора связей.

Модульность – это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.

Иерархия – это упорядочение абстракций, расположение их по уровням.

Основными видами иерархических структур применительно к сложным сис­темам являются иерархии типа "является" и иерархии типа "имеет".

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

Важный элемент объектно-ори­ентированных систем и основной вид иерархии "является" – иерархия обобщения (наследования) (отношение родитель-потомок).

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

Иерархия "имеет" вводит отношение агрега­ции (целое/часть). В иерархии "имеет" некоторая абст­ракция находится на более высоком уровне, чем любая из использовавшихся при ее реализации.

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

Типизация – это способ защититься от использования объектов одного класса (типа) вместо другого, или, по крайней мере, управлять таким использова­нием.

Важным понятием объектно-ориентированного подхода в целом и языка С++ в частности является полиморфизм.

Полиморфизм – это способ присваивать различные значения (смыслы) одному и тому же сообщению. Смысл зависит от типа обрабатываемых данных.

Имеется несколько типов полиморфизма.

Принудительное приведение. Функция или оператор работает с несколькими различными типами, преобразуя их значения к требуемому типу.

Перегрузка. Функция или оператор вызывается на основе сигнатуры.

Параллелизм – это свойство, отличающее активные объекты от неактивных.

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


^ 4. Контрольные вопросы


1. Принцип абстрагирования:

а. В чем заключается принцип абстрагирования?

б. Что такое барьер абстракции, уровни абстракции?

в. В чем заключается принцип наименьшего удивления?

г. Что такое контрактная модель программирования?

д. Что такое сигнатура операции?

е. Что такое инвариант?


2. Инкапсуляция:

а. В чем заключается принцип инкапсуляции?

б. В чем смысл разделения класса на интерфейс и реализацию?

в. Что такое класс? Как он определяется? Как определяются операции для класса?

г. Как определяется открытая и закрытая части тела класса?

д. Что такое друг класса?


3. Модульность:

а. Что такое модуль?

б. В чем заключается принцип модульности?

в. Модульность на языке С++?

г. Какие существуют приемы эффективного разделения программы на модули?


4. Иерархичность:

а. В чем заключается принцип иерархичности?

б. Что такое иерархия «является»?

в. Что такое иерархия «имеет»?


5. Типизация:

а. В чем заключается принцип типизации?

б. Что такое полиморфизм?

в. Что такое принудительное приведение?

г. Что такое перегрузка?

д. Какие операторы приведения вы знаете?


6. В чем заключается принцип параллелизма?

7. В чем заключается принцип сохраняемости?


Лабораторная работа №3


ОБЪЕКТЫ


^ 1. Цель работы


Изучить понятие объекта, средства его создания и уничтожения.


2. Содержание работы


1. Ознакомиться со следующими вопросами и понятиями: множества, множества с дубликатами, словари, словари с дубликатами, открытое хеширование, использование конструкторов и деструкторов для создания и уничтожения объектов.

2. По предложенному преподавателем варианту разработать программу на языке С++, в которой был бы определен класс-контейнер для объектов класса, разработанного в предыдущей лабораторной работе. Контейнер должен быть реализован как динамическая структура данных. Разработать следующие функции-члены класса: конструктор, деструктор, функции для помещения объектов-фигур в контейнер, их удаления, поиска в контейнере, «распечатки содержимого» контейнера – вывода на экран информации о содержащихся в объекте-контейнере объектах.

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

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

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

5. Защитить лабораторную работу, ответив на вопросы преподавателя.


^ 3. Методические указания


3.1. Контейнеры


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

1. Множества. Каждый элемент множества является собственным ключом, и эти ключи уникальны. Поэтому два различных элемента множества не могут совпадать. Например, множество целых чисел может состоять из следующих элементов:

123

124

800

950

2. Множества с дубликатами. Множество с дубликатами отличается от просто множества только тем, что способно содержать несколько совпадающих элементов. Например, допустимо существование множества с дубликатами, в котором присутствуют следующие четыре элемента:

123

123

800

950

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

123 John

124 Mary

800 Alexander

950 Jim

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

123 John

123 Mary

800 Alexander

950 Jim


^ 3.2. Открытое хеширование


При реализации некоторых контейнеров возможно использовать открытое хеширование.

Ос­новная идея заключается в том, что потенциальное множество объектов (возможно, бесконеч­ное) разбивается на конечное число категорий. Для В категорий, пронумерованных от 0 до В-1, строится хеш-функция h такая, что для любого элемента х исходного мно­жества функция h(x) принимает целочисленное значение из интервала 0, ...,В-1, которое, естественно, соответствует классу, которому принадлежит элемент х. Эле­мент х часто называют ключом, h(x) – хеш-значением х, а категории – сегментами.

Массив, называемый таблицей сегментов и проиндексированный номерами сег­ментов 0, 1,...,В-1, содержит заголовки для В списков. Элемент х i-ro списка – это элемент исходного множества, для которого h(x) = i.


3.3. Объекты


Объект можно определить как осязаемую реальность, проявляющую четко наблюдаемое поведение. Объект моделирует часть окружающей действительности и таким образом суще­ствует во времени и пространстве. Объект обладает состоянием, поведением и идентичностью; структура и поведение схожих объектов определяет общий для них класс; термины "эк­земпляр класса" и "объект" взаимозаменяемы.

Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значе­ниями каждого из этих свойств. В число свойств входят атрибуты объекта и атрибуты всех его агрегированных частей.

Поведение – это то, как объект действует и реагирует; поведение выра­жается в терминах состояния объекта и передачи сообщений. Поведение объекта – это его наблюдаемая и проверяемая из­вне деятельность.

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

На практике типичный клиент совершает над объектами операции следующих ви­дов:

модификатор – это операция, которая изменяет состояние объекта;

селектор – это операция, считывающая состояние объекта, но не меня­ющая состояния;

конструктор – это операция создания объекта и/или его инициализации; в С++ конструктор имеет то же имя, что и класс;

деструктор – это операция, освобождающая ресурсы, которые использует объект, и/или разрушающая сам объект; в С++ имя деструктора состоит из имени класса, перед которым ставится знак "тильда" – "~".

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

Объекты могут создаваться следующим образом:

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

статический объект создается один раз, при запуске программы, и уничтожается один раз, при ее завершении;

объект в свободной памяти создается с помощью операции new и уничтожается с помощью операции delete;

объект-член создается как подобъект другого класса.

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

Операции, определенные вне классов, называют сво­бодными подпрограммами.

Идентичность – это такое свойство объекта, которое отличает его от всех других объектов.

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

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

Присваивание – это тоже копирование и в C++ его смысл мож­но изменять. Как и в случае копирующего конструктора, если оператор присва­ивания не переопределен явно, то по умолчанию объект копируется поэлементно.

Сами по себе объекты не представляют никакого интереса: только в процессе их взаи­модействия реализуется система. Отношения двух любых объектов основываются на предположениях, которы­ми один обладает относительно другого: об операциях, которые можно выполнять, и об ожидаемом поведении. Особый интерес для объектно-ориентированного анализа и проектирования представляют два типа отношений между объектами: связь и агрегация.

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

Перечислим следу­ющие четыре способа обеспечить видимость:

– сервер глобален по отношению к клиенту;

– сервер (или указатель на него) передан клиенту в качестве параметра операции;

– сервер является частью клиента;

– сервер локально порождается клиентом в ходе выполнения какой-либо операции.

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


^ 4. Варианты заданий


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

а. двунаправленного списка (обеспечить «распечатку» содержимого как в прямом, так и в обратном направлениях);

б. открытого хеширования (хеш-функцию построить, например, на основе атрибута «цвет», при поиске дополнительно указывать категорию);

в. дерева двоичного поиска.

2. Пусть все объекты класса, реализующего геометрическую фигуру, разделены на несколько категорий по значению некоторого признака (ввести в рассмотрение некоторый «нетривиальный» признак, либо считать отнесение фигуры к конкретной категории прерогативой пользователя). Разработать класс, реализующий понятие словаря с дубликатами, в качестве ключа использовать номер категории. Функция поиска ищет элементы определенной категории. Словарь реализовать на основе

а. двунаправленного списка (обеспечить «распечатку» содержимого как в прямом, так и в обратном направлениях);

б. открытого хеширования (хеш-функцию построить на основе номера категории);

в. дерева двоичного поиска.

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

а. двунаправленного списка (обеспечить «распечатку» содержимого как в прямом, так и в обратном направлениях);

б. открытого хеширования (хеш-функцию построить, например, на основе атрибута «цвет», при поиске дополнительно указывать категорию).

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

а. двунаправленного списка (обеспечить «распечатку» содержимого как в прямом, так и в обратном направлениях);

б. открытого хеширования (хеш-функцию построить, например, на основе атрибута «цвет», при поиске дополнительно указывать категорию).

5. На основе списка разработать класс, реализующий понятие

а. «открытого» стека;

б. «открытой» очереди;

в. «открытого» дека

(т.е. разрешается просматривать элементы в контейнере, осуществлять поиск). Функция поиска ищет фигуры с заданными геометрическими и/или графическими характеристиками.

6. Разработать класс, реализующий понятие словаря (см. задание к варианту 1). Словарь реализовать на основе

а. неупорядоченной таблицы;

б. упорядоченной таблицы;

в. закрытого хеширования.

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


7. Разработать класс, реализующий понятие словаря с дубликатами (см. задание к варианту 2). Словарь реализовать на основе

а. неупорядоченной таблицы;

б. упорядоченной таблицы;

в. закрытого хеширования.

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


8. Разработать класс, реализующий понятие

а. «открытого» стека;

б. «открытой» очереди;

в. «открытого» дека.

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