Лекция

Тема «Модульное программирование на языке Turbo Pascal»

 

План

1. Принципы модульного программирования

2. Принцип «скрытия данных»

3. Понятие модуля в Turbo Pascal

4. Работа с утилитой TPUMOVER

5. Общая структура модуля на Turbo Pascal

6. Компиляция модулей

7. Использование модулей в программах

8. Пример

 

1. Принципы модульного программирования

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

Модульное программирование явилось продолжением развития структурного программирования. Подпрограммы, появившиеся в структурном программировании, имели ряд преимуществ:

Однако подпрограммы имеют существенный недостаток: их сложно повторно использовать в новых проектах. Для повторного использования подпрограмм разработчик должен открывать код «старого проекта» и копировать из него нужные подпрограммы в «новый» проект. Такой подход имеет ряд недостатков:

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

Основным принципом модульного программирования является принцип «разделяй и властвуй». Модульное программирование это ор­ганизация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются оп­ределенным правилам.

Использование модульного программирования позволяет упро­стить тестирование программы и обнаружение ошибок. Кроме того, модульные программы значительно легче понимать, а модули могут использоваться как строительные блоки в других программах.

Количество модулей в комплексе должно опреде­ляться декомпозицией поставленной задачи на независимые подзадачи. Число модулей оказывают влияние на сложность про­граммы. В общем случае, число модулей не должна превышать 10-ти. Это чис­ло связано с «магическим» числом 7, которое базируется на положениях психологии и, в особенности, на теории «кусков» информа­ции. Кратковременная память человека имеет ограниченные способности сохранения «кусков» информации. Психологические эксперименты по­казали, что способность нашей кратковременной памяти находится в пределах 5-9 «кусков» (в среднем – 7). Она может одновременно опери­ровать около 7 «кусками» информации. Когда человек превышает этот предел, он более склонен к ошибкам.

Реорганизация информации с разбивкой на подходящие части яв­ляется важным действием для эффективного использования кратковре­менной памяти человека и для улучшения понимаемости материала. Лю­ди во многих жизненных ситуациях делают такую реорганизацию бессоз­нательно. Однако программист может сам себе помочь, сознательно не допуская числа модулей, которое превышает число 7. (начало)

 

2. Принцип «скрытия данных»

Принцип информационной закрытости (автор Д. Парнас, 1972) утверждает, что содержимое модулей должно быть скрыто друг от друга. Модуль должен проектироваться так, чтобы его содержи­мое (процедуры и данные) были недоступны другим модулям (программам, подсистемам, клиентам).

Описание: Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc13.files\lekc12_1.gif

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

Остальные локальные переменные, текст самих процедур и функций находится в «секретной» части и недоступен для других клиентов.

Информационная закрытость модуля означает следующее:

·        все модули независимы и обмениваются только информацией, необходимой для работы;

·        доступ к структуре модуля запрещена или ограничена.

Достоинства информационной закрытости:

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

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

Идеальный модуль представляет собой «чёрный ящик», содержимое которого невидимо кли­ентам. Он прост в использовании и управлении (количество «ручек управления им невелико»), но внут­ри это может быть достаточно сложная система. (начало)

 

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 нужно ввести полный путь к этому другому каталогу. (начало)

 

4. Работа с утилитой TPUMOVER

В 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), а за ним укажите имя подпрограммы (идентификатор). Затем  подпрограмма  должна  содержать  все свои локальные описания,  за которыми должно находиться основное тело самой подпрограммы. (начало)

 

6. Компиляция модулей

Модули, которые использует программа,  уже откомпилированы и хранятся,  как машинный код, а не как исходный код на 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). (начало)

 

8. Пример

Рассмотрим принцип создания и использования модулей на примере.

Как известно, в 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 написать программу для нахождения значения функции:

 

Описание: Описание: E:\Мои документы\1 Ленкова\02 Основы программирования\program\lekcii\lekc13.files\lekc12_2.gif

 

{подключаем модуль для работы с экраном и

модуль с алгебраическими функциями}

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. (начало)