Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
13.03.2016
Размер:
124.93 Кб
Скачать

Пример программы, использующей функции

program primer_2_3;

type mas=array[1..10] of real; var a,b:mas; y:real; pra:real;

function sum(var v:mas; n:integer):real; {функция вычисляет сумму первых n (n<=10) элементов массива v}

var s:real; i:integer; begin

s:=0;

for i:=1 to n do s:=s+v[i]; sum:=s;

end;{конец функции sum}

Пример программы, использующей функции (продолжение)

function pr(var v:mas; n:integer):real;

{функция вычисляет произведение первых n(n<=10) массива v}

var p:real; i:integer; begin

p:=1;

for i:=1 to n do p:=p*v[i]; pr:=p;

end; {конец функции pr}

Пример программы, использующей функции (продолжение)

procedure masin(var v:mas; n:integer);

{процедура осуществляет ввод массива v размером n (n<=10)}

var i:integer; begin

for i:=1 to n do read(v[i]); readln;

end; {конец процедуры masin};

Пример программы, использующей функции (продолжение)

BEGIN

writeln(' BBEДИТЕ МАССИВ А ИЗ 10 ЭЛЕМЕНТОВ'); masin(a,10);

writeln(' ВВЕДИТЕ МАССИВ В ИЗ 5 ЭЛЕМЕНТОВ'); masin(b,5);

pra:=pr(a,10); if pra =0 then

writeln(' ЗНАМЕНАТЕЛЬ РАВЕН НУЛЮ') else

begin y:=(sum(a,10)*(pr(b,5)+5)-sum(b,5))/pra;

writeln(' ЗНАЧЕНИЕ ВЫРАЖЕНИЯ; y=',y:9:3); end;

readln;

END.

Глобальные и локальные имена

Глобальные имена - это имена, которые действуют на протяжении всей программы (или внешнего блока), они объявляются в соответствуюших разделах программы (или внешнего блока).

Локальные имена - это имена, которые действуют в пределах блока подпрограммы, это внутренние имена подпрограммы.

К локальным именам относятся формальные параметры и все имена, описанные в блоке подпрограммы. Вне блока подпрограммы локальные имена не определены.

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

Область памяти для локальных и глобальных имен

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

статическом сегменте памяти; память под них распределяется при компиляции.

Локальные данные подпрограммы хранятся в специальной области оперативной памяти – стеке; память под эти данные распределяется каждый раз при вызове подпрограммы и освобождается при завершении работы подпрограммы.

Схема заполнения стэка

 

 

 

Р1

 

Р2

 

Р3

 

ПРОГРАММА

а)

 

. . .

 

. . .

 

. . .

. . .

 

 

 

 

Вызов Р1

 

Вызов Р2

 

Вызов Р3

 

 

 

 

. . .

 

. . .

 

. . .

 

. . .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б)

 

 

 

Р1

направление заполнения стека

Р2

(в сторону уменьшения адресов)

Р3

 

Свободная память стека блоков

 

(процедур и функций)

 

 

 

а) порядок вызова подпрограмм; б) порядок заполнения стэка.

Область действия имени

Область действия имени - это часть программы, в которой имя может быть доступно.

Область действия локального имени - блок подпрограммы, в которой оно объявлено; глобального – весь текст программы от места объявления до последнего слова End (с точкой).

Глобальное имя доступно в подпрограмме только в том случае, если в подпрограмме оно не объявлено еще раз.

Время жизни (существования) данных

Время жизни – это время, в течение которого по данные распределена память.

По времени жизни данные делятся на статические,

автоматические, динамические.

Статические данные существуют все время выполнения программы.

Автоматические данные существуют во время выполнения подпрограммы , в которой описаны.

Динамические данные получают место в памяти с помощью операторов динамического распределения памяти.

В Паскале статические данные - это глобальные данные, автоматические – локальные.

Пример

Program Primer;

a-глобальная переменная, под нее отведена

Var a,i:real;

 

одна ячейка в статическом сегменте

Procedure p1;

памяти, которая доступна программе и

Var i:real;

 

процедурам р1 и р2. Под переменную с

Begin . . . a:=...;

именем i программы отводится ячейка

i:=...;

 

памяти статического сегмента; под

End{p1};

 

переменные i процедур память в стеке

Procedure p2;

распределяется столько раз, сколько раз

Var i:real;

 

осуществляется вход в блок процедур (в

Begin . . . a:=...;

нашем примере три раза: при вызове р1 и

i:=...;

 

при каждом вызове р2); при выходе из

End{p2};

 

блока (т. е. при завершении работы

Begin

{раздел

процедуры) ячейка с именем i каждый раз

действий

 

освобождается. Так как в каждой

программы}

 

процедуре имеется локальное имя i,

i:=...; a:=...;

глобальное i программы в процедурах

р1; р2;

р2

недоступно.

End.

 

Далее слайд 19 еще раз