Процедури, підпрограми та параметри
послідовність операторів
end;
Процедура, як і функція, є означенням імені і записується серед означень програми.
На відміну від функції, в її заголовку немає імені типу для значень, породжуваних у результаті виклику, тому що ніякі значення не породжуються. За цією ж причиною в тілі процедури не може бути операторів присвоювання з її ім'ям у лівій частині. Виклик процедури складається з імені й аргументів у дужках і записується як окремий оператор, наприклад, readln(x, y).
Отже, напишемо інший варіант програми упорядкування трьох значень:
program sort31(input, output);
var a, b, c : integer;
procedure swap(xx, yy : integer);
var t : integer;
begin t:=xx; xx:=yy; yy:=t end;
begin
writeln('задайте три цілих:'); readln(a, b, c);
if a>b then swap(a, b);
if b>c then swap(b, c);
if a>b then swap(a, b);
writeln('упорядкування: ', a, ' ', b, ' ', c)
end.
КРАСИВО, АЛЕ НЕПРАВИЛЬНО!
Справа в тім, що при виконанні виклику, наприклад, swap(a, b), змінні xx і yy одержать значення змінних a і b, потім ці значення поміняються місцями, виконання виклику закінчиться, а в змінних a і b залишаться ті ж самі значення, що були перед викликом. Наприклад, якщо змінним a, b, c присвоїти "з зовнішнього світу" значення відповідно 3, 1, 2, то буде надруковано упорядкування: 3 1 2. Слушність цього напису дуже сумнівна.
Отже, при виконанні виклику процедури (чи функції) спочатку параметри одержують значення аргументів, а потім їх зміни ніяк не відбиваються на аргументах (рис.3.3). Тому параметри, що дотепер розглядалися, називаються параметрами-значеннями.
Мова Паскаль допускає в заголовках процедур і функцій означати параметри іншого виду. Вони називаються параметрами-змінними і означаються зі словом var попереду. Так, процедура swap набуває вигляду:
procedure swap(var xx, yy : integer);