Глобальные и локальные переменные
Подпрограммы могут возвращать результат в основную программу не только при помощи параметров – переменных и выходных параметров, но и непосредственно изменяя глобальные переменные. Переменные, описанные в основной программе, являются глобальными по отношению к внутренним процедурам и функциям. Это означает, что они доступны в подпрограммах, описанных внутри основной программы. Описанные внутри процедур и функций, называются локальными переменными. Они порождаются при каждом входе в подпрограмму и уничтожаются при выходе из этой подпрограммы, т.е. локальные переменные существуют только при выполнении подпрограммы и недоступны в основной программе.
Пример использования:
Вычислить: .
Из общей задачи вычленим подзадачу вычисления суммы
,
Зависящей от трех параметров . Оформим решение этой подзадачи в виде процедуры. Если бы мы решили воспользоваться механизмом параметров для обмена
Данными между основной программой и процедурой, то наша процедура имела бы четыре параметра: три для передачи исходных данных и один для возврата результата. В программе, приведенной ниже, для обмена данными между основной программой и процедурой используется механизм глобальных параметров. Поэтому процедура s вообще не имеет параметров.
program р1_33;
Var iO,ik:integer;
alfa,beta,x,z,zl,z2,f:real;
function s;
var i:integer;
sum:real;
begin
sum:=0;
for i:=i0 to ik do
sum:=sum+exp(i*ln(sqr(sin(x))))+cos(x);
z:=sum
end;
begin
writeln('Enter alfa,beta');
readln(alfa,beta);
i0:=1; ik:=10; x:= alfa;
s;
z1:=z;
i0:=5; ik:=20; x:= beta;
s;
z2:=z;
f:=zl+z2;
writeln(“f=”, f);
readln
end.
В этом примере глобальными являются переменные io, ik, alfa, bata, x, z, z1, z2, f. Локальными являются переменные: i, sum.
Заметим, что если имя локальной переменной совпадает с именем глобальной переменной, то при выполнении подпрограммы такая глобальная переменная становится недоступной, т.е. «закрывается» локальной переменной.
В Delphi имеются параметры, значения которых можно не указывать при вызове процедуры или функции. Их называют параметрами со значениями по умолчанию, или, короче, умалчиваемыми параметрами. В списке параметров в общем виде они описываются следующим образом:
< имя параметра >:< тип > = < значение > .
Умалчиваемые параметры должны находится в конце списка формальных параметров. Если при вызове процедуры или функции фактический параметр, соответствующий умалчиваемому параметру, не указан, то в подпрограмму передается заданное для умалчиваемого параметра < значение >. Если в подпрограмме имеется несколько умалчиваемых параметров и для части из них заданы фактические значения, а для части – нет, то последние должны располагаться в конце списка формальных параметров. Иными словами, при вызове подпрограммы фактические параметры должны располагаться подряд, без пропусков.
Пример использования: составить программу для нахождения максимального значения для положительных чисел, количество которых не превышает 5.
В процедуре для поиска максимального значения опишем пять умалчиваемых значений. В качестве значения по умолчанию примем 0.
program pl_34;
var x,y,z,w,v,m:real;
procedure p(var max:real; a:real=0; b:real=0; c:real=0; d:real=0;
e:real=0);
begin
max:=a;
if max<b then max:=b;
if max<c then max:=c;
if max<d then max:=d;
if max<e then max:=e;
end;
begin
writeln(‘Enter x,y,z,w,v’);
readln(x,y,z,w,v);
P(m,x,y);
writeln('max=',m:3:0) P(m,x,y,z);
writeln('max=',m:3:0); Р(m,x,y,z,w);
writeln('max=',m:3:0) P(m,x,y,z,w,v);
writeln(‘max=’,m:3:0);
readln
end.
В Delphi имеется возможность использовать подпрограммы с одинаковыми именами, но отличающиеся количеством и типом параметров. В заголовках таких подпрограмм должно быть указано зарезервированное слово overload. При вызове таких подпрограмм компилятор анализирует количество и тип фактических параметров и вызывает соответствующую им подпрограмму.
Пример использования:
Составить программу для нахождения минимального из двух чисел и минимального порядкового номера для двух символов.
В программе будем использовать две функции с именем mm. Первая для нахождения минимального числа, вторая - для определения минимального порядкового номера для двух символов.
program pl_35;
var
x,y:real;
s,v:char;
function min(a,b:real):real;overload;
begin
if a>b then result :=b else result :=а end;
function min(a,b:char):char;overload; begin
result :=a;
if a>b then result :=b; end; begin
writeln(‘Enter two numbers');
readln(x,y);
writeln('min=',min(x,y):3:0);
writeln('Enter two characters');
readln(s,v);
writeln('min=',min(s,v));
readln
end.
При обращении к функции min(x,y) вызывается функция, определенная для вещественных аргументов, при обращении min(s,v) - для символьных аргументов