- •4. Структурированные типы данных
- •4.1. Массивы
- •4.1.1. Задание массивов
- •4.1.2. Обработка массивов.
- •4.1.3. Операторы блока данных и чтения из блока данных в языке Бейсик
- •4.1.4. Типизированные константы в языке Паскаль
- •4.2. Символьный и строковый типы данных.
- •4.2.1. Описание символьного и строкового типа данных.
- •4.2.2. Операции над строками.
- •3. Принцип модульности.
- •3.1. Процедуры.
- •3.2. Функции.
- •3.3. Параметры-процедуры и параметры-функции. Процедурный тип.
- •3.4. Длинная арифметика.
- •4. Рекурсия.
- •4.1. Понятие рекурсии.
- •4.2. Формы рекурсий.
- •5. Модули в языке turbo pascal. Модуль пользователя.
- •5.1. Стандартные модули.
- •5.2. Модуль пользователя.
- •6. Обзор графических возможностей языков высшего уровня.
5.2. Модуль пользователя.
Рассмотрим общую структуру модуля:
UNIT <идентификатор>; {Заголовок модуля}
INTERFACE {Интерфейсная секция}
[USES <список модулей>;]
<раздел описаний>;
IMPLEMENTATION {Исполняемая часть}
[USES <список модулей>;]
<раздел описаний>;
<раздел процедур и функций>;
(<раздел операторов>. | END.)
Раздел Unit содержит имя библиотечного модуля. Оно должно совпадать с именем дискового файла, где содержится исходный текст модуля. Например, если файл называется Stat.pas, то модуль должен иметь то же имя:
Unit Stat;
Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением
Uses <список модулей>;
где Uses – служебное слово, <список модулей> - список модулей, с которыми устанавливается связь; элементами списка являются имена модулей, отделяемые друг от друга запятыми, например:
Uses CRT, Stat;
Если модуль используется в основной программе, то предложение Uses… должно открывать раздел описаний программы. Если модуль используется в другом модуле, то предложение Uses… может следовать либо сразу за служебным словом Interface, либо сразу за служебным словом Implementation. Помните: если модуль использует другие модули, то имена этих модулей также должны быть указаны в предложении Uses, причем до имени того модуля, который их использует!
В интерфейсной секции указываются описания глобальных констант, типов, переменных, а также приводятся заголовки глобальных процедур и функций, которые могут стать доступными основной программе или другим модулям.
Интерфейсная секция – это как бы «видимая» часть модуля, через которую осуществляется взаимодействие данного модуля с программой и другими модулями. Объявление подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти, чем обеспечивается доступ к этим подпрограммам из основной программы и других модулей.
Все константы и переменные, объявленные в интерфейсной части модуля, равно как и глобальные объекты основной программы, помещаются компилятором Turbo Pascal в общий сегмент данных. Порядок появления различных разделов объявлений и их количество могут быть произвольными. По механизму действия интерфейсная секция аналогична опережающему описанию.
Секция реализации – исполняемая часть модуля, где размещают описания объявленных в интерфейсной части подпрограмм, а также описания локальных для модуля объектов – вспомогательных типов, констант, переменных, процедур, функций и меток, используемых в инициализирующей части. Это как бы «скрытая» от пользователя часть модуля.
Объявленные ранее в интерфейсной части глобальные процедуры и функции должны описываться в той же последовательности, что и их заголовки в интерфейсной части. При этом в заголовках процедур и функций исполняемой части разрешается опускать список формальных параметров и тип результата для функций, так как они уже описаны в интерфейсной части. Но если заголовок приводится в полном виде, то он должен совпадать с заголовком интерфейсной части.
Подпрограммы, локальные для секции реализации (т. е. не описанные в интерфейсной секции), должны иметь полный заголовок.
Пример 5.2.1.
Напишем программу, производящую операции над комплексными числами (умножение, сложение и деление). При этом:
(a + b*i)*(c + d*i) = (a*c – b*d) + (a*d +b*c)*i
(a + b*i) + (c + d*i) = (a + c) + (b + d)*i
(a + b*i)/(c + d*i) = ((a*c + b*d) + (b*c – a*d)*i)/(c2 + d2)
UNIT RE;
INTERFACE
FUNCTION SLO (X, Y: REAL): REAL;
FUNCTION UMN (X, Y: REAL): REAL;
FUNCTION DEL (X, Y: REAL): REAL;
IMPLEMENTATION
FUNCTION SLO;
BEGIN
SLO:= X + Y
END;
FUNCTION UMN;
BEGIN
UMN:= X*Y
END;
FUNCTION DEL;
BEGIN
DEL:= X/Y
END;
END.
UNIT COMP;
INTERFACE
USES RE;
PROCEDURE SLOC (A, B, C, D: REAL; VAR A1, B1: REAL);
PROCEDURE UMNC (A, B, C, D: REAL; VAR A1, B1: REAL);
PROCEDURE DELC (A, B, C, D: REAL; VAR A1, B1: REAL);
IMPLEMENTATION
PROCEDURE SLOC;
BEGIN
A1:= SLO (A, C);
B1:= SLO (B, D)
END;
PROCEDURE UMNC;
BEGIN
A1:= SLO (UMN (A, C), -UMN (B, D));
B1:= SLO (UMN (A, D), UMN (B, C))
END;
PROCEDURE DELC;
BEGIN
A1:= DEL (SUM (UMN (A, C), UMN (B, D)), SUM (SQR (C), SQR (D)));
B1:= DEL (SUM (UMN (B, C), -UMN (A, D)), SUM (SQR (C), SQR (D)));
END;
END.
USES COMP; {основная программа}
VAR
A, B, C, D, AC, BD: REAL;
BEGIN
WRITE (‘Действительная и мнимая часть первого числа? ‘);
READLN (A, B);
WRITE (‘Действительная и мнимая часть второго числа? ‘);
READLN (C, D);
SLOC (A, B, C, D, AC, BD);
WRITELN (A, ’+’, B, ’i’, ’+’, C, ’+’, D, ’i=’, AC, ’+’, BD, ’i’);
UMNC (A, B, C, D, AC, BD);
WRITELN (A, ’+’, B, ’i’, ’*’, C, ’+’, D, ’i=’, AC, ’+’, BD, ’i’);
DELC (A, B, C, D, AC, BD);
WRITELN (A, ’+’, B, ’i’, ’/’, C, ’+’, D, ’i=’, AC, ’+’, BD, ’i’);
END.