Тема «Модульное программирование на языке Turbo
Pascal»
План
1. Принципы модульного программирования
3. Понятие модуля в Turbo Pascal
5. Общая структура модуля на Turbo Pascal
7. Использование модулей в программах
1. Принципы модульного программирования
Модуль – фрагмент программного кода, который является строительным блоком
для создания систем.
Модульное
программирование явилось продолжением развития структурного программирования.
Подпрограммы, появившиеся в структурном программировании, имели ряд
преимуществ:
Однако
подпрограммы имеют существенный недостаток: их сложно повторно использовать в новых
проектах. Для повторного использования подпрограмм разработчик должен открывать
код «старого проекта» и копировать из него нужные подпрограммы в «новый»
проект. Такой подход имеет ряд недостатков:
Поэтому
появилась реальная необходимость обеспечивать повторное использование
подпрограмм в других проектах. Для решения проблемы был предложен подход, при
котором код подпрограмм оформляется и сохраняется в отдельном файле на диске.
Любая программа, которой нужен доступ к подпрограммам, может обратиться к этому
файлу и прочитать из него нужный фрагмент кода.
Основным
принципом модульного программирования является принцип «разделяй и властвуй». Модульное
программирование – это
организация программы как совокупности небольших независимых блоков,
называемых модулями,
структура и поведение которых подчиняются определенным правилам.
Использование
модульного программирования позволяет упростить тестирование программы и
обнаружение ошибок. Кроме того, модульные программы значительно легче понимать,
а модули могут использоваться как строительные блоки в других программах.
Количество
модулей в комплексе должно определяться декомпозицией поставленной задачи на независимые
подзадачи. Число модулей оказывают влияние на сложность программы. В общем
случае, число модулей не должна превышать 10-ти. Это число связано с
«магическим» числом 7, которое базируется на положениях психологии и, в
особенности, на теории «кусков» информации. Кратковременная память человека
имеет ограниченные способности сохранения «кусков» информации. Психологические
эксперименты показали, что способность нашей кратковременной памяти находится
в пределах 5-9 «кусков» (в среднем – 7). Она может одновременно оперировать
около 7 «кусками» информации. Когда человек превышает этот предел, он более
склонен к ошибкам.
Реорганизация
информации с разбивкой на подходящие части является важным действием для эффективного
использования кратковременной памяти человека и для улучшения понимаемости
материала. Люди во многих жизненных ситуациях делают такую реорганизацию
бессознательно. Однако программист может сам себе помочь, сознательно не допуская
числа модулей, которое превышает число 7. (начало)
Принцип информационной закрытости
(автор Д. Парнас, 1972) утверждает, что содержимое модулей должно быть скрыто друг
от друга. Модуль должен проектироваться так, чтобы его содержимое (процедуры и
данные) были недоступны другим модулям (программам, подсистемам, клиентам).

Каждый модуль имеет интерфейсную
часть, которая содержим только имена переменных и имена процедур и функций,
которые можно использовать в других подсистемах. Также дается подробное
описание типов переменных и назначения процедур и функций с указанием их
параметров.
Остальные
локальные переменные, текст самих процедур и функций находится в «секретной» части и недоступен для других
клиентов.
Информационная закрытость модуля
означает следующее:
·
все модули независимы и обмениваются только информацией,
необходимой для работы;
·
доступ к структуре модуля запрещена или ограничена.
Достоинства информационной
закрытости:
·
обеспечивается возможность разработки модулей независимыми
коллективами;
·
обеспечивается возможность легкой модификации системы
(вероятность внесения ошибок в модуль посторонним разработчиками группой мала,
так как никто кроме авторов не имеет доступа к тексту модуля).
Идеальный модуль представляет собой
«чёрный ящик», содержимое которого невидимо клиентам. Он прост в использовании и управлении (количество «ручек
управления им невелико»), но внутри это может быть достаточно сложная
система. (начало)
3. Понятие модуля в Turbo Pascal
Turbo Pascal обеспечивает разработчику доступ к большому числу встроенных констант, типов данных, переменных, процедур и функций. Их количество велико, однако, в своей программе программист редко использует их все сразу. Поэтому они разделены на связанные группы, называемые модулями. В этом случае можно использовать только те модули, которые необходимы в программе.
Используя модули, можно разбивать программу на отдельные части и компилировать их отдельно. Программный модуль (Unit) представляет собой набор констант, типов данных, переменных, процедур и функций, которые могут совместно использоваться несколькими программами. Каждый модуль аналогичен отдельной программе на Паскале, но формленной по специальному стандарту.
Turbo Pascal предоставляет пользователю ряд стандартных модулей:
·
System – содержит стандартные типы
данных, алгебраические функции, операторы. Данный модуль встроен в компилятор
Turbo Pascal и не требует подключения;
·
CRT – работа с монитром в текстовом режиме,
клавиатурой и динамиком;
·
Graph – работа с монитором в графическом режиме;
·
DOS – команды для управления файлами, каталогами и
дисками;
·
Printer – работа с печатающим устройством компьютера и
т.п.
Каждый модуль представляет собой файл с
расширением *.TPU и находятся такие
файлы обычно в каталоге Units среды разработки Turbo Pascal.
Для
того, чтобы любая программа могла получить доступ к каталогу с модулями,
необходимо правильно настроить параметры интегрированной среды разработчика
Turbo Pascal. С помощью команды меню Options – Directories откройте окно и в
поле Unit введите полный путь к каталогу Units, в котором находятся файлы модулей. Замечание: файлы
модулей могут находиться в другом каталоге, тогда в поле Unit нужно ввести
полный путь к этому другому каталогу. (начало)
В Turbo
Pascal можно обращаться к модулям не только как к файлам на диске. В самой
среде имеется специальная библиотека модулей, которая хранит в себе список
наиболее часто используемых модулей. Такая библиотека находится в каталоге Bin
в файле Turbo.tpl.
При
запуске среды Turbo Pascal данная библиотека загружается в оперативную память,
а следовательно, загружаются все и модули, находящиеся в ней. После этого
при обращении к модулям они ищутся не
как файла *.TPU на диске, а читаются из оперативной памяти.
Использование
библиотеки модулей дает ряд преимуществ:
- не
нужно хранить на диске файлы модулей;
- не
нужно настраивать среду Turbo Pascal, указывая полный путь к каталогу Unit;
-
компиляция программ выполняется быстрее, так как тексты модулей читаются не с
диска и из оперативной памяти.
Однако
в библиотеку модулей не рекомендуется помещать все модули без исключения.
Например, по умолчанию в этой библиотеке нет файла Graph.tpu. Надо понимать, что чем больше модулей будет помещено в
библиотеку, тем дольше загружается среда Turbo Pascal, и больше оперативной
памяти она будет занимать. Некоторые модули используются очень редко, и
постоянно загружать их при запуске среды разработки является нецелесообразным.
Поэтому в библиотеку модулей помещают только те, которые используются часто, а
остальные лучше хранить в каталоге Units, и среда Turbo Pascal будет обращаться
к ним по мере необходимости.
Для
работы с библиотекой модулей используется утилита Tpumover.exe, которая находится в каталоге Bin.
Данная утилита вызывается из командной строки с рядом параметров. Приведем
примеры использования утилиты. Пусть на диске C: находится каталог TP7 со
средой Turbo Pascal.
Необходимо
просмотреть какие модули находятся в библиотеке Turbo.tpl. Команды могут иметь
вид:
C: – переход на диск С:
CD \ – выход в корневой каталог диска
CD TP7\BIN –
переход в каталог Tp7\Bin
TPUMOVER TURBO.TPL –
просмотр содержимого библиотеки Turbo.tpl
В
каталоге Units находится файл модуля Primer.tpu.
Необходимо добавить в библиотеку Turbo.tpl файл модуля.
C: – переход на диск С:
CD \ – выход в корневой каталог диска
CD TP7\BIN –
переход в каталог Tp7\Bin
TPUMOVER TURBO.TPL +..\INITS\PRIMER.TPU – добавление модуля в библиотеку Turbo.tpl
Из
библиотеки Turbo.tpl удалить модуль Primer.
C: – переход на диск С:
CD \ – выход в корневой каталог диска
CD TP7\BIN –
переход в каталог Tp7\Bin
TPUMOVER TURBO.TPL -PRIMER – удаление модуля из библиотеки Turbo.tpl (начало)
5. Общая структура модуля на Turbo Pascal
Каждый
модуль на языке Turbo Pascal имеет стандартную структуру вида:
UNIT ИМЯ_МОДУЛЯ;
{ИНТЕРФЕЙСНАЯ
ЧАСТЬ}
INTERFACE
[USES СПИСОК МОДУЛЕЙ]
ГЛОБАЛЬНЫЕ ОПИСАНИЯ
ЗАГОЛОВКИ
ПРОЦЕДУР И ФУНКЦИЙ
{СЕКЦИЯ
РЕАЛИЗАЦИИ (СЕКРЕТ)}
IMPLEMENTATION
ЛОКАЛЬНЫЕ ОПИСАНИЯ
РЕАЛИЗАЦИЯ ПРОЦЕДУР И ФУНКЦИЙ
END.
Заголовок модуля
начинается зарезервированным словом Unit, за которым следует имя модуля точно так
же, как и в случае имени программы.
Интерфейсная секция
Следующим элементом в модуле является ключевое слово
Interface. Оно обозначает
начало интерфейсной секции модуля – части, доступной всем другим модулям
или программам, в которых он используется.
Программный модуль может
использовать другие модули, для этого они определяются в операторе
uses. В этом случае любые константы и
типы данных, описанные в интерфейсной
секции этих модулей, могут
использоваться в любом месте данного модуля.
Интерфейс определяет,
что является «видимым» (доступным) для любой программы
(или модуля), использующей данный модуль.
В интерфейсной части
(секции) модуля можно
определять константы, типы
данных, переменные, процедуры и функции.
Процедуры и функции,
видимые для любой
программы, использующей
данный модуль, описываются
в секции интерфейса, однако их
действительные тела - реализации - находятся
в секции реализации. В интерфейсной
части перечисляются все заголовки процедуры и функции. Секция
реализации содержит программную логику процедур и функций.
Секция реализации
Секция реализации –
«секретная» часть –
начинается зарезервированным
словом Implementation. Все,
что описано в секции
интерфейса, является видимым
в секции реализации: константы, типы,
переменные, процедуры и функции. Кроме того, в секции реализации
могут быть свои
дополнительные описания,
которые не являются
видимыми для программ, использующих этот модуль.
Обычные процедуры и
функции, описанные в интерфейсной секции, должны повторно указываться в секции
реализации. Заголовок Procedure/Function должен быть или идентичным тому,
который указан в секции интерфейса, или иметь более краткую форму. В
случае краткой формы
наберите ключевое слово
(Procedure или Function), а за
ним укажите имя подпрограммы (идентификатор). Затем подпрограмма
должна содержать все свои локальные описания, за которыми должно находиться основное тело самой
подпрограммы. (начало)
Модули, которые
использует программа, уже
откомпилированы и хранятся, как машинный
код, а не как исходный код на Turbo Pascal. Более того, определенные
модули хранятся в
специальном файле (TURBO.TPL) и
автоматически загружаются в память вместе с Borland Pascal.
В результате использование одного
или нескольких модулей очень
незначительно увеличивает время компиляции вашей программы (обычно
менее, чем на секунду).
Фактически, если модуль
скомпилирован, его использование сохраняет вам время при перекомпиляции. Поскольку компилятор не перекомпилирует модуль, пока он не изменяется, а использование
модулей в программе ускорит процесс ее построения.
Если вы создали
модуль, содержащий некоторые полезные
подпрограммы, и хотите использовать эти подпрограммы в своих
программах, необходимо выполнить несколько действий:
·
сохраните его
под именем, заданным
в заголовке модуля. Borland Pascal
сохраняет файл с расширением
.PAS, как и любой другой файл, созданный
в редакторе Borland Pascal. В исходном файле может
содержаться только один модуль;
·
скомпилируйте модуль с помощью
команды Compile – Make. В
результате Borland Pascal создает файл с расширением TPU;
·
скопируйте
полученный файл *.TPU в каталог Units среды Turbo Pascal или встройте файл
модуля в библиотеку Turbo.tpl. (начало)
7. Использование модулей в программах
Включите в любую
программу, где вы хотите использовать
свой новый модуль, оператор Uses.
Например, если ваш новый модуль называется Primer.tpu, то задайте в своей
программе оператор следующего вида:
USES PRIMER;
Чтобы найти модуль, имя которого указано в операторе Uses, Borland Pascal проверяет
его наличие в библиотеке Turbo.tpl, загруженной в память во время инициализации.
Если модуль в библиотеке
исполняющей системы отсутствует, то компилятор ищет его на диске, сначала в
текущем каталоге, затем в каталогах, заданных
в качестве каталогов
модулей (Options – Directories). (начало)
Рассмотрим принцип
создания и использования модулей на примере.
Как известно, в Turbo
Pascal не все алгебраические функции имеют соответствующие операторы. Например:
тангенс, степень, десятичный логарифм и т.д.
Необходимо создать
модуль с именем Math, в котором нужно реализовать алгебраические функции:
тангенс, возведение в степень, log b a.
{указываем заголовок модуля}
unit
math;
{интерфейсная часть}
interface
{описываем заголовок функции для тангенса числа х}
function tan(x:real):real;
{описываем заголовок функции для возведения числа x в степень y}
function power(x,y:real):real;
{описываем функцию для нахождения логарифма числа x по основанию y}
function log(x,y:real):real;
implementation
{тело функции тангенса}
function tan(x:real):real;
begin
tan:=sin(x*pi/180)/cos(x*pi/180);
end;
{тело функции степени}
function power(x,y:real):real;
begin
power:=exp(y*ln(x));
end;
{тело функции логарифма}
function log(x,y:real):real;
begin
log:=ln(x)/ln(y);
end;
end.
После создания текста модуля
его нужно откомпилировать. Для этого сохраним текст модуля в файл под именем Math.pas, с помощью команды Compile –
Make откомпилируем модуль, получив файл Math.tpu. Откомпилированный модуль скопируем в каталог Units среды Turbo Pascal.
Используя модуль Math
написать программу для нахождения значения функции:
![]()
{подключаем модуль для работы с экраном и
модуль с алгебраическими функциями}
uses
crt, math;
{описываем переменные}
var
x,y,z:real;
begin
{очищаем экран}
clrscr;
{вводим исходные данные}
write('Введите два числа (x,z): ');
readln(x,z);
{рассчитываем значение функции}
y:=(tan(x)-log(z,x)+sin(x*pi/180))/(power(x,3)-7);
{выводи результат}
writeln('Значение функции=',y:8:6);
readln;
end. (начало)