- •Лекция 7 Подпрограммы, модули, файлы
- •1. Подпрограммы
- •1.1 Глобальные данные
- •1.4 Процедуры
- •1.5. Передача массивов в качестве параметров
- •1.5.1. Формальные параметры как массивы с фиксированными размерами
- •Var {main – главная программа }
- •1.5.2. Формальные параметры как массивы со «свободными» размерами
- •1.6. Передача подпрограммы как параметра
- •1.7. Рекурсивные подпрограммы
- •2. Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация }
- •3. Файлы. Основные понятия и операции
- •3.1. Последовательный доступ к компонентам файла
- •3.2. Типизированные файлы
- •Стандартные процедуры и функции работы с типизированными файлами
- •3.3. Текстовые файлы
- •Процедуры и функции работы с текстовыми файлами
1.4 Процедуры
Формат спецификации процедуры:
procedure <имя>(<список формальных параметров>);
Входные параметры (аргументы) процедуры передаются значением или по адресу, а выходные параметры (результаты) – по адресу.
Вызов процедуры – это отдельный оператор, который содержит имя процедуры и список фактических параметров.
Например:
P(x); {это вызов процедуры P(x) }
В качестве примера использования процедуры рассмотрим описание и использование той же самой подпрограммы power. В этом случае, наряду с аргументами base и exponent, которые передаются по значению, необходимо добавить в спецификацию процедуры выходной параметр (результат), который должен быть передан по ссылке (в примере это pow).
procedure power( base, exponent: real; var pow: real);
begin
pow:= exp( exponent * ln(base));
end;
Пример вызова процедуры power:
power(3, 4, j);
writeln(j);
1.5. Передача массивов в качестве параметров
В качестве примера будем использовать подпрограмму вычисления суммы значений элементов одномерного массива.
1.5.1. Формальные параметры как массивы с фиксированными размерами
В данном примере для описания типов параметров используется заранее определенный тип massiv с фиксированной размерностью.
uses crt;
const N=3;
type
massiv = array[1..N] of integer;
function sum_1( x: massiv ): integer;
var
i : integer; sum: integer;
begin
sum:= 0;
for i:= 1 to N do sum:= sum+x[i];
sum_1:= sum;
end;
Var {main – главная программа }
i:integer; a:massiv;
begin
clrscr;
writeln('massiv a');
for i:=1 to N do readln(a[i]);
writeln('summa= ', sum_1(a));
end.
1.5.2. Формальные параметры как массивы со «свободными» размерами
Существует несколько возможностей передавать массивы в подпрограмму, не указывая их размеры. В языке Pascal для этого можно использовать функции low, high и sizeof. Использование функций low, high и sizeof требует подключения модуля crt.
Функции low и high возвращают соответственно наименьшее и наибольшее значение индекса массива. Использование функции high для определения размера массива в подпрограмме приведено на рисунке 2.


Рисунок 2 – Использование функции high
Для лучшего понимания и правильного использования этих функций раскомментируйте отладочные операторы (debug) программы (рисунок 2), а также познакомьтесь с содержанием Помощи (меню Help) для этих функций.
Использование функции sizeof для определения размера массива в подпрограмме приведено на рисунке 3. Функция sizeof возвращает размер объекта данных в байтах.

Рисунок.3 – Использование функции sizeof
Обратите внимание, что в данных примерах описание размеров фактического массива a начинается с 0.
1.6. Передача подпрограммы как параметра
Если необходимо передать в качестве фактического параметра имя подпрограммы, то соответствующий ему формальный параметр должен иметь процедурный тип, соответствующий прототипу подпрограммы.
В качестве примера рассмотрим программу, которая строит таблицу сумм и произведений целых чисел. Для построения таблицы используется процедура PrintTable, которая для вычисления значения таблицы вызывает функцию add (вычисление суммы) или функцию Multiply (вычисление произведения). Имя вызываемой функции процедура получает как параметр Operation.
В программе описание процедурного типа имеет вид:
type
Func = function (x,y;integer):integer;
Спецификация подпрограммы, имя которой используются в качестве параметра, должна содержать ключевое слово far («дальний вызов»). Это указание необходимо компилятору для правильной генерации исполняемой программы.
Пример передачи подпрограммы как параметра приведен на рисунке 4.


Рисунок 4. – Пример передачи подпрограммы как параметра
