Внешние подпрограммы и модули

 

Содержание:

  1. Организация внешних подпрограмм
  2. Создание и использование модулей
  3. Стандартные модули

 

 

Стандартный Паскаль (в отличие от др. языков программирования высокого уровня) не располагает средствами разработки и поддержки библиотек программиста, которые компилируются отдельно и в дальнейшем могут быть использованы не только самим разработчиком. Трудности, связанные с огромными объемами программ, их сложностью и потребностью в коллективной работе, в Турбо Паскале преодолеваются двумя способами:

  • введение внешних подпрограмм;
  • разработка и использование модулей.

 

Организация внешних подпрограмм

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

Пример: дано натуральное число n. Найти сумму первой и последней цифр этого числа.

Для решения используем функцию, вычисляющую количество цифр в записи натурального числа. Сохраним текст этой функции в файле digits.inc:

Function Digits (N: LongInt): Byte;

Var Kol: Byte;

Begin

   Kol := 0;

   While N<>0 Do

               Begin

                  Kol := Kol+1;

                  N := N Div 10

               End;

               Digits := Kol

End;

 

 

Опишем еще одну функцию: возведение натурального числа в натуральную степень (an). Сохраним ее в файле power.inc:

Function Power (A,N: LongInt): LongInt;

Var I, St: LongInt;

Begin

   St := 1;

   For I := 1 To N Do

            St := St * A;

   Power := St

End;

 

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

Program Example1;

Var N, S: Integer;

{$I digits.inc}{подключение внешней ф-ции из файла digits.inc, вычисляющей кол-во цифр в записи числа}

{$I power.inc}{подкл-ие вн. ф-ции из ф. power.inc, вычисляющей рез-т возведения числа A в степень N}

Begin

   Write (?Введите натуральное число:?);

   ReadLn (N); {для определения последней цифры числа N берется остаток от деления этого числа на 10, а для определения первой цифры N – делится на 10, возведенное в степень на единицу меньшую, чем кол-во цифр в записи числа (т.к. нумерация разрядов начинается с 0)}

   S := N Mod 10 + N Div Power (10, Digits (N) - 1);

   WriteLn (?Искомая сумма:?, S)

End.

 

{$I <имя файла>} – это директива компилятора (псевдокомментарий), позволяющая в данное место текста программы вставить содержимое файла с указанным именем.

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

 

Создание и использование модулей

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

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

Модуль состоит из следующих частей:

  • заголовок модуля;
  • интерфейс модуля;
  • исполнительная часть модуля;
  • раздел инициализации модуля.

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

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

Unit <имя_модуля>; {заголовок модуля}

Interfase

      {интерфейсная часть}

Implementation

      {раздел реализации (исполнительная часть)}

Begin

      {раздел инициализации модуля}

End.

 

 

Заголовок модуля состоит из зарезервированного слова Unit и идентифика­тора. Идентификатор модуля должен быть уникальным. Пример заголовка: Unit MyModule;

Модуль должен быть помещен в файл, имя которого совпадает с именем моду­ля, а его расширение должно быть .PAS.

 

Через интерфейс осуществляется взаимодействие основной программы с моду­лем (модуля с модулем). В интерфейсе указываются константы, типы, перемен­ные, процедуры и функции, которые могут быть использованы основной программой (модулем) при вызове этого модуля.

Интерфейсная часть начинается словом Interface. Далее после слова Uses указываются имена модулей, которые используются данным модулем (необязательная часть). После этого могут быть: раздел объявления констант, раздел объявления типов, раздел объявления переменных, раздел объявления процедур и функций. В разделе объявления процедур и функций указываются лишь заголовки подпрограмм. Сами подпрограммы приводятся в исполнительной части.

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

 

Исполнительная часть (раздел реализации) включает все подпрограммы модуля. Она может также включать локальные метки, константы, типы и переменные.

Исполнительная часть начинается словом Implementation. Затем после слова Uses  указываются имена модулей, которые используются подпрограммами дан­ной исполнительной части (этот раздел необязателен). Если какой-то модуль уже указан в интерфейсе модуля, то в исполнительной части его повторять не следует. Далее могут быть: раздел объявления меток, раздел объявления локальных констант, раздел объявления локальных типов, раздел объявления ло­кальных переменных. Затем идут описания подпрограмм модуля.

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

В некоторых случаях перед обращением к модулю следует провести его ини­циализацию (например, установить связь с теми или иными файлами с помощью процедуры Assign, инициализировать какие-то переменные и т. д.). Необходимые действия можно вьшолнить в разделе инициализации модуля. Этот раздел начина­ется словом Begin, после которого идут исполняемые операторы, а затем поме­щается слово End. (с точкой), например:

Begin

Assign(Fl,   'FILE1.DAT')

End

 

 

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

Если инициализация модуля не нужна, то в секции помещается лишь слово End. (с точкой).

 

Пример разработки и использования модуля приведен на стр.147-151 учебника И.Г. Семакин, А.П. Шестаков «Основы программирования».

 

При разработке модуля рекомендуется такая последовательность действий:

  • спроектировать модуль, т.е. определить основные и вспомогательные подпрограммы и ресурсы;
  • описать компоненты модуля;
  • каждую подпрограмму целесообразно отладить отдельно, после чего «вклеить» в текст модуля.

 

Разработанный модуль сохраняется в файле с расширением  .pas. Для компиляции можно воспользоваться внешним компилятором, поставляемым вместе с Турбо Паскалем. Команда будет выглядеть так:  TPC  имя_файла.pas. Если в тексте нет синтаксических ошибок, получим файл с расширением .tpu, иначе будет выведено сообщение с указанием строки, содержащей ошибку.

Другой вариант компиляции: в меню системы программирования Турбо Паскаль выбрать Compile/Destination Disk, затем — Compile/Build.

Теперь можно подключить модуль к программе, где планируется его использование.

 

Стандартные модули

В Турбо Паскале в настоящее время имеется большое количество стандартных подпрограмм, объединенных в несколько стандартных модулей. Они позволяют упростить процедуру написания программ, более полно использовать возможности компьютера, возможности операционной системы. В Турбо Паскале имеются следующие стандартные модули: SYSTEM, STRINGS, CRT, GRAPH, DOS, WINDOS, OVERLAY, PRINTER, TURBO3, GRAPH3. Из них только модуль SYSTEM подключается автоматически к любой программе.

Краткая характеристика модулей:

  • модуль SYSTEM включает все стандартные процедуры и функции языка Паскаль и встроенные процедуры и функции языка Турбо Паскаль. Подключается к любой программе автоматически, не требуя объявления;
  • модуль STRINGS работает с ASCIIZ-строками (строки, оканчивающиеся символом с кодом 0). Введение таких строк связано с необходимостью совместить программы, написанные в Турбо Паскале, с программами, использующим среду Windows, а также для установления соответствия с др. языками программирования (Си, Ассемблер и т.д.);
  • модуль CRT обеспечивает управление текстовым режимом работы экрана (перемещение курсора в любую позицию экрана, изменение цвета символов, фона, управление звуком);
  • модуль GRAPH обеспечивает управление графическим режимом работы экрана (позволяет создавать и выводить на экран графические изображения и текстовые надписи);
  • модуль DOS отвечает за доступ программ к средствам ОС MSDOS;
  • модуль WINDOS следует использовать вместо модуля DOS, когда в программе используются строки, завершающиеся нулями, или когда предполагается в дальнейшем использовать разрабатываемую программу в среде Windows;
  • модуль OVERLAY необходим при разработке больших программ, требующих большого количества памяти;
  • модуль PRINTER отвечает за вывод текстов на принтер;
  • модули TURBO3 и GRAPH3 созданы для совместимости с ранней версией 3.0 системы Турбо Паскаль.

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

 

   

 

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

  1. Какими причинами обусловлено использование внешних подпрограмм и модулей?
  2. Что называется модулем?
  3. Назовите составные части модуля.
  4. Какие стандартные модули используются в Турбо Паскале?
  5. По какому принципу осуществляется работа со стандартными модулями?