Учебное пособие 1601
.pdfy:=1; for_i:=1_to_n_do y:=y*x;
End;
где x и y – глобальные параметры;
В данном случае процедура STEP2 не содержит списка формальных параметров и работает только с локальной переменной i, описанной в данной процедуре, а переменные x, n и y обязательно должны быть описаны в основной программе с помощью описателя var. В последующем случае такие переменные x, n и y называются глобальными (общими) по отношению к процедуре step2, т.е. значения глобальных переменных могут быть доступны как для головной программы, так и для самой процедуры.
Данные два варианта процедур для одного и того же алгоритма рассмотрим в составе головной программы. С этой целью заменим имена переменных n- на m, x- на a и
y- на z. Т.е. в процедуре y, x и n- формальные параметры, а
z, a и m- фактические параметры головной программы. Кроме того, исходя из того, что показатель степени может быть нулевым, положительным и отрицательным, выражение возведения в степень запишем более подробно:
1, если m |
0; |
|
||
z am am , если m |
0; |
|
||
1 |
, если m 0; |
|
||
|
|
|
||
|
am |
|
||
|
|
z a |
m |
1 |
|
|
|
||
|
|
|
am |
|
|
|
|
|
Здесь
С учетом последнего обстоятельства, взяв за основу процедуру Step1, составим структурную схему общего алгоритма возведения в степень (головная программа – процедура):
|
|
|
|
|
|
НАЧАЛО |
|
|
|
|
|
|
|
|
|
|
|
|
|
Ввод a,m |
|
|
|
|
|
|
|
|
|
|
да |
|
m=0 |
|
нет |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
z:=1 |
|
|
|
|
|
|
|
|
|
||
нет m>0 |
|
да |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
STEP1 |
|
|
|
STEP1 |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
-m,1/a,z |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ПЕЧАТЬ Z
КОНЕЦ
Рис. 4.2.6. Структурная схема
алгоритма возведения в степень.
Полезно, также, привести отдельную структурную схему алгоритма процедуры возведения в степень (например STEP1)
Вход в процедуру
(1,x)
y:=1
i=i(1)…n
y:= y*x
Выход из процедуры
с переменной (y)
Рис. 4.2.7. Структурная схема процедуры.
Данным структурным схемам алгоритма соответствует следующий вариант программы:
Program_step4;
Var
m:integer;
a, z:real;
Procedure_step1 (n:integer; x:real; var y:real); Var
i:integer; Begin
y:=1; for_I:=1_to_n_do y:=y*x;
end;
Begin
Read (a, m);
if_m:=0_then_z:=1; else_if_m>0_then_step1 (m, a, z); else_step1 (-m, 1/a, z);
Write (z); End.
В данной программе обращение к процедуре step1 дважды осуществлено с помощью оператора if.
При этом, в процедуре произойдет замена формальных параметров n, x, y на фактические m, a, z. В другом случае - n, x, y на m, 1/a, z и затем в головную программу осуществляется возврат с результатом z, который в процедуре выступает как y.
Составить второй вариант программы, используя процедуру step2 без параметров (глобальные параметры или переменные).
Program_step5; Var
n:integer;
x,y:real;
Procedure_step2; Var
i:integer; Begin
y:=1; for_i:=1_to_n_do y:=y*x;
end;
Be gin
Read(n, x); if_n:=0_then_y:=1 else
if_n>0_then_step2 else;
Begin
n=-n; x:= 1x ;
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.