Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Локальные и глобальные переменные и подпрограммы.




Если переменная или константа описана в основной программе, она считается глобальной, и ее могут использовать любые процедуры и функции данной программы. Переменные, описанные внутри подпрограммы, называются локальными и могут быть использованы только внутри данной подпрограммы. Локальные переменные могут быть описаны как в заголовке программы, так и в разделе описания переменных. при совпадении имен глобальных и локальных переменных, локальные определения в пределах своего действия отменяют действия глобальных, и эти переменные никак не связаны между собой.

Рассмотрим две почти одинаковые программы.

Program Variant1; Var X: real; Procedure writeX; Var x: real; Begin write(x) End; Begin X:= Pi;; writeX End. Program Variant2; Var X: real; Procedure writeX; Begin write(x) End; Begin X:= Pi; writeX End.

Нетрудно догадаться о решаемой задаче: присвоить глобальной переменной х некоторое значение, а затем напечатать это число через специальную процедуру.

Во втором варианте программы переменная с именем Х описана только в основной программе, поэтому она, как глобальная переменная, доступна в подпрограмме. В результате будет напечатано значение числа П.

В первом варианте переменная х переопределена в подпрограмме, таким образом, в подпрограмме имеется локальная переменная х, ничем не связанная с переменной Х основной программы. Поскольку этой локальной переменной не присвоено значение, будет напечатано случайное число, содержащееся в соответствующей ячейке памяти.

Возникает вопрос, какова роль локальных переменных, нельзя ли все переменные описать как глобальные?

Процедура должна быть, по возможности, независима от основной программы, поэтому все переменные, нужные только в пределах процедуры, должны описываться как локальные. Общение основной программы с подпрограммой должно, как правило, идти через список параметров процедуры, что придает подпрограммам необходимую гибкость. Вместе с тем, излишне большое число параметров, передаваемое в подпрограмму при ее вызове, замедляет работу программы, поэтому не следует пренебрегать использованием в подпрограммах глобальных переменных.

Кроме локальных переменных, в программах могут быть и локальные подпрограммы. Это подпрограммы, текст которых размещен внутри текста подпрограммы более высокого уровня. Использование таких подпрограмм, как и локальных переменных, ограничивается подпрограммой, к которой они принадлежат.

Локальность или глобальность являются понятиями относительными. Программа с вложенными в нее подпрограммами представляет собой иерархическое дерево. Объект, локальный по отношению к более высокому уровню иерархии, ведет себя как глобальный по отношению к подпрограммам более низкого уровня.

Задание. Найдите в приведенных выше примерах локальные и глобальные переменные, формальные и фактические параметры, какие параметры переданы по ссылке, а какие - по значению.

 

  Процедуры  
   

Структура процедуры имеет следующий вид:

Procedure <имя процедуры> (формальные параметры: их тип);
Var
(локальные переменные)
begin
...
end;

Процедура вызывается по имени:

<имя процедуры> (фактические параметры);

Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Временно управление передаётся процедуре. После завершения работы процедуры управление возвращается в основную программу.

Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования.

Заголовок процедуры может выглядеть так:

PROCEDURE GG(a,b,c:integer); вызываться так: GG(3,n,m)

Здесь a,b,c-формальные параметры, а 3, n, m-фактические параметры

Таким образом в процедуру передаются значения: a=3, b=n, c=m

Переменные описанные в процедуре после слова Var, являются внутренними переменными процедуры или промежуточными, они не являются данными для операций внутри процедуры и не являются результатом её выполнения, а нужны лишь для промежуточных действий. Данные и результаты описываются в круглых скобках после имени процедуры. Перед описанием переменных-результатов пишут служебное слово var.

Например:

Procedure express(a,b,c: real; var x,y:real);
Var
z: real;
begin
z:=a+ b+ c;
x:=sqr(z);
y:=sqrt(z);
end;

Эту процедуру можно вызвать следующим образом:

express(7.6, 6.8, 9.5, x1, x2);

Формальные входные параметры a, b, c принимают значения соответствующих фактических параметров a=7.6; b=6.8; c=9.5.

При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом в основной программе будем иметь x1=20, y1=22.

В качестве фактических параметров могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут быть только переменные(константы и выражения недопустимы).

Рассмотрите примеры решения задач.

Задача 1. Описать пpоцедуpу "аналитического" сложения обыкновенных дpобей, вычисляющую по числам P1,Q1,P2,Q2, являющимися числителями и знаменателями дробей и последняя дpобь несокpатима. Результат вывести в виде

P1 P2 P
---- + ---- = ---
Q1 Q2 Q

Program Kudashev_Artem;
Uses
Crt;
Var
P1, Q1, P2, Q2, P, Nod_2, Celaya: Longint;
Dop_1, Dop_2: integer;
{ - - - - - - - - - - - - - - - - - - - -}
Procedure Nod(A,B: Longint;Var Nod_2: Longint);
Begin
Nod_2:=A*B;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Procedure Vivod_Otveta(Celaya,P1,Q1,P2,Q2,P,Nod_2,X,Y:integer);
Var
i: integer;
Begin
if P > Nod_2
then
begin
Celaya:=P div Nod_2;
P:=P mod Nod_2;
end
else
begin
Gotoxy(X+1,Y);
write(P1);
Gotoxy(X+10,Y);
write(P2);
if P = 0
then
begin
Gotoxy(X+1,Y+1);
write('---- + ---- = ',Celaya,'');
Gotoxy(X+1,Y+2);
write(Q1);
Gotoxy(X+10,Y+2);
write(Q2);
end
else
begin
for I:=10 downto 2 do
begin
if ((P mod I) = 0) and ((Nod_2 mod I) = 0) then
begin
P:=P div I;
Nod_2:=Nod_2 div I;
end;
end;
Gotoxy(X+19,Y);
write(P);
Gotoxy(X+1,Y+1);
write('---- + ---- = ',Celaya,' ------');
Gotoxy(X+1,Y+2);
write(Q1);
Gotoxy(X+10,Y+2);
write(Q2);
Gotoxy(X+19,Y+2);
write(Nod_2);
end;
end;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Procedure Podshet(P1, Q1, P2, Q2: Longint);
Begin
Nod(Q1,Q2,Nod_2);
Dop_1:=Nod_2 div Q1;
Dop_2:=Nod_2 div Q2;
P:=(Dop_1*P1)+(Dop_2*P2);
if P > Nod_2
then
begin
Celaya:=P div Nod_2;
P:=P mod Nod_2;
end;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Begin
Clrscr;
Q1:=0;
Q2:=0;
Textcolor(LightCyan);
writeln(' P1 P2 P');
writeln('---- + ---- = ---');
writeln(' Q1 Q2 Q');
writeln;
write('Введите P1 -> ');
readln(P1);
while Q1 = 0 do
begin
write('Введите Q1 -> ');
readln(Q1);
if Q1 = 0
then
writeln('Число Q1 не должно pавнятся 0');
end;
write('Введите P2 -> ');
readln(P2);
while Q2 = 0 do
begin
write('Введите Q2 -> ');
readln(Q2);
if Q2 = 0
then
writeln('Число Q2 не должно pавнятся 0');
end;
Podshet(P1,Q1,P2,Q2);
Vivod_Otveta(Celaya,P1,Q1,P2,Q2,P,Nod_2,2,10);
readkey;
End.

Задача 2. Для заданного N составить алгоритм вычисления значения выражения:

(1*1) (2*2) (3*3) (N*N)
--------- * ---------- * --------- *...* ---------
(1+(3*3)) (2+(3*3)) (3+(3*3)) (N+(3*3))

Program Kudashev_Artem;
Uses
Crt;
Var
N, Ch, Zn, Celaya: Longint;
{ - - - - - - - - - - - - - - - - - - - -}
Procedure Podshet(N: Longint; Var Chislitel, Znamenatel: Longint);
Var
A, Z: integer;
Begin
Chislitel:=1;
Znamenatel:=1;
for A:=1 to N do
begin
Chislitel:=Chislitel*(A*A);
Znamenatel:=Znamenatel*(9+A);
for Z:=2 to 10 do
begin
if ((Chislitel mod Z) = 0) and ((Znamenatel mod Z) = 0)
then
begin
Chislitel:=Chislitel div Z;
Znamenatel:=Znamenatel div Z;
end;
end;
end;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Begin
Clrscr;
TextBackground(Black);
Textcolor(Yellow);
write('Введите N -> ');
read(N);
Podshet(N,Chl,Zn);
Celaya:=Ch div Zn;
Chislitel:=Ch mod Zn;
writeln('Ответ');
writeln(' ',Ch);
writeln('',Celaya,' ---------');
writeln(' ',Zn);
readkey;
End.

Задание. Приготовьтесь объяснить решение задач учителю.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...