му паскаль и делфи. Методические рекомендации для студентов по выполнению практических работ для специальности 09. 02. 03 Программирование в компьютерных системах
Скачать 2.13 Mb.
|
2 ВЫПОЛНЕНИЕ РАБОТЫ В работе требуется внимательно рассмотреть и разобрать приведенные примеры. 3 ФОРМА ОТЧЕТА Отчет должен содержать ответы на вопросы. 4 КОНТРОЛЬНЫЕ ВОПРОСЫ Дать определение абстракции. Что такое класс? Объясните различие терминов класс и объект. Для чего используются абстрактные модели? Дать определение понятию «инкапсуляция» Дать определение понятию «методы» Формат записи класса Объясните решение данного в работе упражнения Дать определение понятию «модульность» Дать определение понятию «иерархия». Определить ее виды. Практическая работа № 7 Полиморфизм. Полиморфные объекты. Цель работы: ознакомиться с понятием ООП полиморфизм. 1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ В ООП возможна статическая и динамическая связь имени объекта и его типа. В первом случае это означает определение типов переменных во время компиляции. Во втором — тип выражения определяется во время исполнения приложения. Из принципов динамической связи и наследования вытекает очень важное свойство, присущее объектам — полиморфизм. Полиморфизм — это выделение некоторого действия, т. е. действие должно иметь имя, и создание средств использования действия объектами иерархии, причем каждый класс реализует это действие так, как оно для него подходит. Итак, при создании иерархии классов может обнаружиться, что некоторые свойства объектов, сохраняя название, изменяются по сути. Для реализации таких иерархий должен быть предусмотрен полиморфизм, обеспечивающий возможность задания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии. В ООП такой полиморфизм называется простым, а методы, имеющие одинаковое название, — статическими полиморфными. В ранее рассмотренных упражнениях статическим полиморфным методом является, например, конструктор Create. Совокупность полиморфных методов с одним именем для иерархии классов образует единый полиморфный метод иерархии, в котором реализация полиморфного метода для конкретного класса представляет отдельный аспект. Сложный полиморфизм. Полиморфными объектами, или полиморфными переменными, называются переменные, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной. В языках со строгой типизацией такая ситуация может возникнуть: при передаче объекта типа класса-потомка в качестве фактического параметра подпрограмме, в которой этот параметр описан как параметр типа класса-родителя (явно — в списке параметров или неявно — в качестве внутреннего параметра, используемого при вызове методов — Self); при работе с указателями, когда на объект класса-родителя присваивается адрес объекта класса-потомка. Тип полиморфного объекта становится известным только на этапе выполнения программы, соответственно, при вызове полиморфного метода для такого объекта нужный аспект также должен выполняться на этапе выполнения. Для этого в языке должен быть реализован механизм позднего связывания, позволяющий определять тип объекта и аспект полиморфного метода, к которому идет обращение в программе, на этапе ее выполнения. С помощью механизма позднего связывания реализуется оперативная перестройка программы в соответствии с типами используемых объектов. Реализация динамической связи для объектов, имеющих хотя бы один виртуальный метод, осуществляется с помощью таблицы виртуальных методов (ТВМ). Она содержит адреса виртуальных методов. Для каждого класса вовремя компиляции программы строится одна ТВМ. Формирование связи между экземпляром класса (объектом) и ТВМ осуществляет конструктор. Отметим, что методы, работающие с полиморфными объектами — это всегда методы классов-предков, описывающие общие моменты поведения объектов. В сложной иерархии, таким образом, можно выделить семейство классов со схожим поведением объектов. Они образуют поддеревья, в корне которых находится класс, определяющий общие моменты поведения. Итак, мы смогли исключить метод Move из описания класса TCircle, сделав его полиморфным. Все объекты классов TPoint и TCircle будут использовать его, причем так, как им это необходимо. Сформулируем правила, которые важно выполнять при работе с виртуальными методами: если в некотором классе метод описан как виртуальный, то все производные классы, включающие метод с тем же именем, должны описать этот метод как полиморфный (override). Нельзя заменить виртуальный метод статическим; порядок расположения, количество и типы формальных параметров в одноименных виртуальных методах должны оставаться неизменными. В дополнении к виртуальным методам, для реализации полиморфизма в Object Pascal используются динамические методы. По возможностям наследования и перекрытия они аналогичны виртуальным методам, но доступ к ним выполняется через таблицу динамических методов (ТДМ). ТДМ хранит адреса только тех динамических методов, которые определены в данном классе. Такой подход позволяет снизить расход памяти при большом количестве этих методов и самих классов. На каждый динамический метод приходится только одна ссылка, представленная индексом, по которому и происходит поиск метода для вызова. Для объявления метода динамическим используется директива dynamic. Перекрытие динамических методов производится так же, как и виртуальных — с использованием ключевого слова override. Абстрактные методы Абстрактные методы используются при объявлении методов, реализация которых откладывается. Такие методы в классе описываются служебным словом abstract и обязательно переопределяются в потомках класса. Класс, в состав которого входят методы с отложенной реализацией, называется абстрактным. Создавать объекты абстрактных классов запрещается. Упражнение 2 Разработайте родительский класс для рисования геометрических фигур. Решение Выделим минимальный объем свойств и методов, которые определяют все геометрические фигуры. Во-первых, это точка, относительно которой будет определяться положение фигуры на экране. Во-вторых, это цвет отображаемой геометрической фигуры. Кроме того, определим методы: скрыть, отобразить, переместить геометрическую фигуру. Суть метода переместить остается прежней: Скрыть; Задать новое расположение геометрической фигуры; Отобразить; Методы скрыть и отобразить для каждой геометрической фигуры будут определять по-своему, поэтому необходимо объявить их виртуальными и абстрактными. Параллелизм — свойство нескольких абстракций одновременно находиться в активном состоянии, т. е. выполнять некоторые операции. Есть задачи, в которых автоматические системы должны обрабатывать много событий одновременно. В других случаях потребность в вычислительной мощности превышает ресурсы одного процессора. В каждой из таких ситуаций естественно использовать несколько компьютеров для решения задачи или задействовать многозадачность на многопроцессорном компьютере. Процесс — это фундаментальная единица действия в системе. Каждая программа имеет по крайней мере один поток управления, параллельная система, имеет много таких потоков: длительность существования одних недолго, а другие живут в течение всего сеанса работы системы. Реальная параллельность достигается только на многопроцессорных системах, а системы с одним процессором имитируют параллельность за счет алгоритмов разделения времени. Сохраняемость — это способность абстракции существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. Любой программный объект существует в памяти и живет в течение некоторого времени. Спектр сохраняемости объектов охватывает: временные объекты, хранящие промежуточные результаты вычисления выражений; локальные объекты, существующие внутри подпрограмм, время жизни которых исчисляется от вызова подпрограммы до ее завершения; глобальные объекты, существующие, пока программа загружена в память; сохраняемые данные, которые сохраняются в файлах внешней памяти между сеансами выполнения программы. Композиция и наполнение В результате объектной декомпозиции второго и далее уровней могут получиться объекты, находящиеся между собой в отношении включения. Классы для реализации таких объектов могут строиться двумя способами: с использованием наследования или композиции. Наследование применяется тогда, когда разрабатываемый класс имеет с исходным сходную структуру и элементы поведения. В тех случаях, когда сходное поведение не просматривается или наследование по каким-то причинам нецелесообразно, можно использовать композицию классов. Композицией называется такое отношение между классами, когда один является частью второго. Композиция реализуется включением в класс поля, являющегося объектом другого класса. Такие поля называют объектными. Включение объектов в некоторый класс можно реализовать и с использованием указателей на объекты. 2 ВЫПОЛНЕНИЕ РАБОТЫ В работе требуется внимательно рассмотреть и разобрать приведенные примеры. 3 ФОРМА ОТЧЕТА Отчет должен содержать ответы на вопросы. 4 КОНТРОЛЬНЫЕ ВОПРОСЫ Перечислите этапы объектной декомпозиции. Что такое полиморфизм? Приведите пример, демонстрирующий необходимость определения полиморфного метода. Простой полиморфизм. Статический полиморфный метод. Сложный полиморфизм. Таблица виртуальных методов. Параллелизм. Процесс, сохраняемость. В чем сходство и отличие методов, описанных как виртуальные и динамические? Для чего используются абстрактные методы? Композиция и наполнение. Практическая работа № 8 Изучение интегрированной среды разработчика. Цель работы: ознакомиться с интегрированной средой программы. 1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Во времена DOS, которые уже стали историей, программисты стояли перед нелегким выбором между продуктивным, но неэффективным Basic и эффективным, но непродуктивным ассемблером. Появление компилятора Turbo Pascal во многом разрешило их проблемы. Программисты, работающие под Windows 3.1, оказались перед схожей проблемой: что выбрать— мощный, но требующий знаний C++, или простой, но крайне ограниченный Visual Basic (VB). С появлением в 1995 г. Delphi 1 возник новый подход к разработке приложений в среде Windows: простой язык, визуальная разработка приложений, создание откомпилированных выполняемых файлов, динамических библиотек и многое другое. Delphi 1 был первым инструментом разработки Windows-приложений, объединившим в себе оптимизирующий компилятор, визуальную среду программирования и мощные возможности для работы с базами данных. В 1996 г. появилась версия Delphi 2, предназначенная для разработки приложений для 32-разрядных операционных систем Windows 95 или Windows NT. Delphi 3 вышла в 1997 г. В этой версии Delphi был расширен набор инструментов для разработки Windows-приложений, упрощено использование таких технологий, как ActiveX и СОМ, поддержка баз данных с многоуровневой архитектурой. В 1998 г. появилась версия Delphi 4, главной задачей которой стало упрощение разработки приложений. Появились новые средства навигации в программах и используемых классах. Визуальная среда разработки перепроектирована и дополнена возможностью пристыковывать панели инструментов и окна, что сделало процесс разработки более удобным. Были расширены средства поддержки корпоративных многопользовательских решений. Выход версии Delphi 5 в свет состоялся во второй половине 1999 г. Ее характеризуют: □ улучшение графической среды разработки и отладчика, пакет поддержки групповой разработки программ и инструменты трансляции; набор новых функций, предназначенных для упрощения разработки приложений для Internet; стабильность работы системы. 2.2. Основные элементы среды программирования Delphi Для того чтобы запустить Delphi, выполните команду: Пуск — Программы — Borland Delphi 5 — Delphi 5 (рис. 2.2.1). В интегрированную среду разработки Delphi входит несколько основных элементов. Главное окно Delphi. Главное окно Delphi содержит главное меню, панель быстрого доступа и палитру компонентов. Панель быстрого доступа (или палитра инструментов) содержит кнопки, выполняющие некоторые команды меню, например запуск приложения или переключение между дизайнером форм и окном редактирования модуля. Палитра компонентов содержит пиктограммы, которые представляют компоненты библиотеки визуальных компонент (VCL). Главное меню позволяет управлять всеми аспектами работы в Delphi из одного места, так что в Delphi не требуется индивидуального меню для каждого окна. Окно Object Inspector. Отображает свойства (или события) одного или нескольких выбранных компонентов. Окно инспектора объектов состоит из следующих элементов. Комбинированная панель выбора объекта — это поле, расположенное вверху окна инспектора объектов. На рис. в комбинированной панели указан объект Forml: TForml. Страница свойств (Properties). Для каждого компонента определен список свойств, изменение которых приводит к изменению внешнего вида объекта или к изменению реакции на внешние воздействия. Левая колонка страницы свойств содержит имена свойств, а правая — их значения. Страница событий (Events). Каждый компонент способен реагировать на события, список которых отображен на странице событий инспектора объектов. Левая колонка страницы событий содержит названия, а правая — имя процедуры-обработчика события. Дизайнер форм. Форма — это визуальное изображение окна приложения. Простые приложения имеют только одну форму, а более сложные приложения могут обладать множеством таких форм. Точечная сетка, отображаемая в процессе проектирования приложения, помогает выравнивать помещаемые на форму компоненты. В скомпилированном приложении сетка не отображается. Окно редактирования модуля. Содержит текст модуля на языке Object Pascal, связанный с каждой формой приложения. Delphi автоматически создает этот программный код. Это окно также используется для редактирования других модулей приложения. 2.3. Создание приложения При запуске Delphi автоматически создает новое приложение, с которым Вы можете начать программирование новой задачи. Для удобства работы файлы каждого создаваемого проекта лучше хранить в отдельной папке. 2.3.1. Сохранение приложения Выберите команду File — Save All. В появившемся диалоговом окне сохранения файла создайте новую папку Exercise 1, в котором будут храниться файлы первого проекта, созданного в Delphi. В строке Имя файла введите имя Main. Щелкните на кнопке Сохранить для сохранения файла модуля, Main.pas (рис. 2.3.1.1), и файла формы, Main.dfm. Создать папку Примечание. Для того чтобы создать папку, щелкните левой клавишей мыши на значке Создать папку в верхней части диалогового окна сохранения файла. Затем Delphi с помощью еще одного диалогового окна сохранения файла запросит имя проекта. В строке Имя файла введите Exercisel и выберите Сохранить. Вы создадите файл проекта — Exercisel. dpr. Используя программу Проводник Windows, убедитесь в том, что в папке Exercisel были созданы три указанных выше файла. 2.3.2. Запуск приложения Выберите команду Run из меню Run или щелкните на кнопке Run панели быстрого доступа. Обратите внимание на внешний вид формы. Вовремя выполнения приложения исчезла точечная сетка, отображаемая в процессе проектирования. Курсор мыши имеет вид стрелки. Закройте приложение, для этого щелкните дважды на кнопке системного меню в верхнем левом углу окна или на кнопке закрытия окна, расположенной в верхнем правом углу. Если Вы привыкли работать с клавиатурой, то для закрытия приложения и возврата в среду программирования Delphi нажмите AIt+F4. Если случайно приложение осталось открытым, многие команды Delphi будут недоступными (например, окно инспектора объектов). 2 ВЫПОЛНЕНИЕ РАБОТЫ В работе требуется внимательно рассмотреть и разобрать приведенные примеры. Практическая работа № 9 Изменение свойств и событий. Цель работы: ознакомиться с интегрированной средой программы. 1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Свойства влияют на то, как объект выглядит, и на его невидимые черты (поведение). Изменение свойств в ходе проектирования — это простой ручной процесс, который включает выбор желаемого объекта, работу со страницей свойств в окне инспектора и изменение значений желаемых свойств. Свойство Name. В Delphi для каждого объекта имеется свойство Name. Когда компонент помещается в форму, Delphi автоматически присваивает ему уникальное имя. Наш компонент форма имеет имя Forml. В ходе разработки программы происходит частое обращение к объектам по их именам, поэтому осмысленное присвоение имен компонентам избавляет от многих неприятностей. Назовем форму MainF (описана в модуле Main, буква F говорит о том, что данный объект — это форма (Form)). В окне инспектора объектов выберите свойство Name и в правом столбце наберите MainF. Это изменение сразу же отображается в комбинированной панели выбора объекта инспектора объектов. Свойство Color определяет цвет. В Delphi предусмотрены предопределенные цветовые константы, которые соответствуют многим общеупотребительным цветам. Например, при выборе констант clRed или clYellow цвет формы изменяется соответственно, на красный или желтый. Кроме того, определены константы для представления системных цветов экранных элементов Win32. Например, константы clActiveCaption и clHighLightText соответствуют цветам активных заголовков и выделенного цвета в Win32. Установите цвет формы равным clGreen. Свойство Caption определяет заголовок формы. Измените значение этого свойства на значение - Мое первое приложение. Свойства Height и ClientHeight задают высоту формы и высоту рабочей области (исключая рамку и заголовок формы) соответственно. Эти свойства связаны между собой: при изменении значения одного из свойств изменяется и другое. Свойства Width и UientWidth задают ширину формы и ширину рабочей области формы (исключая рамку формы) соответственно. Значения этих четырех свойств можно задать, уменьшая (или увеличивая) размеры формы, используя манипулятор мышь или вводя необходимые значения в правый столбец инспектора объектов. Свойства Тор и Left определяют расположение формы на экране, задавая расстояние от верхней границы экрана до верхнего края формы и от левой границы экрана до левого края формы соответственно. Кроме свойств, изменение значений которых приводит к видоизменению внешнего вида приложения вовремя проектирования, существуют свойства, изменение значения которых видимо только после запуска приложения. Свойство Cursor определяет графический вид курсора В инспекторе объектов измените свойство Cursor, выбрав из списка любое значение. Запустите приложение, посмотрите, как изменился вид курсора. Значение свойства Cursor, равное crtielp, придает курсору вид стрелки со знаком вопроса. Закроите приложение. Используя свойства Hint и ShowHint, можно отобразить подсказку. Установите значение свойства Hint в «Это форма» а значение ShowHint - в True. Запустите приложение Окно подсказки появляется, когда курсор мыши помещается на форму и на мгновение останавливается. Закройте приложение. Обработка событий Архитектуру программы, выполняющейся в операционной системе Windows, достаточно сложно нарисовать в виде визуальной схемы. Например, пусть программа только что начала работать. На экране показывается главное меню программы и пользователь нажимает на кнопку мыши. Нажатие на кнопку мыши является событием, начинает работать определенный объект. Пользователь мог бы не нажимать кнопку мыши, и тогда работа программы пошла бы по другому сценарию. То есть ситуация типа: может быть, а может и не быть. В вероятностной структуре (это структура, в которой не все маршруты, трассы кодов жестко закреплены; в этой архитектуре элементы программ могут включаться при возникновении некоторого события, которое может произойти, а может и не произойти) сильно увеличивается количество возможных состояний и сценариев работы программы. Здесь пользователь определяет порядок работы программы. Приложения Delphi используют управляемые событиями методы для организации взаимодействия между программой и пользователем. Большая часть кода, которую Вы будете писать в Delphi, будет инициироваться событиями. В принципе событием может быть изменение любой величины. Происхождение события заставляет работать определенный объект, при этом объект получает заранее определенные параметры для своей настройки на работу. В Delphi процедура, инициируемая событием, называется обработчиком события. События делятся на три основные категории: события мыши, события клавиатуры и системные события. Изменение свойств. 1. События мыши Для формы событие OnClick возникает в том случае, если пользователь нажимает левую кнопку мыши в то время, когда курсор мыши находится на поле формы. Упражнение 1. Напишите приложение, которое при нажатии левой кнопки мыши перекрашивает форму в красный цвет. Решение Создайте обработчик события OnClick: выберите страницу Events инспектора объектов и выполните двойной щелчок мышью в правой колонке, напротив события OnClick. На переднем плане появится окно редактирования модуля с помещенной сразу в нужное место модуля заготовкой обработчика события OnClick. В обработчике события указан параметр Sender, в котором хранится имя объекта, породившего данное событие (в примере Sender будет содержать ссылку на объект MainF — форму). Для изменения цвета формы в обработчике события OnClick напишем следующий оператор: procedure TMainF.FormClick(Sender: TObject); begin MainF.Color := clRed (*) end; Поясним оператор (*). MainF — это название объекта формы. Color — это свойство формы. Обращение к свойствам объекта происходит так же, как и в структуре данных записи, через точку. Эксперимент. Запустите приложение. Щелкните левой кнопкой мыши на форме. Убедитесь, что цвет формы стал красным. Что произойдет при повторном щелчке левой кнопкой мыши на форме? Возникнет событие OnClick, в результате которого выполнится оператор (*), т. е. цвет формы остается красным. ♦ 2. События клавиатуры Обработку клавиатуры можно выполнить, используя комбинацию трех событий. Событие OnKeyDown происходит при нажатии любой клавиши, включая функциональные и специальные: procedure TForml.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Событие OnKeyPress возникает при нажатии клавиши, генерирующей символы ASCII, включая управляющие клавиши: procedure TForml.FormKeyPress(Sender: TObject; var Key: Char); Событие OnKeyUp происходит при освобождении любой клавиши: procedure TForml.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Каждый из обработчиков событий получает по крайней мере, один параметр, называемый Key, который представляет нажатую клавишу, В обработчиках событий OnKeyDown и OnKeyUp параметр Key является беззнаковым значением типа Word, которое представляет код виртуальной клавиши Windows. В обработчике события OnKeyPress параметр Key — это значение типа Char, представляющее символ ASCII. Несмотря на то, что обе переменные называются Key, они представляют различную информацию. Все ASCII-символы имеют соответствующие коды виртуальных клавиш, но многие виртуальные клавиши не имеют ASCII-эквивалента, например клавиша F1. Упражнение 2. Напишите приложение, закрывающееся при одновременном нажатии клавиш Alt и X. Решение Создайте новое приложение и сохраните его в папке Exerci-se6. Файл модуля — под именем Main,pas, файл проекта — Exercise6.dpr. Измените значения свойств формы следующим образом: Приложение должно закрываться, если одновременно нажаты обе клавиши, для обработки воспользуемся событием ОпКеу Down. Создайте обработчик этого события. Воспользуемся значением параметра Shift для определения нажатия клавиши Alt: if ssAlt in Shift then Close; {Close — это метод формы, закрывающий ее} Эксперимент. Убедитесь, что нажатие клавиши Alt приведет к закрытию формы. ♦ Определим код клавиши X. Добавьте в обработчик события OnKeyDown оператор: Caption:=IntToStr(Key) ; Здесь IntToStr(x) — это функция, которая преобразует целое число х в значение строкового типа, Key — код нажатой клавиши. Эксперимент. Запустите приложение. Определите виртуальный код клавиши с латинской буквой «х». ♦ Итак, виртуальный код клавиши с латинской буквой «х» равен 88. Для решения задачи напишем следующий код обработчика события OnKeyDown формы: procedure TMainF.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssAlt in Shift) and (Key=88) then Close; end; Эксперимент. Сохраните приложение. Убедитесь, что при одновременном нажатии клавиш Alt и латинской буквы «х» независимо от выбранного языка приложение закрывается. Объясните это. ♦ 3. Системные события. Отладка приложения: точки прерывания События мыши и клавиатуры вызываются воздействиями пользователя на программу. Системные события исходят непосредственно от Windows. Событие OnCreate наступает, когда форма создается. Событие OnShow происходит, когда форма отображается (показана). Событие OnActive происходит, когда форма становится активным окном программы (событие генерируется при получении формой фокуса ввода. Это происходит, когда пользователь возвращается в форму из другой формы того же приложения). Событие OnPaint происходит, когда форму необходимо отобразить заново (перерисовать). Событие OnResize происходит, когда размеры формы изменяются. |