Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1601

.pdf
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
1.46 Mб
Скачать

y:=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.