Программа может содержать одинаковые фрагменты. Такие фрагменты целесообразно оформить в виде подпрограммы, которая должна несколько раз выполняться.
Пусть, например, в программе требуется трижды вычислять первую норму матрицы . Без использования подпрограмм такая программа может иметь следующую структуру:
Формирование матрицы А
Вычисление первой нормы А1
Преобразование матрицы А
Вычисление первой нормы А1
Преобразование матрицы А
Вычисление первой нормы А1
Если оформить вычисление первой нормы A1 в виде подпрограммы, то структура программы станет следующей:
К подпрограмме осуществляется три обращения из основной программы.
Использование подпрограмм сокращает общий объем программы и улучшает ее понимание.
Большую программу целесообразно разделить на ряд последовательных фрагментов и каждый из них оформить в виде подпрограммы. Хотя каждая из этих подпрограмм выполняется только один раз, т.е. сокращения объема программы не происходит, но при этом улучшаются ее читаемость и удобство отладки.
Исходная большая программа :
Ф р а г м е н т 1
Ф р а г м е н т 2
Ф р а г м е н т 3
Ф р а г м е н т 4
Программа с использованием подпрограмм:
Подпрограммы на Паскале реализуются в виде процедур и функций. Функция отличается от процедуры тем, что в ней в качестве выходного результата может быть только одно простое значение (аналогично функциям sin(x), max(a,b,c) и т.п.). Процедура в качестве выходного результата может выдавать одно или больше значений (например, массив); в частном случае процедура может не иметь ни одного выходного значения.
Описание процедуры, располагаемое в разделе описания процедур и функций, состоит из двух частей: заголовок и тело процедуры. Телом процедуры является блок. Следовательно, тело процедуры имеет такую же структуру, как и программный блок, т.е. в него входят разделы описания меток, констант и т.д.
Синтаксическая диаграмма для заголовка процедуры:
Обращение к процедуре осуществляется с помощью оператора процедуры:
Примечание. Фактические параметры часто называют также аргументами.
Наиболее простой является процедура без параметров.
Пример 1. B массиве присвоить максимальному элементу нулевое значение и определить, как изменилось при этом среднее арифметическое значение элементов массива.
ProgramMiddle1;
Const Nmax = 1000;
Type Ar = array[1..Nmax] of real;
Vari,imax : integer;
S,S1,S2,dS,Xmax : real;
X : Ar;
{ ------------------------------ }
Procedure MiddleAr1;
Vari : integer; { Определение среднего }
Begin{ арифметического значения }
S:=0; { элементов массива Х }
For i:=1 to n do
S:=S+x[i];
S:=S/n;
End { MiddleAr1 };
{ ------------------------------ }
Begin
Ввод и печать n, X
MiddleAr1; S1:=S;
Xmax:=x[1]; imax:=1; { Определение место- }
For i:=2 to n do{ положения (индекса) }
If x[i]>Xmax then{ максимального элемента }
Begin
Xmax:=x[i]; imax:=i
End;
x[imax]:=0;
MiddleAr1; S2:=S;
dS:=S2-S1;
Печать S1, S2, dS
End.
В данном случае блок процедуры имеет раздел описания переменных и раздел операторов. В разделе Var процедуры MiddleAr1 повторно описывается переменная i, так как эта переменная используется в блоке процедуры как параметр цикла (как известно, параметр цикла должен быть описан в том же блоке, в котором расположен оператор For). Обращение к процедуре осуществляется путем указания имени этой процедуры в основной программе.
Пример 2.
Определить среднее арифметическое значение элементов массивов , и .
ProgramMiddle2;
Const Nmax = 1000;
Type Ar = array[1..Nmax] ofreal;
Var i,n : integer;
S,Sx,Sy,Sz : real;
X,Y,Z,Buf : Ar;
{ ------------------------- }
ProcedureMiddleAr2;
Vari : integer; { Определение среднего }
Begin{ арифметического }
S:=0; { значения элементов }
Fori:=1 to n do{ буферного массива Buf }
S:=S+Buf[i];
S:=S/n;
End{ MiddleAr2 };
{ ------------------------- }
Begin
Ввод и печать n, X
Fori:=1 to n do
Begin
y[i]:=((2*x[i]+3.5)*x[i]-1)*x[i]+1;
Ify[i]>0 then
z[i]:=x[i]+2*y[i]
Else
z[i]:=x[i]+y[i];
End;
Buf:=X; MiddleAr2; Sx:=S;
Buf:=Y; MiddleAr2; Sy:=S;
Buf:=Z; MiddleAr2; Sz:=S;
Печать Sx,Sy,Sz
End.
Непосредственно в процедуре MiddleAr2 вычисляется среднее арифметическое значение для элементов буферного массива Buf. Перед обращением к этой процедуре в массив Buf пересылается массив X, массив Y или массив Z.
Использование в программе Middle2 буферного массива Buf приводит к дополнительным затратам памяти на размещение этого массива, а также к дополнительным затратам машинного времени на пересылку массивов X, Y, Z в массив Buf. Чтобы исключить такие непроизводительные затраты, необходимо использовать аппарат формальных и фактических параметров.