Область дії означень та побічний ефект
begin x3:=x1*y2+x2*y1; y3:=y1*y2;
redufr(x3, y3)
end;
Щоб скоротити дріб, треба його чисельник і знаменник розділити на їх найбільший спільний дільник (задача 4.5). Нехай його обчислення задає функція gcd, яку ми тут не уточнюємо. Тоді процедура скорочення redufr очевидна:
procedure redufr(var x1, y1 : integer);
var t : integer;
begin
t:=gcd(x1, y1);
x1:=x1 div t; y1:=y1 div t
end;
Нарешті, наведемо розташування наведених підпрограм у блоці програми. Функція gcd повинна бути записана перед процедурою redufr, оскільки в ній визивається. Так само ця процедура повинна бути записана перед процедурою plusfr. Взаємне розташування plusfr, writefr і readfr не має значення:
…
function gcd(x, y : integer) : integer; …
begin … end;
procedure redufr(var x1, y1 : integer); …
begin … gcd … end;
procedure plusfr(x1, y1, x2, y2 : integer; var x3, y3 : integer);
begin … redufr … end;
procedure readfr(var x, y : integer);
begin … end;
procedure writefr(x, y : integer);
begin write(x, '/', y) end;
Запис програми в остаточному вигляді залишаємо як вправу.
Переозначати ім'я підпрограми в ній самій мова Паскаль забороняє. Але дозволяє використовувати його, тобто позначати ним виклики цієї ж підпрограми. Такі виклики підпрограми усередині її самої називаються рекурсивними; ми познайомимося з ними в розділі 9.