Лекция №4
Тема:
Модульное программирование
ПЛАН
4 Лекция №4
4.1 Основные понятия
4.2 Структура модуля
4.3 Компиляция модулей и модульных программ
4.4 Стандартные модули
Время:
2 ч.
Литература:
Основные понятия
Модульное программирование – это организация программы в виде совокупности нескольких независимых блоков (модулей), оформленных по определенным правилам.
Достоинства модульного программирования:
модули могут создаваться отлаживаться и компилироваться независимо друг от друга;
модульный подход позволяет легко производить модернизацию программы путем изменения одного или нескольких модулей, не затрагивая остальные модули;
разработанные модули можно использовать и в других программах (очень часто в разных программах используются одни и те же процедуры и функции, например, вычисление тангенса, возведение в степень и т.д., поэтому имеет смысл выделить эти процедуры и функции в отдельный модуль и затем подключать этот модуль к создаваемой программе).
Основная задача модуля – скрыть информацию о внутреннем строении его процедур и функций, ведь для использования этих процедур и функций достаточно знать их назначение и передаваемые параметры. Таким образом, модуль представляет собой «черный ящик» для которого известны только входные и выходные данные.
Принципы модульного программирования:
Функциональная декомпозиция – разбиение большой задачи на ряд более мелких самостоятельных подзадач (эти задачи затем реализуются в виде модулей).
Независимость – взаимное влияние полученных подзадач должно быть минимальным; ни один модуль не должен зависеть от глобальных переменных.
Понятность – реализуемые в модуле решения должны быть простыми и ясными. Рекомендуется также с помощью комментариев размещать в модуле поясняющую информацию, например, в заголовке модуля поместить такие сведения:
назначение модуля;
сведения о разработчике (для защиты авторских прав);
особенности функционирования;
краткое описание применения его процедур и функций.
В языке Турбо Паскаль модули используются в основном для создания библиотек процедур, функций и объектов, которые могут быть использованы в разрабатываемых программах. Для того чтобы программа могла использовать модули, в начале ее раздела описаний должна присутствовать строка:
USES список модулей;
Пример
USES CRT, GRAPH, STRINGS;
означает подключение модулей CRT, GRAPH и STRINGS.
Структура модуля
Модуль имеет следующую структуру:
Unit имя |
заголовок модуля |
INTERFACE |
интерфейсный раздел |
IMPLEMENTATION |
раздел реализации |
Begin…END. |
раздел инициализации |
Примечание – Любой из разделов модуля может быть пустым.
Заголовок модуля состоит из слова Unit и имени модуля. Имя модуля должно обязательно совпадать с именем файла, в котором находится его исходный текст.
Интерфейсный раздел начинается словом INTERFACE и содержит объявление всех глобальных компонентов, которые должны быть доступны вызывающей программе или другим модулям.
Структура интерфейсного раздела имеет вид:
Uses список модулей |
указание используемых модулей |
Const |
описание констант |
Type |
описание типов |
Var |
описание переменных |
Procedure… Function… |
описание заголовков процедур и функций |
Примечание – Если в интерфейсном разделе используется объявление Uses, то оно должно следовать непосредственно за словом INTERFACE.
Раздел реализации начинается словом IMPLEMENTATION и содержит описания процедур и функций, объявленных в интерфейсном разделе, а также описания локальных компонентов (меток, констант, типов, переменных, процедур и функций).
Структура раздела реализации имеет вид:
Uses список модулей |
указание используемых модулей |
Label |
описание меток |
Const |
описание локальных констант |
Type |
описание локальных типов |
Var |
описание локальных переменных |
Procedure… Function… |
описание процедур и функций (как глобальных, так и локальных) |
Примечания
1 Если в разделе реализации используется объявление Uses, то оно должно следовать непосредственно за словом IMPLEMENTATION.
2 Все локальные компоненты (типы, константы, переменные, процедуры, функции), будут доступны только в пределах раздела реализации.
Раздел инициализации содержит операторы, образующие некоторый фрагмент программы, заключенный в операторные скобки BEGIN…END. Эти операторы выполняются до передачи управления основной программе и обычно используются для подготовительных действий (открытие нужных файлов, присваивание начальных значений переменным). Раздел инициализации может отсутствовать, в этом случае его заменяют словом END с точкой. Для оверлейных модулей отсутствие раздела инициализации является обязательным.
Пример – Модуль, содержащий функцию вычисления десятичного логарифма:
Unit Logarifm;
INTERFACE
Function Lg(x:Real):Real;
IMPLEMENTATION
Const
Ln10=2.30259; {Натуральный логарифм 10}
Function Lg(x:Real):Real;
Begin
Lg:=Ln(x)/Ln10;
End;
END.
Программа, которая будет использовать функцию из этого модуля может выглядеть так:
Program TestLogarifm;
Uses Logarifm; {Подключение модуля Logarifm}
Var Z:Real;
BEGIN
Z:=12+Lg(456); {Вычисление выражения с функцией Lg}
WriteLn('Z=',Z:8:4); {Вывод результата}
ReadLn; {Останов}
END.
Если имя какого-либо идентификатора (константы, переменной, подпрограммы), описанного в основной программе совпадает с именем идентификатора, описанного в интерфейсной части модуля, то для доступа к идентификатору, описанному в модуле используется полное обращение вида: имя модуля.идентификатор. Например, вызов System.Copy означает вызов процедуры Copy из модуля System.
При разработке и отладке модулей необходимо знать следующие особенности:
Нельзя одновременно использовать несколько модулей с одинаковыми именами;
Модуль может только компилироваться, запустить его нельзя. При попытке выполнить команду меню RunRun появится сообщение Cannot run a unit (нельзя запустить модуль). Для проверки работоспособности процедур и функций модуля нужно создать программу, использующую эти процедуры и функции.
Если при компиляции модуль не обнаружен в текущем каталоге, то компилятор выполняет поиск заданного модуля в каталогах, заданных параметром OptionsDirectories…Unit directories.
Пусть имеется программа, в которой используется модуль EFFECTS.PAS. При трассировке этой программы с заходом в процедуры и функции (клавиша F7 или команда меню RunTrace into), откроется новое окно, куда загрузится исходный текст модуля EFFECTS.PAS и будет выполнен в пошаговом режиме его раздел инициализации (если он есть). После завершения раздела инициализации произойдет переключение на окно с исходным текстом программы. Затем при обращении к процедурам и функциям модуля EFFECTS.PAS будет происходить переключение на окно с текстом модуля, и выполняться пошаговое выполнение вызванной процедуры или функции. После завершения их выполнения снова произойдет переключение на окно с исходным текстом программы. Если исходный текст модуля EFFECTS.PAS отсутствует (есть только файл EFFECTS.TPU), то такой режим трассировки будет невозможен.
Если используется трассировка без захода в процедуры и функции (клавиша F8 или команда меню RunStep over), то окно с исходным текстом модуля открываться не будет.