-
Лекция №3
Тема:
Процедуры и функции
ПЛАН
3Лекция №3
3.1Общие сведения
3.2Область видимости идентификаторов
3.3Обмен данными между программой и подпрограммами
3.4Рекурсия
Время:
2 ч.
Литература:
-
Общие сведения
-
Как правило, для упрощения разработки сложной программы выполняется декомпозиция – разделение программы на отдельные подзадачи. При этом часто возникает ситуация, когда в разных местах программы должны выполняться одни и те же действия, предназначенные для решения некоторой подзадачи. В таком случае целесообразно оформить эти действия в виде подпрограммы и затем в нужных местах выполнять вызов этой подпрограммы.
Подпрограмма – относительно самостоятельный фрагмент программы, оформленный особым образом и имеющий имя.
Подпрограммы могут быть стандартными (определяются стандартом языка) и пользовательскими. Описание пользовательских подпрограмм может быть выполнено в основной программе (в разделе описаний) или же в виде отдельного модуля (в этом случае в основной программе указывается подключение данного модуля).
В языке Паскаль существует два вида подпрограмм:
-
процедуры;
-
функции.
Структура описания любой подпрограммы (процедуры или функции) аналогична структуре программы и содержит следующие разделы:
-
заголовок;
-
раздел описаний;
-
раздел операторов.
Раздел описаний и раздел операторов образуют тело подпрограммы (процедуры или функции).
Заголовок процедуры имеет вид:
Procedure имя(список параметров);
Заголовок функции имеет вид:
Function имя(список параметров): тип результата;
Процедура – это подпрограмма, которая выполняет действия, но не возвращает результата.
Функция – это подпрограмма, которая возвращает значение. Поэтому в ее разделе операторов всегда присутствует присваивание вида:
имя функции:=выражение;
При этом тип выражения должен совпадать с типом функции, указанным в ее заголовке.
Функция может возвращать значение только простых типов (символьный, вещественный, целый, логический), строкового или указательного типов.
Пример использования процедуры. (вывод заданного символа определенное число раз)
Program NWrt;
{Описание процедуры}
Procedure NWrite(Ch:Char;N:Integer);
Var
i:Integer;
Begin
For i:=1 to N do Write(Ch);
End;
Var
X:Char;
N:Integer;
{Раздел операторов программы}
BEGIN
Write(‘Ввести символ=’);
ReadLn(X);
NWrite(X,10); {Вызов процедуры}
END.
При составлении блок-схем алгоритмов подобных программ руководствуются следующим:
-
вызов процедуры обозначается символом: , внутри символа помещают имя вызываемой процедуры и список фактических параметров;
-
после блок схемы основной программы приводят блок-схемы ее подпрограмм;
-
блок-схема подпрограммы составляется по таким же правилам, как и схема обычной программы.
Таким образом, блок-схема алгоритма приведенной выше программы:
Блок-схема алгоритма процедуры NWrite
Пример использования функции (вычисление корня степени N из числа X)
Program NRoot;
{Описание функции}
Function Root(X:Real;N:Byte):Real;
Begin
If X=0 then Root:=0
Else Root:=Exp(Ln(X)/N);
End;
Var R:Real;
BEGIN
R:=Root(27,3); {Вычисление с помощью заданной функции}
WriteLn(‘Корень=’,R:8:4);
END.
Вызов подпрограмм
При вызове процедуры или функции приводится ее имя и в скобках – список параметров (если он есть).
Вызов процедуры в основной программе является оператором.
Семантика вызова процедуры: приостанавливается текущая последовательность операторов, вычисляются значения передаваемых процедуре параметров (если они есть), затем выполняется последовательность операторов в теле процедуры; после завершения их выполнения управление передается на оператор, следующий за вызовом процедуры.
Вызов функции является не оператором, а элементом выражения.
Семантика вызова функции: приостанавливается вычисление выражения, вычисляются значения передаваемых функции параметров (если они есть), выполняются операторы в теле функции, затем возвращенное функцией значение используется для продолжения вычисления выражения.