7.4. Глобальные и локальные данные
Процедуры и функции обладают определенной независимостью в смысле использования переменных, а также типов и констант. При описании в программе переменных (типов, констант) происходит их разделение на глобальные и локальные.
Глобальные переменные (типы, константы) – это те, которые объявлены в программе вне процедур или функций. Они действуют в основной программе и в любой подпрограмме. Процедуры и функции используют и модифицируют глобальные данные, если эти данные описаны в тексте основной программы выше описаний соответствующих процедур и функций.
Локальные данные – это константы, типы и переменные, существующие только внутри процедур и функций, и объявленные либо в списке параметров (только переменные), либо в разделах const, type, var этих процедур и функций. Такие данные недоступны для операторов основной программы.
При совпадении имен глобальных и локальных данных сильнее оказываются локальные имена, и именно они используются внутри подпрограммы.
7.5. Формальные и фактические параметры
Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные ";". В группу формальных параметров включаются однотипные параметры одной категории.
Все формальные параметры можно разбить на четыре категории:
– параметры – значения (значения этих параметров в основной про–
грамме подпрограммой не меняются);
– параметры – переменные (значения этих параметров подпрограм–
ма может изменять в основной программе);
– параметры – константы (используются только в версии 7.0);
– параметры – процедуры и параметры – функции.
Для каждого формального параметра следует указать имя, тип, а в случае параметра – переменной или параметра – константы – его категорию (слово – идентификатор). Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть любым, однако в заголовке подпрограммы нельзя вводить новый тип, то есть типом параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип.
Например, нельзя писать
function day (dn : (Pn, Vt, Sr, Ch, Pt, Sb, Vs)):integer;
Чтобы правильно написать этот заголовок, следует в основной программе ввести перечисляемый тип, а затем использовать его в заголовке:
type
days=(Pn, Vt, Sr, Ch, Pt, Sb, Vs);
function day (dn : days) : integer;
При обращении к подпрограмме формальные параметры заменяются на соответствующие фактические вызывающей программы или подпрограммы.
7.5.1. Параметры – значения
Параметры – значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой изменяться не может. Суть механизма передачи параметра по значению состоит в следующем. При обращении к подпрограмме:
1) выделяется место в памяти машины для каждого формального параметра;
2) вычисляется значение фактического параметра;
3) это значение засылается в ячейку, соответствующую формальному пара–
метру.
После получения начального значения связь между формальными и фактическими параметрами утрачивается. Значение формального параметра в теле процедуры может изменяться. После окончания работы процедуры формальный параметр утрачивает свое значение. Фактические параметры сохраняют те значения, которые имели до обращения к подпрограмме. Если даже фактические и формальные параметры одинаково обозначены в программе, в памяти ЭВМ они занимают разные ячейки.
Выводы:
а) формальные параметры – значения используют для передачи ис–
ходных данных в подпрограмму;
б) параметры – значения нельзя использовать для передачи результа–
тов из подпрограммы в основную программу;
в) в качестве фактического параметра, соответствующего формаль–
ному параметру – значению может быть использовано любое вы–
ражение, переменная, константа того же типа, что и формальный
параметр – значение.
Параметр – значение указывается в заголовке подпрограммы своим именем и через ":" – типом. Тип параметра – значения может быть любым за исключением файлового.
Если параметров – значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через ",", а затем уже указать общий тип.
Пример. procedure Inp (Max, Min : real; N : Word);
function Mult (X,Y : integer) : real;
В качестве фактического параметра на месте параметра - значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа, не содержащее файловую компоненту.
Inp (abs(Z), –abs(T), 2*k);
M := Mult (X+Y, X–Y);
Задача 1. Пусть в программе необходимо вычислить площадь квадрата S1 = a*a и площадь прямоугольника S2 = a*b при различных значениях a и b. Оформить вычисление этих площадей, используя подпрограмму – функцию.
program PL_FIGUR;
var A, B : real; S1, S2 : real;
function PL(X, Y : real): real;
begin
PL:= X*Y
end;
{основная программа}
begin
Write('Введите значения A, B:');
Readln(A, B);
S1:= PL(A, A); {вызов подпрограммы: S квадрата}
S2:= PL(A, B); {вызов подпрограммы: S прямоугольника}
Writeln('S1=', S1:5:2, ', S2=', S2:5:2)
end.
Задача2. Даны отрезки a, b, c и d. Для каждой тройки этих отрезков, из которых можно построить треугольник, напечатать площадь данного треугольника. При решении задачи использовать подпрограмму – процедуру PR_SQ (X, Y, Z), печатающую площадь треугольника со сторонами x, y и z, если такой треугольник существует.
program S_TREUG;
var A, B, C, D : real;
procedure PR_SQ(X, Y, Z : real);
var P : real;
begin if (X+Y>Z) and (Y+Z>X) and (Z+X>Y) then
begin P:= (X+Y+Z)/2;
Writeln(sqrt(P*(P–X)*(P–Y)*(P–Z)):6:2) end
end;
{основная программа}
begin
Write('Введите длины отрезков A, B, C, D:'); { A, B, C, D > 0}
Readln(A, B, C, D);
{вызов процедуры PR_SQ выполняется 4 раза для вычисления площадей
треугольников со сторонами : A, B, C; A, B, D; A, C, D; B, C, D при вы–
полнении условия существования этих треугольников}
PR_SQ(A, B, C); PR_SQ(A, B, D);
PR_SQ(A, C, D); PR_SQ(B, C, D)
end.
