step2;
End; Write (y); End.
Вданном варианте программы оператор вызова процедуры осуществляет только ее вызов. Исходные данные передаются в процедуру каждый раз с помощью переменных n и x, описанных и определенных в теле головной программы, содержащей обращение к этой процедуре с помощью глобальных (общих) переменных. Аналогично, через глобальные переменные y передаются в головную программу результата работы процедуры step2.
Всвязи с выше изложенным уместно сделать некоторые дополнительные разъяснения.
Дело в том, что понятия глобальных и локальных переменных введено в языке PASCAL из-за наличия в нем понятия блочной структуры, т.е. любая программа, процедура и функция представляют собой блок со своей областью описаний и могут содержать внутри этого блока описания других процедур и функций, а также обращения к ним. Таким образом, программа в целом и совокупность нескольких описанных в ней процедур и функций образуют блочную структуру. Блок, содержащий в своем разделе описаний другой блок (процедуру или функцию), называется внешним по отношению к нему. Блок же, содержащийся в разделе описаний некоторого блока, называется внутренним или
подблоком.
Объекты, описанные внутри какого-либо подблока, являются по отношению к нему локальными
инедоступными внешним блокам, т.е. на них можно ссылаться только внутри блока, в котором они описаны.
Для пояснения сказанного приведем следующий рис. 4.2.8, на котором изображена абстрактная структура какой-то усложненной программы, состоящей из трех блоков.
Из такой структуры следует, что переменные i, j
иk являются локальными по отношению к блоку 3 и недоступны в
блоках 1 и 2. Переменные x, y, z доступны в блоках 2, 3
инедоступны в блоке 1, т.к. по отношению к блоку 3 они являются глобальными. Переменные a, b, c доступны во всей программе и во всех процедурах, т.к. являются глобальными по отношению к блокам 2,3.
Существуют и более сложные блочные
|
|
|
|
|
|
|
структуры. |
|
|
|
|||
|
Program_abc1; |
Блок 1 |
||||
|
Var |
|
|
|
||
|
|
|
a, b, c:real; |
|
|
|
|
|
|
|
|
|
|
|
|
Procedure_abc2; |
Блок 2 |
|
||
|
|
Var |
|
|
|
|
|
|
|
x, y, z:real; |
|
|
|
|
|
|
|
|
|
|
|
|
|
Procedure_abc3; |
Блок 3 |
|
|
|
|
|
Var |
|
|
|
|
|
|
i, j, k:real; |
|
|
|
|
|
|
Begin |
|
|
|
|
|
|
… |
|
|
|
|
|
|
End; |
|
|
|
Выше были приведены два варианта программ, в которых возведение в степень осуществлено с помощью процедуры, выход из которой происходит с одним результатом.
Процедуры позволяют осуществлять выход из них с двумя и более результатами.
Рассмотрим такую возможность на конкретном примере.
Пусть требуется составить программу для
вычисления функции:
Xk1 Yk2
Z = —————,
S1 + S2
где X и Y – произвольные числа;
S1 и K1 – сумма и количество положительных
элементов массива ai (a1, a2, …, a10);
S2 и K2 - сумма и количество положительных элементов массива bi (b1, b2, …, b8).
Для вычисления суммы и количества положительных элементов используем процедуру. В ней будет два выходных параметра (результата) – величина суммы и количество положительных элементов.
Кроме того, имеется два входных параметра – величина элемента исходного массива и количество его элементов.
Программа может быть составлена по следующему варианту:
Program func; Type
Mas= array[1…10] of real;
Var
X,y,z,S1,S2:real;
J,k1,k2:integer;
A,b:mas;
Procedure sum(var d:mas;m:integer;S:real;K:integer); Var
I:integer; Begin
K:=0;
S:=0;
For i:=1 to m do If d[i]>0 then
Begin
K:=K+1;S:=S+d[i];
end;
end;
Begin
Writeln( Введите x и y );
Read(x,y);
Writeln( Введите массив A );
For i:=1 to 10 read(a[i]);
Writeln( Введите массив B );
For i:=1 to 8 read(b[i]);
Sum(a,10,S1,K1);
Sum(b,8,S2,K2);
Z:=(exp(K1*ln(x))*exp(K2*ln(y)))/(S1+S2);
Write( z= ,z);
End.
В данную программу введен нестандартный тип mas массива размерностью десять и вещественный.
Затем в описателе var массивы a и b объявлены типа mas.
Только таким двухступенчатым приемом можно перекачать массивы a и b из головной программы в процедуру(совместное использование описателей type и var).
С помощью оператора – процедуры с именем sum осуществляется вход в процедуру: первый раз с массивом a и второй раз с массивом b.
Выход из процедуры осуществляется сначала с двумя переменными S2 и K2, искомые значения для которых получены в процедуре, размещаясь при этом в соответствующих ячейках памяти головной программы. Затем они используются в арифметическом операторе присваивания для вычисления z.