Процедура без параметров может реализовывать любой алгоритм. Все переменные, над которыми производят действия операторы процедуры, определяются в вызывающей программе, им присваиваются необходимые для выполнения процедуры значения.
Рассмотрим пример вычисления наименьшего общего кратного двух натуральных чисел НОК (X, Y), которое можно вычислить, используя наибольший общий делитель этих чисел, по формуле:
HOK(X,Y) = Х*У/НОД(Х,У).
При составлении программы оформим как процедуру без параметров программу Р7 — вычисление НОД по алгоритму Евклида. Результат работы процедуры будет заносится в ячейку с именем М, переменная М описана как глобальный параметр и используется и главной программой, и процедурой. В программе будем вычислять НОК нескольких чисел, занеся их в массив С. Этот массив формируется в разделе констант главной программы. Если данные определяются в разделе констант, то они не требуют дополнительного описания в разделе переменных (var). Переменная Х сначала содержит значение первого числа, а затем ей присваивается результат — НОК двух первых чисел. Переменная Y имеет своим значением второе число из пары, для которой вычисляется наименьшее общее кратное. Таким образом, при каждом шаге цикла вычисляется НОК двух чисел, первое из которых Х содержит результат предыдущего шага.
Вызов процедуры НОД вычисления наибольшего общего делителя осуществляется только по имени: NOD;
Рассмотрим пример выполнения программы вычисления НОК нескольких чисел.
m: = а; {результат работы процедуры присваивается глобальной переменной}
end;{конец процедуры}
begin{начало главной программы}
x: = с[1 ];
fori: = 2to5 do
Begin
y:= c[i];
NOD;{вызов процедуры без параметров}
x: = x * у div m {div — деление нацело для целочисленных данных}
end;
write (‘ НОК = ‘, x)
end.{конец главной программы}
Процедуры с параметрами. Для удобства передачи данных в процедуру и получения из нее результата используютсяформальные и фактические параметры. Формальные — условные обозначения в описании процедуры — описываются в ее заголовке, фактические — с которыми требуется выполнить процедуру — перечисляются при вызове процедуры, формальные и фактические параметры должны соответствовать по количеству, типу и порядку следования. Формальные параметры описываются только в заголовке процедуры и больше нигде. Их описание похоже на описание данных в разделе переменных и может также содержать словоvar. Словоvar в заголовке процедуры ставится перед теми параметрами, имена которых соответствуют выходным данным. Фактические параметры, соответствующие формальным, перед которыми стоит словоvar, могут быть только именами переменных. Перед именами формальных переменных, являющимися входными данными процедуры, словоvar указывать не обязательно. Если перед формальным параметром в заголовке процедуры нет словаvar, то ему может соответствовать формальный параметр, имеющий вид выражения соответствующего типа. Если для входных данных процедуры при описании формальных параметров указано словоvar, то им также соответствуют фактические параметры — имена переменных.
Например, процедураNOD с параметрами может иметь заголовок:
procedure NOD (a, b: integer; var k: integer);
Вызов этой процедуры:NOD (x, у, m);
или:NOD (36, 54, m);
Переменные в заголовке процедуры — формальные параметры, заменяемые при выполнении процедуры на конкретные значения переменных х и у или числа 36 и 54. В заголовке процедуры NOD описаны формальные параметры: a и b — входные данные, для которых находится наибольший общий делитель; k — результат работы процедуры. При вызове процедуры переменная а примет значение x, а переменная b — значение у. Результат работы процедуры при вызове попадет в ячейку с именем т, которой соответствует формальный параметр k.
Программа при использовании процедуры с параметрами примет вид:
program Р22;
const с: array[1 ..5] of integer= (36,54,72,18,15);
В программе Р23 появился новый раздел описаний — раздел типов данныхtype. В этом разделе можно описать новый тип данных через уже известные типы, которые могут быть так же ранее описаны в данном разделе. Тип данных R — это массивы из n вещественных чисел, R — имя типа. В дальнейшем этот тип позволяет сократить описания, он используется в главной программе при описании исходного массива Y и в заголовке процедуры при описании формального параметра — массива X.
Главная программа состоит из трех основных этапов: 1) ввода данных — массива Y; 2) вызова процедурыStat с фактическими параметрами — массивом Y и получаемыми результатами, попадающими соответственно в ячейки А (среднее значение), В (наименьшее) и С (наибольшее); 3) печати результатов работы программы.
Подпрограммы-функции.
Подпрограмма, имеющая единственный результат, может быть оформлена, как функция. Описание функции имеет вид:
function имя_функции (описание входных данных):
тип_результата;
{описания локальных переменных}
Begin
{операторы}
имя_функции: = результат;
end;
После описания формальных параметров, которые являются аргументами функции, в заголовке указывается тип результата, т. е. тип самой функции. Это описание относится к имени функции, которому необходимо присвоить значение результата работы подпрограммы. Как и процедура, функция может содержать все четыре раздела описаний локальных переменных.
Имя функции нельзя использовать для промежуточных вычислений.
Функция вызывается с помощью указателя. Указатель — это имя функции, после которого в круглых скобках перечислены фактические параметры — аргументы функции. Указатель имеет вид:
имя_функции(список фактических параметров)
Указатель может появиться в выражении соответствующего типа, в условиях операторов if, while и repeat после словаuntil,а также в операторе печатиwrite. Примерами являются встроенные арифметические функции, такие, как sin(x):
write (sin(x));
Рассмотрим третий вариант программы вычисления наименьшего общего кратного. Поскольку наибольший общий делитель двух натуральных чисел — единственное число, то вычисляющую его подпрограмму можно оформить, как функцию. Программа имеет вид: