Формальные и фактические параметры
В заголовке процедуры или функции может содержаться список параметров, которые представляют собой идентификаторы переменных и служат для обмена значениями между подпрограммой и вызывающей её программной единицей. При этом в описании подпрограммы, поскольку оно включается в тексте программы один раз, имена параметров выбираются определённым образом и безотносительно к именам переменных, используемых в других частях программы. Такие параметры, имена которых указаны в заголовке подпрограммы, называются формальными.
С другой стороны, при каждом новом обращении к подпрограмме в неё могут передаваться значения разных переменных. Такие переменные, имена которых подставляются в операторы вызова подпрограммы при фактическом обращении к ней, называются фактическими параметрами.
Список формальных параметров может отсутствовать. В том случае, если он есть, то в нём должны быть перечислены имена формальных параметров и их типы.
Формальные параметры могут включать в себя:
1. Параметры-значения;
2. Параметры-переменные;
3. Параметры-константы;
4. Параметры-массивы и параметры-строки;
5. Нетипизированные параметры-переменные;
6. Процедурные типы:
a. Параметры-функции;
b. Параметры-процедуры.
В свою очередь, формальные параметры делятся на входные и выходные параметры. К выходным параметрам относятся параметры-переменные, а остальные параметры следует отнести к входным параметрам подпрограмм.
Рассмотрим несколько формальных параметров.
Параметры-значения
Формат:
(q1, q2, .., qn: <тип>); или
(q1: <тип>; q2: <тип>; .. qn: <тип>);
где q1, q2, .., qn – имена параметров.
Например, (q1, q2 : real); (q1: integer; q2: real);
Параметры-переменные определяют выходные данные процедуры (результаты обработки данных), которые передаются в основную программу.
Для выделения выходных переменных перед ними ставится слово Var.
Формат:
(var t1, t2, .., tn: <тип>); или
(var t1: <тип>; var t2: <тип>; .. var tn: <тип>);
где t1, t2, tn – параметры-переменные.
Например, (var t1: real; var t2, t3: integer);
Параметры-константы
Формат:
(const t1, t2, .., tn: <тип>); или
(const t1: <тип>; const t2: <тип>; .. const tn: <тип>);
где t1, t2, tn – параметры-константы.
Например, (const t1: real; const t2, t3: integer);
Пример 8.1.Procedure MyProc(var a : Real; b : integer; const c: char);
Здесь, a – параметр-переменная, b – параметр-значение, c – параметр-константа.
Параметры-процедуры и параметры-функции. Это параметры, которые сами являются процедурами или функциями.
Между формальными и фактическими параметрами должны быть следующие соответствия:
1. количество параметров;
2. порядок следования входных и выходных параметров;
3. тип данных.
Для того чтобы понять, в каких случаях использовать тот или иной тип параметров, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определён как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передаётся подпрограмме. Даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, всё равно подпрограмме будет передана лишь копия переменной (константы). Любые возможности изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра.
Если параметр определён как параметр-переменная, то при вызове подпрограммы передаётся сама переменная, а не её копия (фактически в этом случае подпрограмме передаётся адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.
В случае параметра-константы в подпрограмму также передаётся адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
Пример 8.2.
…
const
a: integer = 5;
b: integer = 7;
{объявление процедуры}
procedure Inc2 (var c: integer; b: integer); {заголовок процедуры}
begin {начало тела подпрограммы}
c := c+c;
b := b+b;
writeln (‘удвоенные :’, c:5, b:5);
end; {конец тела подпрограммы}
begin {начало тела основной программы}
writeln (‘исходные :’, a:5, b:5);
inc2(a, b); {вызов тела подпрограммы}
writeln (‘результат :’, a:5, b:5);
end. {конец тела подпрограммы}
В результате прогона программы, на экран будет выведено:
Исходные : 5 7
Удвоенные : 10 14
Результат : 10 7
Задача 8.1. Определить расстояние между двумя точками.
Блок-схема алгоритма
Листинг процедуры DLINA
PROCEDURE DLINA (X1, X2, Y1, Y2 : REAL; VAR L : REAL);
BEGIN
L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAM TASK;
VAR Q1, Q2, K1, K2, D : REAL;
PROCEDURE DLINA(X1,X2,Y1,Y2 :REAL; VAR L : REAL);
BEGIN
L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));
END;
BEGIN
READLN (Q1, Q2, K1, K2);
DLINA (Q1, Q2, K1, K2, D);
WRITELN (D);
END.
Здесь,
Q1, Q2, K1, K2, D – глобальные переменные,
X1, X2, Y1, Y2, L – формальные параметры, где
X1, X2, Y1, Y2 – входные параметры-значения и
L – выходной параметр-переменная.
Задача 8.2. Определить в одномерном массиве минимальный элемент и его номер.
Примечание. Если в качестве параметров используются массивы, их необходимо объявлять в разделе типов.
Блок-схема алгоритма подпрограммы-процедуры MINVECTOR
Листинг подпрограммы-процедуры MINVECTOR
PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);
VAR
I: INTEGER;
BEGIN
MIN:= 1;
FOR I:=2 TO L DO
IF D[MIN] > D[I] THEN MIN:= I;
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAM TASK;
CONST N = 25;
TYPE VECTOR = ARRAY[1..N] OF REAL;
VAR I, M : INTEGER; A: VECTOR;
PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);
VAR I: INTEGER;
BEGIN
MIN:= 1;
FOR I:=2 TO L DO
IF D[MIN] > D[I] THEN MIN:= I;
END;
BEGIN
FOR I := 1 TO N DO READLM (A[I]);
MINVECTOR (A, N, M);
WRITELN (‘Минимальный элемент массива равен - ’, A[M]:3);
END.
Задача 8.3. Даны три массива А (20), В (30), С (25). Расположить элементы по возрастанию. Использовать процедуры для формирования массива, вывода первоначальных значений на экран и вывода упорядоченных элементов массива.
Блок-схема алгоритма подпрограммы InputVector
Листинг подпрограммы InputVector
PROCEDURE INPUTVECTOR (L: INTEGER; VAR D: VECTOR);
VAR I : INTEGER;
BEGIN
RANDOMIZE;
FOR I:=1 TO L DO D[I]:=RANDOM (101) - 50;
END;
Блок-схема алгоритма подпрограммы OutputVector
Листинг подпрограммы OutputVector
PROCEDURE OUTPUTVECTOR (L: INTEGER; D: VECTOR);
VAR I : INTEGER;
BEGIN
FOR I:=1 TO L DO WRITELN (D[I]);
END;
Блок-схема алгоритма подпрограммы SortVector (сортировка посредством выбора)
Листинг подпрограммы SortVector
PROCEDURE SORTVECTOR (L: INTEGER; VAR D: VECTOR);
VAR
I, J, T : INTEGER;
BEGIN
FOR I:=1 TO L-1 DO
FOR J:=I+1 TO L DO
IF D[J]>D[I] THEN
BEGIN
T:= D[I];
D[I]:= D[J];
D[J]:= T;
END;
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAM TASK;
USES CRT;
CONST N = 30;
TYPE
VECTOR = ARRAY[1..N] OF INTEGER;
VAR
A, B, C : VECTOR;
PROCEDURE SORTVECTOR
(L: INTEGER; VAR D: VECTOR);
VAR
I, J, T : INTEGER;
BEGIN
FOR I:=1 TO L-1 DO
FOR J:=I+1 TO L DO
IF D[J]>D[I] THEN
BEGIN
T:= D[I];
D[I]:= D[J];
D[J]:= T;
END;
END;
BEGIN
CLRSCR;
INPUTVECTOR(20, A);
INPUTVECTOR(30, B);
INPUTVECTOR(25, C);
WRITELN (‘Сформированный массив А: ’);
OUTPUTVECTOR(20, A);
WRITELN (‘Сформированный массив В: ’);
OUTPUTVECTOR(30, B);
WRITELN (‘Сформированный массив С: ’);
OUTPUTVECTOR(25, C);
WRITELN (‘Отсортированный массив А: ’);
SORTVECTOR(20, A);
WRITELN (‘Отсортированный массив В: ’);
SORTVECTOR(30, B);
WRITELN (‘Отсортированный массив С: ’);
SORTVECTOR(25, C);
READLN;
END.
Вопросы для самопроверки
1. Дайте определение подпрограммы?
2. Каково основное назначение подпрограммы?
3. Как можно описать процедуру?
4. Каким образом процедура возвращает результат?
5. Где указывается список формальных параметров?
6. Для чего используются фактические параметры?
7. Каков принцип действия выходных и входных параметров?
8. В чём заключается различие между параметрами-значениями и параметрами-переменными?
9. Каков формат вызова процедуры и передачи параметров?
10. Какие три правила необходимо учитывать при передаче параметров?
11. В чём состоит принцип использования глобальных и локальных переменных?
Лабораторная работа №8_1