Тема 8. Процедуры и функции. Локализация имен. Описание подпрограммы. Параметры. Примеры использования подпрограмм.
Подпрограммы представляют собой инструмент, с помощью которого любая программа может быть разбита на ряд в известной степени независимых друг от друга частей.
Такое разбиение необходимо по двум причинам:
Во-первых, это средство экономии памяти: каждая подпрограмма существует в программе в единственном экземпляре, в то время как обращаться к ней можно многократно из разных точек программы. При вызове подпрограммы активизируется последовательность образующих ее операторов, а с помощью передаваемых подпрограмме параметров нужным образом модифицируется реализуемый в ней алгоритм.
Вторая причина заключается в применении методики исходящего проектирования программ. В этом случае алгоритм представляется в виде последовательности относительно крупных подпрограмм, реализующих более или менее самостоятельные смысловые части алгоритма. Подпрограммы в свою очередь могут разбиваться на менее крупные подпрограммы нижнего уровня и т.д. Последовательность структурирования программы продолжается до тех пор, пока реализуемые подпрограммами алгоритмы не станут настолько простыми, чтобы их можно было легко запрограммировать.
В языке Паскаль подпрограммы представлены в виде процедур и функций. Процедуры и функций используется для оформления самостоятельного фрагмента программы, используемого более одного раза.
Подпрограмма дается имя и вызывается она каждый раз, когда необходимо выполнить данного фрагмента программы.
Процедуры.
Процедура состоит из заголовка и тела процедуры, называемого блоками. Блок процедуры имеет такую же структуру, что и основная программа, т.е. в блоке могут быть свои разделы LABEL, CONST, TYPE, VAR, разделы описания процедур и функций и выполняемая часть (от BEGIN до END).
Структура любой программной единицы (программы, процедуры или функции) должна быть такой:
<объявление программной единицы>
{раздел описаний}
BEGIN
{раздел исполняемых операторов}
END <символов конца программной единицы >
Заголовок процедуры имеет вид:
PROCEDURE <имя проц. > [(<сп.ф. п.>)];
Здесь <имя проц.>- имя процедуры (прав. идентификатор), <сп.ф.п.> – список формальных параметров. Формальные параметры – это наименования переменных, через которые передается информация из программы в процедуру, из процедуры в программу.
Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовам. Для активизации процедуры (т.е. выполнения фрагмента программы, оформленного в виде процедуры) В нужном месте программы используется оператор вызова процедуры:
<имя процедуры> [(<факт. парам.>)];
При вызове (активизации) процедуры устанавливается взаимно однозначное соответствие между формальными и фактическими параметрами, затем управление передается процедуре. При выполнении оператора вызова процедуры все формальные параметры заменяются соответствующими фактическими параметрами.
Формальные и фактические параметры должны удовлетворять следующим требованиям:
число фактических и формальных параметров должно быть одинаковым;
соответствующие фактические и формальные параметры должны совпадать по типу и порядку следования.
В языке Турбо Паскаль различают три вида формальных параметров:
параметр-значение;
параметр-переменная;
параметр- константа.
Если параметры определены как параметры-переменные, перед ними записывается слово VAR , а если это параметры- константы - CONST. Например, PROCEDURE PROC1(X:REAL; VAR Y: REAL; CONST ST: STRING);
Если формальный параметр объявлен как параметр _ переменная, то при вызове процедуры ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр – значение или параметр- константа, то при вызове ему может соответствовать произвольное выражение.
После завершения выполнения процедуры управление передается вызывающей программе или подпрограмме на оператор, следующий за оператором вызова процедуры.
PROGRAM LAB4;
CONST N=5;
TYPE MATRIX= ARRAY [1.. N, 1..N] OF INTEGER;
VAR A, B, C, D: MATRIX;
I,J: INTEGER;
PROCEDURE MULT(R: MATRIX);
VAR I,J: INTEGER;
BEGIN
FOR I:=1 TO N DO
FOR G:=1 TO DO
READ(R[I,J]);
END;
PROCEDURE MULT(X,Y: MATRIX; VAR Z: MATRIX);
VAR I,J,K,S: INTEGER;
BEGIN
FOR I:=1 TO N DO
FOR J:=1 TO DO
BEGIN
S:=0;
FOR K:=1 TO N DO
S:=S+ X[I,K]*Y[K,J];
C[I,J]:=S;
END;
END;
BEGIN
VV(A);
VV(B);
VV(C);
VV(D);
MULT( A,B,A); MULT(A,C,A); MULT (A,D,A);
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO N DO
WRITE (A[I,J]:4);
WRITELN;
END;
END.