78209

Организация библиотек. Стандартные модули. Структура Unit

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-02-07

79.5 KB

9 чел.

екция: Организация библиотек. Стандартные модули. Структура Unit.    Страница  8 из 8

Оглавление

[1] Оглавление

[2] Организация библиотек

[3] Стандартные библиотечные модули и модули пользователя

[4] Структура Unit

[4.1] Пример 1 разработки собственного модуля

[4.2] Пример 2 разработки собственного модуля

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

Комбинированный урок №11

Тема: Организация библиотек. Стандартные библиотечные модули и модули пользователя. Структура Unit.

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

Организация библиотек

Богатство алгоритмических возможностей Паскаля в значительной степени достигается благодаря использованию модулей. 

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

Модуль - программная единица, текст которой компилируется независимо (автономно).

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

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

Стандартные библиотечные модули и модули пользователя

В Турбо Паскале имеется восемь стандартных модулей, в которых содержится большое число разнообразных типов, констант, процедур и функций. Этими модулями являются SYSTEM, DOS, CRT, PRINTER, GRAPH, OVERLAY, TURBOS и GRAPH3. Модули GRAPH, TURBOS и GRAPHS выделены в отдельные TPU-файлы, а остальные входят в состав библиотечного файла TURBO.TPL. Лишь один модуль SYSTEM подключается к любой программе автоматически, все остальные становятся доступны только после указания их имен в списке, следующем за словом USES.

Ниже приводится краткая характеристика стандартных модулей.

Модуль SYSTEM. В него входят все процедуры и функции стандартного Паскаля, а также встроенные процедуры и функции, которые не вошли в другие стандартные модули (например, INC, DEC, GETDIR и т.п.). Как уже отмечалось, модуль SYSTEM подключается к любой программе независимо от того, объявлен ли он в предложении USES или нет, поэтому его глобальные константы, переменные и подпрограммы считаются встроенными в Турбо Паскаль.

Модуль PRINTER. Делает доступным вывод текстов на матричный принтер. В нем определяется файловая переменная LST типа TEXT, которая связывается с логическим устройством PRN. После подключения модуля может быть выполнена, например, такая программа:

Uses Printer; 

begin

writeln (LST, 'Турбо Паскаль') 

end.

Модуль CRT. В нем сосредоточены процедуры и функции, обеспечивающие управление текстовым режимом работы экрана. С помощью входящих в модуль подпрограмм можно перемещать курсор в произвольную позицию экрана, менять цвет выводимых символов и окружающего их фона, создавать окна. Кроме того, в модуль включены также процедуры «слепого» чтения клавиатуры и управления звуком.

Модуль GRAPH. Содержит обширный набор типов, констант, процедур и функций для управления графическим режимом работы экрана. С помощью подпрограмм, входящих в модуль GRAPH, можно создавать разнообразные графические изображения и выводить на экран текстовые надписи стандартными или разработанными программистом шрифтами. Подпрограммы модуля GRAPH после соответствующей настройки могут поддерживать различные типы аппаратных графических средств. Настройка на имеющиеся в распоряжении программиста технические средства графики осуществляется специальными программами - драйверами, которые не входят в файл GRAPH. TPU, но поставляются вместе с ним.

Модуль DOS. В модуле собраны процедуры и функции, открывающие доступ программам к средствам дисковой операционной системы MS- DOS.

Модуль OVERLAY. Он необходим при разработке громоздких программ с перекрытиями. Как уже говорилось, Турбо Паскаль обеспечивает создание программ, длина которых ограничивается лишь основной оперативной памятью ПК. Операционная система MS-DOS оставляет исполняемой программе около 580 Кбайт основной памяти (без учета резидентных программ и самой системы Турбо Паскаль). Память такого размера достаточна для большинства применений, тем не менее использование программ с перекрытиями снимает это ограничение.

Два библиотечных модуля TURBO3 и GRAPHS введены для совместимости с ранней версией 3.0 системы Турбо Паскаль.

Структура Unit

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

ЗАГОЛОВОК МОДУЛЯ

Unit < имя модуля >;

ИНТЕРФЕЙСНАЯ ЧАСТЬ

Interfaсe

Uses < список используемых модулей >

Type{ открытые объявления переменных, которые будут доступны в основной программе}

Var

Procedure

Function

РЕАЛИЗАЦИОННАЯ ЧАСТЬ или ИСПОЛНЯЕМАЯ ЧАСТЬ

Implementation {выполнение}

Uses < список используемых модулей >

{ собственные объявления , доступны только внутри данной реализации подпрограмм}

Type

Var

{ процедуры и функции }

Procedure 

Function

ИНИЦИИРУЮЩАЯ ЧАСТЬ

Begin

…     {Основной блок модуля}

End.

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

Далее записывается раздел интерфейсной части (за ключевым словом Interfaсe). Эта часть модуля является доступной (“видимой”) для любой программы, использующей этот модуль. То есть объявленные в этом разделе константы, типы данных, переменные, процедуры и функции, могут использоваться в любой другой программе. В свою очередь, в разделе интерфейса могут указываться другие используемые модули (их список следует за ключевым словом Uses). При этом все объекты, объявленные в интерфейсах этих модулей могут быть использованы в любом объявлении в интерфейсе данного модуля.

Примечание. Для “видимых” процедур и функций в интерфейсном разделе приводится только их заголовки. Полностью эти процедуры и функции записываются в разделе реализации.

Следующим  структуре модуля описывается раздел реализации (за ключевым словом Implementation). В этом разделе могут использоваться все объекты, описанные в разделе интерфейса. Вместе с тем, здесь могут объявляться свои константы, типы данных, переменные процедуры и функции. Они могут быть использованы только в данном разделе реализации и в этом смысле являются “не видимыми”. Это же ограничение относится и к интерфейсам других модулей, список которых следует за ключевым словом Uses (в отличие от аналогичного списка в разделе интерфейса данного модуля). Таким образом, различие всех описаний содержащихся в разделе интерфейса и реализации заключается в сфере их использования (первые доступны извне, вторые - только внутренние).

Раздел реализации модуля начинается ключевым словом Implementation и заканчивается end. Но если между ними появляется ключевое слово begin, то получившийся составной оператор begin…end становится разделом инициализации модуля. Раздел инициализации обычно используется для открытия файлов и для формирования значений структур данных и переменных.

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

Например, вы разработали программу, которая наряду со стандартным модулей Crt использует ваш разработанный собственный модуль с именем Modul. Тогда, в программе следует указать список используемых модулей в следующем виде:

Program Pr;
Uses   Crt, Modul;
. . .
Модули транслируются отдельно. В отличие от основных программ результатом трансляции которых будут файлы с расширением EXE модули получают расширение TPU. Полученные в результате трансляции TPU - файлы можно подсоединить к стандартному файлу TURBO.TPL с помощью утилиты TPUMOVER.EXE. Если этого не делать, то при трансляции самой программы все используемые модули (TPU - файлы) присоединяться к ней автоматически. Если в каком-либо из используемых модулей были внесены изменения, то при трансляции программы, все модифицируемые модули также будут предварительно перетранслированы (эту функцию реализует интегрированная среда).

Пример 1 разработки собственного модуля

 Разработку собственного модуля рассмотрим на следующем примере:

Пусть дано задание: разработать личную библиотеку, включив в нее процедуры:

  •  ввода элементов числовой матрицы размером N*N;
  •  транспонирования матрицы;
  •  вывода результирующей матрицы.

В основной программе ввести размер матрицы N.

Начнем разработку модуля, который будет носить название Matrix. Программно это будет выглядеть так:

Unit Matrix;

{Зарезервированное слово Unit служит для указания имени библиотеки. Это имя  должно совпадать с именем PAS-файла библиотеки (т.е библиотека Matrix должна  находиться с файле Matrix.Pas), а иначе компилятор даст ошибку при попытке  использования такой библиотеки}

Interface

{Секция Interface содержит описания общедоступных типов данных, констант,  процедур и функций. Т.е. все, что будет здесь находиться можно будет  использовать при подключении данной библиотеки.}

Type

 TMatrix = array [1..10,1..10] of Integer;            { Квадратная матрица }

 procedure MatrInput  (Var m : TMatrix; n : Integer); { ввод матрицы }

 procedure MatrOutput (Var m : TMatrix; n : Integer); { вывод матрицы }

 procedure MatrTransp (Var m : TMatrix; n : Integer); { транспонирование }

Implementation

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

{Процедура обмена местами двух элементов матрицы (x1,y1) и (x2,y2).  Эта процедура используется при транспонировании матрицы, но ее  нельзя вызвать при подключении библиотеки, т.к. она не объявлена  в секции Interface.}

procedure Swap (Var m : TMatrix; x1,y1,x2,y2 : Integer);

var  temp : Integer;

begin

  temp := m[x1,y1];

  m[x1,y1] := m[x2,y2];

  m[x2,y2] := temp;

 end;

{Ввод матрицы с клавиатуры. Параметры процедуры здесь не указаны, т.к. они есть в секции Interface }

procedure MatrInput;

var  i,j : Integer;

begin

  for i:=1 to n do

   begin

Write(i:3,'-я строка : ');

for j:=1 to n do Read(m[i,j]);

ReadLn;

   end;

 end;

procedure MatrTransp; {Транспонирование матрицы.}

var

  i,j : Integer;

begin

  for i:=1 to n-1 do

    for j:=i+1 to n do

     Swap (m,i,j,j,i);

 end;

procedure MatrOutput; {Вывод матрицы на экран.}

var   i,j : Integer;

begin

  for i:=1 to n do

   begin

     Write(i:3,'-я строка : ');

     for j:=1 to n do Write (m[i,j]:4);

     WriteLn;

   end;

 end;

{Эта секция может использоваться для инициализации работы библиотеки.}

Begin

End.

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

{Это отдельный файл, содержащий основную программу}

Uses  Crt, { Библиотека стандартных процедур управления экраном и клавиатурой }

 Matrix; {Наш разработанный модуль-библиотека работы с квадратными матрицами (личная)}

Var   m : TMatrix;  { Объявляем матрицу - максимальный размер 10*10 }

n : Integer;  { Размер матрицы }

Begin

 repeat{ Повторяем ввод размера, пока не будет введено корректное значение}

ClrScr;

Write('Введите размер матрицы (1..10) : ');

ReadLn(n);

until (n >= 1) and (n <= 10);

WriteLn;

WriteLn('Введите матрицу размера ',n,'*',n,' по строкам:');

MatrInput (m,n); {вызов процедуры ввода матрицы, определенной в модуле Matrix}

MatrTransp (m,n); {вызов процедуры транспонирования матрицы, определенной в модуле Matrix}

WriteLn;

WriteLn('Транспонированная матрица :');

MatrOutput (m,n); {вызов процедуры вывода матрицы, определенной в модуле Matrix}

End.

Пример 2 разработки собственного модуля

Например, создаем модуль, реализующий арифметику комплексных чисел (такая арифметика ни в стандартном Паскале, ни в Турбо Паскале не предусмотрена). К сожалению, в Турбо Паскале нельзя использовать функции, значения которых имели бы структурированный тип (запись, например), поэтому арифметика комплексных чисел реализуется четырьмя процедурами:

UNIT Cmplx;

INTERFACE

type complex = record 

re, im:real

end;

Procedure AddC (x, у : complex; var z : complex) ;

Procedure SubC (x, у : complex; var z : complex) ;

Procedure MulC (x, у : complex; var z : complex) ;

Procedure DivC (x, у : complex; var z : complex) ;

Const  с : complex = (re :0.1; im :-1);  

IMPLEMENTATION

Procedure AddC;

begin

z.re := x.re + y.re; z . im := x.im + y. im

end {AddC};

Procedure SubC;

begin

z.re := x.re - y. re ; 

z.im := x.im - y.im

end {SubC};

Procedure MulC;

begin

z.re := x.re*y.re - x.im*y. im;

z.im := x.re*у.im + x.im*y.re

end {MulC};

Procedure DivC; 

var  zz : real;

begin

zz := sqr(y.re) + sqr(y.im); 

z. re := (x.re * y.re + x.im * y.im) / zz; 

z.im := (x.re * y.im - x.im * y.re) / zz

end {DivC};

begin

end.

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

Uses Cmplx; 

var  а, Ь, с : complex; 

begin 

a.re := 1; a.im := 1; 

b.re := 1; b.im := 2; 

AddC(a, b, c); 

WriteLn('Сложение: 'c.re:5:1, c.im:5:1,'i') ; 

SubC(a, b, c) ; 

WriteLn('Вычитание: 'с.re:5:1, с.im:5:1,'i');

MulC(a, b, c); 

WriteLn('Умножение: 'c.re:5:1, c.im:5:l,'i') ; 

DivC(a, b, c); 

WriteLn('Деление: 'c.re:5:l, с.im:5:1,'i');

end.

После объявления Uses Cmplx программе стали доступны все объекты, объявленные в интерфейсной части модуля CMPLX. При необходимости можно переопределить любой их этих объектов, как это произошло, например, с объявленной в модуле типизированной константой С. Переопределение объекта означает, что вновь объявленный объект «закрывает» ранее определенный в модуле одноименный объект. Чтобы получить доступ к «закрытому» объекту, нужно воспользоваться составным именем: перед именем объекта поставить имя модуля и точку. Например, оператор

WriteLn(cmplx.c.re:5:l, cmplx.с.im:5:1,'i'); выведет на экран содержимое «закрытой» типизированной константы из предыдущего примера.

 

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

  1.  Стандартные модули в Паскале.
  2.  Структура модуля.
  3.  Ключевые слова Unit, Interface, Implementation. Описание каждого раздела.
  4.  Концепция разработки собственного модуля. Примеры программ.


 

А также другие работы, которые могут Вас заинтересовать

79094. Легаты и фидеикомиссы. Виды легатов. Ограничения легатов. Универсальный фидеикомисс 23.62 KB
  Виды легатов. Ограничения легатов. Различалось несколько видов легатов. Наиболее существенным было различие легатов pervindictionem и легатов perdmntionem.
79095. Литтеральные договоры и реальные договоры. Заем и ссуда. Различие между этими договорами. Договор хранения его виды. Характер обязательств по договорам ссуды и хранения. Закладной договор 44.38 KB
  обязательство в этом случае устанавливается не только простым соглашением consensus но и передачей вещи res; нельзя требовать возврата от того кто ничего не получал. деньги зерно вино и тому подобные вещи определенные родовыми признаками. получающий юридическую силу лишь с того момента когда на основании соглашения сторон последовала передача res вещи;б предмет договора денежная сумма или известное количество других вещей определенных родовыми признаками весом числом мерой;в эти вещи передаются заимодавцем в собственность...
79096. Наследование по завещанию. Порядок составления. Условия действительности. Содержание завещания. Обязательная доля. Назначение наследника 23.27 KB
  Завещание по римскому праву это не просто всякое распоряжение лица своим имуществом на случай смерти а лишь такое которое содержало назначение наследника. Назначение наследника должно было быть в самом начале завещания и без него завещание не имело юридической силы. Завещание это односторонняя сделка выражающая волю лишь одного лица завещателя. На практике это позволяло завещателю в любой момент и без какихлибо ограничений отменить или изменить составленное им ранее завещание.
79097. Наследование по закону. Реформы претора. Наследование по закону в период империи 30.68 KB
  То обстоятельство что завещание получит действительное значение лишь при условии если назначенный в нем наследник согласится принять наследство не делает завещания договором ибо выражение воли наследника имеет место не при совершении завещания как например согласие одаряемого при дарении а только после смерти завещателя как совершенно самостоятельный отдельный от завещания акт. Некоторые лица хотя и имели testmenti fctio pssiv но не могли получать наследство полностью или в части если не отпадает обстоятельство признаваемое по...
79098. Общие положения о древнеримской семье. Агнатское и когнатское родство 18.89 KB
  Семья в древнейший известный нам период римской истории представляет тип промежуточной патриархальной семьи объединявшей под властью главы семьи pterfmilis жену детей других родственников кабальных а также рабов. Глава семьи и властелин древнейшей семьи домовладыка единственный полноправный гражданин квирит термин производимый многими исследователями от греческого kueros власть т. имеющий власть.С образованием государства внутри рода происходит имущественная дифференциация; власть внутри рода попадает в руки наиболее богатых...
79099. Опека и попечительство. Завещательная опека 21.41 KB
  Опека рассматривалась в Древнем Риме как обязанность лица и поэтому отказаться от исполнений обязанностей опекуна можно было только по уважительной причине. Если не было завещательной опеки и невозможно было установить законную опекуна назначал претор при участии трибунов учреждаемая опека. Особенности учреждаемой опеки: согласия малолетних на установление подобной опеки не требовалось; опекун должен был проживать в округе претора назначающего опе кунство; предварительно узнавали о нравственном поведении будущего опекуна; не...
79100. Определение деликта. Характер и объем ответственности 21.63 KB
  Различались частные и публичные деликты. Публичные деликты посягали на государственные интересы а частные на права и интересы отдельной личности. В настоящем курсе рассматриваются только частные деликты. Основные отличия деликтного обязательства от договорного: основание возникновения не договор а правонарушение; не допускалось правопреемство в отношении должника; штрафная ответственность возлагалась не солидарно на каждого из должников а кумулятивно то есть суммировалась по числу ответчиков и могла быть взыскана с каждого в полном...
79101. Определение обязательства. Основания возникновения обязательств. Классификация обязательств. Сделки. Контракты и пакты 24.8 KB
  Римское право определяло обязательство как правовые оковы в силу которых мы принуждаемся чтонибудь исполнить согласно законам нашего государства . В позднейший период обязательство стало рассматриваться как юридическое отношение между двумя лицами в силу которого одно из них именуемое кредитором имеет право требовать от другого лица именуемого должником исполнения чеголибо в свою пользу. В отличие от вещного права обязательство связывает только тех лиц которые в нем участвуют и поэтому кредитор может предъявить иск не ко всем а...
79102. Особые средства преторской защиты. Понятие исковой давности 19.33 KB
  Помимо предоставления исков преторы пользуясь принадлежащей им властью так называемым imperium оказывали иногда защиту особыми средствами своими безусловными в противоположность формуле иска непосредственными распоряжениями хотя с течением времени и здесь преторы в некоторых случаях перешли на путь условных распоряжений. С течением времени по мере увеличения числа дел претор стал давать интердикты без проверки фактов в виде условного распоряжения если подтвердятся факты на которые ссылается заявитель и тогда интердикты с...