9.4. Аргументы и параметры
Параметры - данные, с которыми работает подпрограмма. Это внутренние данные для подпрограммы и перечисляются в ее заголовке с указанием типов.
Они связаны с аргументами.
Аргументы - данные, передаваемые в подпрограмму или возвращаемые из нее. Это внешние для подпрограммы данные, с которыми имеет дело вызывающая часть программы. В подпрограмме им соответствуют параметры. Указываются в списке аргументов при обращении к подпрограмме и являются фактическими параметрами.
Синонимы:
Параметры = формальные параметры,
Аргументы = фактические параметры.
------------------------------------------------------
Для аргументов и параметров надо соблюдать:
-
одинаковое количество (An=Pn) ,
-
одинаковый порядок следования (A1-P1, A2-P2..)
-
совместимость типов.
Все формальные параметры разделяются на 4 категории:
-
параметры-значения – в списке параметров указывается их тип, например (x,y : real); передаются через стек в виде копий и остаются неизменными в подпрограмме;
-
параметры-константы – в списке параметров снабжаются служебным словом (const s : real); передаются подпрограмме в виде копий с помощью адресов, изменяться подпрограммой не могут;
-
параметры-переменные – в списке параметров снабжаются служебным словом (x,y:byte; var s1 : real); передаются подпрограмме в виде копий с помощью адресов, инструкции подпрограммы могут изменить значение переменной, являющейся фактическим параметром;
-
параметры процедурного типа – в списке задаются именами и являются параметрами-значениями.
9.5. Области действия имен
Структура подпрограммы идентична структуре программы.
Имена, объявленные в главной программе являются глобальными. Они доступны во всех внутренних точках, в том числе и в подпрограммах.
Имена, объявленные в подпрограмме являются локальными. Они доступны во всех внутренних точках подпрограммы.
Локальное имя во внешней программе недоступно. Память под них выделяется автоматически в момент вызова подпрограммы.
Если используются одинаковые локальное и глобальное имя, то внутри процедуры локальное имя блокирует глобальное.
Формат доступа к глобальному имени:
<имя программы>.<глобальное имя> //имя составное
Чтобы получить доступ к такому глобальному имени в подпрограмме его надо указывать составным.
9.6. Функция
Объявление функции в общем виде
Function <Имя> (p1,p2:T1;...):T; // Заголовок функции: Имя функции
var
//объявление локальных переменных - параметров
begin
------------ // тело функции
Имя :=<выражение>; //или
Result := <выражение>; //глобальное имя
------------
end;
--------------------------------------------------------
Имя - имя функции (имя существительное) используется для ее вызова,
T - тип возвращаемого функцией результата.
p1, p2 - имена формальных параметров, значение которых используются для вычисления значения функции. Объявляется в заголовке функции. Конкретные значения параметры получают во время работы программы в результате вызова функции из основной программы.
T1 - их тип.
Обращение при обычном синтаксисе.
Форма вызова функции:
program Example3;
…
uses
SysUtils;
var // Объявление аргументов.
a1: integer;
a2,a3: real;
Function MyFunc(p1: integer; p2: real): real; //Заголовок функции
// Разделы локальных определений
begin
//Тело функции
MyFunc:=<выражение>;
. . .
end;
begin //Основная программа
...............
a3:=3+MyFunc(a1,a2); //Вызов функции по имени в выражении
...............
end.
-----------------------------------------------------
Соответствия: p1 - a1, p2 - a2
Задача1 . Написать функцию, проверяющую, является ли целое число, введенное с клавиатуры четным. Программа должна использовать эту функцию, проверять является ли число четным или нет, и выводить соответствующее сообщение.
program Example4;
…
uses
SysUtils;
var
m: integer; //вводимое с клавиатуры число
function Chet(n:integer): boolean; //Заголовок функции
begin //Тело функции Chet
if n mod 2 = 0 then Chet:=True
else Chet:=False;
end;
begin // Основная программа
repeat
readln (m); // Проверка условия на четность
// числа m с помощью функции Chet
if chet(m) then writeln(m,' - chetnoe chislo')
else writeln(m,' - nechetnoe chislo');
until m=0;
readln
end.