Основы программирования на C++, PASCAL
3.13. Подпрограммы
С понятием вспомогательного алгоритма вы уже знакомы (см. разд. 1.4). В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпрограмм: процедуры и функции. Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа a и b. Требуется определить наибольший общий делитель трех величин: а + b, |а – b|, а • b. Запишем это так: НОД (a + b, |а – b|, а • b).
Идея решения состоит в следующем математическом факте: если х, у, z — три натуральных числа, то НОД(х, у, z) = НОД(НОД(х, у), z). Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).
Очевидно, что вспомогательным алгоритмом для решения поставленной задачи является алгоритм получения наибольшего общего делителя двух чисел. Эта задача решается с помощью известного алгоритма Евклида (см. раздел 1.3). Запишем его в форме процедуры на алгоритмическом языке.
Процедура Евклид(цел M,N,K);
нач
пока M<>N
нц
если M>N
то M:=M-N
иначе N:=N-M
кв
кц;
K:=M
кон
Здесь M и N являются формальными параметрами процедуры. M и N параметры-аргументы, K — параметр-результат. Основной алгоритм, решающий исходную задачу, будет следующим:
алг задача;
цел а,b,с;
нач ввод(а,b);
Евклид(а+b,|a-b|,с);
Евклид(с,а*b,с);
вывод(с)
кон.
Процедуры в Паскале. Основное отличие процедур в Паскале от процедур в Алгоритмическом языке (АЯ) состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как решение поставленной задачи программируется на Турбо Паскале.
Program NOD1;
Var А,В,С: Integer;
Procedure Evklid(M,N: Integer; Var К: Integer);
Begin
While M<>N Do
If M>N
Then M:=M-N
Else N:=N-M;
K:=M
End;
Begin
Write('a=');
ReadLn(A) ;
Write('b=');
ReadLn(B);
Evklid(A+B,Abs(A-B),C);
Evklid(C,A*B,C);
WriteLn('НОД=',C)
End.
В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры (формальные и фактические). Существует и другой механизм обмена — через глобальные переменные. Но об этом чуть позже. А сейчас рассмотрим синтаксическую диаграмму описания процедуры (рис. 27).
Из диаграммы видно, что процедура может иметь параметры, а может быть и без них