TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

1. 13.  Разработка модулей

            Известно,  что откомпилированная программа размещается в отдельном сегменте памяти,  т. е.  не может превышать 64 Кбайта.  Для создания больших программ в Турбо-Паскале предусмотрено подключение к основной программе откомпилированных модулей.  Модуль включает в себя,  как правило,  большое число процедур,  выполняющих однотипные операции,  например, работа с графикой,  операции с комплексными числами,  матричные операции и т. д.  Модуль определяется как программа,  начинающаяся со служебного слова "Unit" и включающая в себя интерфейсную,  исполняемую и инициирующую части. 

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

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

            Инициирующая часть модуля начинается со служебного слова "Begin" и содержит блок операторов,  выполняемых при подключении модуля к основной программе.  Инициирующая часть вместе со словом "Begin" может отсутствовать или быть пустой.  Заканчивается модуль служебным словом "End. " с точкой.

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

                                                                       Структура модуля имеет вид:                     

            Unit Name_M;                                         { Name_M - имя модуля }

{-----------------------------------------------------------------}

Interface                                                       { Интерфейсная часть модуля}

{------------------------------------      раздел описания глобальных имен}

Type MM= array[1..10, 1..10] of real;                                       { описание типа}

Var Max_F, Min_F: real;                  {описание глобальных переменных}

{-----------------------------------------------------------------}

Procedure Name_P(p1: real;  p2: MM);       { описание заголовков процедуры}

Function  Name_f(p3, p4: real): real;                     { и функции}

{-----------------------------------------------------------------}

Implementation                                                  {Исполняемая часть модуля}

{--------------------------------------   раздел описания локальных имен}

Const C = 'Подключен модуль Name_M';           { задание локальной константы}

Procedure Name_P;                                           {Полное описание процедуры}

        { Раздел описания процедуры}

Begin   { Раздел выполнения процедуры}   End;

Function Name_f: real;                                     {Полное описание функции}

       { Раздел описания функции}

Begin  { Раздел выполнения функции}     End;

{---------------------------------------------------------------- }

   BEGIN                                      { Инициирующая часть модуля}

        Writeln(C); {операторы модуля}

END.

            Отметим,  что в интерфейсной части модуля запрещается делать опережающее описание процедур.  Запрещается также рекурсия модулей.

            Модуль записывается в файл с именем модуля,  например,  Name_M. pas.  Затем файл компилируется,  при этом получается файл с расширением ". tpu",  например,  Name_M. tpu,  который автоматически записывается в каталог,  указанный в опции  Options,  Directories,  EXE & TPU,  иначе - в текущий каталог.  При запуске программы,  использующей модуль,  файл с расширением ". tpu" ищется в каталоге,  указанном в опции Options,  Directories,  EXE & TPU или Unit Directories,  либо в текущем каталоге.

 

            Подключение модулей осуществляется в начале основной программы с помощью служебного слова "Uses" с указанием имен модулей,  например:

Program Pr_1;

               Uses Name_M1, Name_M2; 

Если в основной программе имя идентификатора совпадает с именем,  объявленным в интерфейсной части подключенного модуля,  то используются значения,  присвоенные идентификатору в программе.  Если одинаковые имена встречаются в интерфейсной части подключенных модулей (например в Name_M1 и  Name_M2),  то используются значения,  присвоенные идентификатору в последнем описанном модуле,  т. е.  в Name_M2. 

            Приведем пример разработки и подключения модуля.  В модуле опишем процедуры работы с матрицами.

Unit MATR_1;

{-----------------------------------------------------------------} 

Interface

{-----------------------------------------------------------------} 

 Type  M = array[1..10, 1..10] of real;

       M1 = array[1..10] of real;

  Procedure MAT_1(a:M; var b:M;  n: word);

  Procedure MAT_2(a:M; var b:M1; n: word);

{-----------------------------------------------------------------} 

Implementation

{-----------------------------------------------------------------} 

  Procedure MAT_1;              {создание матрицы "B",  транспонированной к "A"}

var i, j: word;

begin    for i:=1 to N do  for j:=1 to N do  b[i,j]:=a[j,i] 

end;

{-----------------------------------------------------------------} 

Procedure MAT_2;                         {расчет квадратов диагональных элементов}

var i, j: word;          

begin    for i:=1 to N do   b[i]:=a[i,i]*a[i,i]  

end;

{-----------------------------------------------------------------} 

END.

            В основной программе PR_1 подключается модуль MATR_1 и используются процедуры MAT_1 и MAT_2.

Program PR_1;

Uses MATR_1;

 Type  MM = M;   MM1 = M1;

Var a1,a2,a3: MM;   b1,b2: MM1;     i,j,n: word;

Begin    Writeln('введите размерность матрицы N=');  Readln(n);

Randomize;   

       for i:=1 to n do  for j:=1 to n do  a1[i,j]:=random(20)+1;

MAT_1(a1, a2, n);  MAT_1(a2, a3, n);

MAT_2(a1, b1, n);  MAT_2(a2, b2, n)  end.

            В результате двойного транспонирования исходной матрицы "a1" (из "a1" в "a2",  из "a2" в "a3") получается матрица "a3" тождественная "a1" .

Матрицы "b1" и "b2" содержат квадраты диагональных элементов матриц "a1" и "a2".  Типы массивов фактических параметров должны соответствовать типам массивов формальных параметров,  описанных в модуле MATR_1.  Можно использовать имена типов,  заданные в интерфейсной части модуля или задавать новые имена типов. 

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz