Информатика_Гуда
.pdfГлава 6. Алгоритмизация и программирование
Все виды практически используются. Причем есть классы задач, при решении которых программисту требуется сознательно управлять ходом рекурсивных процедур и функций.
Примеры рекурсивных подпрограмм.
1. Описать рекурсивную функцию digit без параметров, которая под- считывает количество цифр в тексте, заданном во входном файле (за текстом следует точка).
Program rec_4; Var k:integer;
Function digits:integer; Var
ñ:char;
d:integer; Begin
Read (c); d := 0;
If c<> ' · ' Then
If (c <= '9') and (c >= '0') Then d := 1 + digits
Else d := digits; digits := d;
End;
Begin
Write ('Введите текст, последний символ — точка '); k := digits;
writeln(k);
end.
Напечатать в обратном порядке заданный во входном файле текст (за текстом следует точка).
Program rec_5; Procedure perevert;
Var c:char;
Begin
281
Информатика
Read (c);
if c <> '·' then perevert; write(c);
End; Begin
Write('Введите текст'); Perevert;
End.
6.12. Программные модули
Известно, что при написании серь¸зной программы нельзя обойтись без процедур, которые заключают в себе е¸ отдельные части. Крупными строительными единицами в Паскале являются программные модули.
Модуль имеет имя и может содержать описание многих процедур и функций, а также описания констант, типов данных и переменных. Каждый программный модуль транслируется отдельно, оттранслированные модули объединяются в выполнимую программу — этот процесс называется «сборкой».
Однажды написанный и оттранслированный модуль можно многократно использовать в различных программах. Это позволяет:
•сэкономить время и силы программиста;
•сократить время трансляции;
•уберечь от искажений исходный текст модуля.
Чтобы подключить модуль к программе и сделать видимым его содержимое, достаточно упомянуть его имя в разделе USES <имя модуля> (должно быть первым предложением программы).
Необходимость использования модулей обусловлена следующими причинами:
•для размещения в памяти большой программы может не хватить одного сегмента памяти (его размер максимум 64 Кб). Количество используемых модулей ограничивается лишь доступной памятью;
•в большинстве реальных применений ЭВМ нужны библиотеки блоков (процедур и функций) с простым доступом к блокам.
KМодуль — это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний и, возможно, некоторые исполняемые операторы инициирующей части.
282
Глава 6. Алгоритмизация и программирование
6.12.1. Структура программного модуля
UNIT <имя модуля> (заголовок модуля)
. . . .
INTERFACE — интерфейсные раздел («видимая» часть модуля)
. . . .
IMPLEMENTATION — раздел реализации («черный ящик»)
. . . .
[BEGIN] — раздел инициализации (необязательный)
. . . .
END.
Имя модуля должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается предложением UNIT USES <список модулей>.
Âосновной программе с USES должен начинаться раздел описаний.
Âмодулях USES может следовать сразу за зарезервированным словом INTERFACE, либо за IMPLEMENTATION (либо и там, и там).
Интерфейсный раздел содержит объявления всех глобальных объектов, констант, переменных, типов, подпрограмм модуля, которые должны быть доступны основной программе и другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок. Зачем? Без информации о формальных параметрах блоков нельзя правильно «собрать» программу из модулей.
Описанные здесь объекты необязательно должны использоваться в блоках данного модуля. Например, модуль может не содержать ни одного блока, а включать в себя описание сложных типов, используемых во многих программах пользователя. Это сокращает размер программы
èускоряет подготовку исходных текстов.
Например:
UNIT M1;
Interface
Var x:integer;
Procedure Sum(a,b: integer, var s: integer);
.. .
Если теперь в программе написать предложение USES M1;, то в основной программе станет доступным переменная Х и процедура Sum.
283
Информатика
Раздел реализации — в него помещают блоки, заголовки которых приведены в интерфейсной части, и вспомогательные (локальные для модуля)объекты(типы,константы,переменные,подпрограммы),используемые только в данном модуле. Эти объекты недоступны другим модулям и основной программе.
Подпрограммы, объявленные в интерфейсной части модуля, в разделе реализации должны содержать заголовок, в котором могут быть опущены список формальных параметров и тип результата (для функций).
Например:
. . .
Implementation Procedure Sum;
Begin
S:= a + b End;
Раздел инициализации завершает модуль, может отсутствовать (тогда нет и BEGIN) или быть пустым. Описывает «разовые» подготовительные действия, восполняемые при загрузке программы в память. Содержит исполняемые операторы, которые выполняются до передачи управления основной программе и обычно используются для подготовки е¸ работы. Если модулей несколько, то операторы данного раздела выполняются в порядке указания им¸н в USES. Например, здесь могут инициализироваться (задаваться начальными значениями) переменные, открываться файлы и т. д.
Пример:
{Модуль} UNIT M1; Interface
Var x:integer;
Procedure Sum(a,b:integer; var s:integer); Implementation
Procedure Sum; Begin S := a + b; End;
end.
284
Глава 6. Алгоритмизация и программирование
{Основная программа} Program main;
Uses M1;
Var y,z:integer; Begin
Readln(x,y);
sum(x,y,z);
Writeln(z)
end.
Модуль следует хранить в одноим¸нном файле с расширением PAS.
6.12.2. Трансляция модуля. «Сборка» программы
Результатом трансляции модуля является файл с тем же именем и расширением TRU. Он должен записываться на диск, тогда как результат трансляции программы в целом (EXE — файл) может оставаться в оперативной памяти.
Интерфейсная часть нужна для того, чтобы при получении файла проверить правильность обращения к блокам модуля.
В интерфейсной среде Паскаля в главном меню следует использовать подменю Compile. Пункты этого меню :
Compile (Alt — F9) Make F9
Build
Destination Memory Primary file
Первые три предназначены для запуска трансляции.
I. Если использовать Compile, то необходимо установить «Destination Disk», оттранслировать модуль, затем оттранслировать программу. Файл с расширением TRU должен находиться в каталоге, указанном в опции UNIT DIRECTORIES.
Пункты Make и Build — удобнее.
II. Make — для каждого модуля проверяет:
•существование TRU-файла. Если его нет, то он созда¸тся пут¸м трансляции исходного текста модуля;
•соответствие TRU-файла исходному тексту модуля (в него могут быть внесены изменения, в этом случае TRU-файл созда¸тся заново автоматически);
285
Информатика
• неизменность интерфейсного раздела модуля (в противном случае перекомпилируются все модули, в начале которых данный модуль указан в разделе USES).
Эти пункты не требуют обязательных исходных текстов модулей. III. Build — в отличии от Make, требует наличия исходных текстов
вcех модулей, так как все они компилируются (дольше!), в остальном совпадает.
IV. Run (выполнение).
Âслучаях II — IV программа и модули транслируются совместно. Активнымдолжнобытьокноосновнойпрограммы.(Иначе—имяфайла основной программы должно быть указано в опции Primary file).
Âобщем случае, ссылки модулей друг на друга могут образовывать сложные структуры.
6.12.3. Ссылки на модули
Модуль как программа может использовать объекты, описанные в других модулях. Если эти объекты находятся в интерфейсном разделе, то он должен начинаться со слова USES, в котором перечисляются имена всех модулей.
Если на объекты есть ссылки только из раздела реализации, предложение USES может находиться в разделе реализации.
В общем случае, ссылки модулей друг на друга могут образовывать сложные структуры (рис. 6.2). При этом запрещается явное или косвенное обращение модуля к самому себе.
Основная программа |
Unit A1; |
Unit A2; |
USES A1; |
interface |
interface |
. |
USES A2; |
… |
. |
… |
implementation |
. |
implementation |
… |
begin |
… |
|
end. |
end. |
end. |
Рис. 6.2
Взаимные ссылки двух модулей возможны только из разделов реализации (рис. 6.3).
286