Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Паскалю.doc
Скачиваний:
61
Добавлен:
04.06.2015
Размер:
7.62 Mб
Скачать

Var s : Real;

Begin

s := x + y; эта функция ничего не вычисляет!

End;

7.помимоформальныхпараметров, в функции могут использоватьсялокальныепеременные. Они описываются внутри функции в разделеVar, существуют только в ней и служат для реализации алгоритма вычислений. При выходе из функции их значения исчезают:

Function Fact(n: Word): Word; nформальный параметр

Var i, f : Word; i, f – локальные переменные

Begin эта функция вычисляет факториал

f:=1; заданного числа

For i:=1 To n Do

f := f * i;

Fact := f;

End;

8.если в функции используется цикл с параметром (циклFor), то параметр цикла должен быть описанвнутриэтой функции, то есть он должен быть обязательнолокальнойпеременной (предыдущий пример),

9.связь вызывающей (головной) программы с функцией может осуществляться как через формальные и фактические, так и черезглобальныепараметры. Глобальные параметры (переменные) не описываются ни в заголовке функции, ни внутри ее. Они описываются ввызывающейпрограмме и существуют как в ней, так и в любой функции, вызываемой из этой программы. Глобальные переменные могут изменять свои значения как в вызывающей программе, так и внутри функции:

Program Global;

Uses CRT;

Var a, b, c, s : Integer; с - глобальная переменная

Function Sum(x, y : Integer) : Integer;

Begin

c := c + 1; изменение значения глобальной

Sum := x + y + c; переменной в функции

End;

Begin

a := 1;

b := 1;

c := 1; инициализация глобальной переменной

s := c + Sum(a, b);

WriteLn(‘s=’, s);

ReadLn;

End.

После выполнения этой программы s = 5.

Следует избегать использования глобальных переменных в функциях, так как это может привести к непредсказуемым результатам вычислений. В предыдущем примере значение переменной s определялось оператором присваивания:

s := c + Sum(a, b);

и принимало значение s = 5. Поменяем местами слагаемые в этом операторе присваивания:

s := Sum(a, b) + c;

Казалось бы, результат измениться не должен, но после вычислений получим s = 6- значение глобальной переменнойc изменилось внутри функции и стало равнымс = 2, и с таким значением оно было добавлено в общую сумму в вызывающей программе.

Локальные и глобальные переменные размещаются в оперативной памяти в различных сегментах(частях). При трансляции программы формируются:

  • сегмент кода, в котором хранитсяпрограммав виде машинных команд,

  • сегмент данных, в котором выделяется память подглобальныепеременные,

  • сегмент стека, предназначенный для размещениялокальныхпеременных:

Размер каждого сегмента не может превышать 64Кбайт. Адреса сегментов хранятся во время выполнения программы всегментных регистрах:

CS– адрес сегментакода,

DS– адрес сегментаданных,

SS– адрес сегментастека.

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

  • время жизни глобальныхпеременных – от начала работы программы до ее завершения,

  • если глобальныепеременные не были инициализированы явным образом, то есть им не были присвоены начальные значения, то перед началом работы программы ониобнуляются,

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

  • значения локальныхпеременных между двумя вызовами одной и той же подпрограммы не сохраняются,

  • неинициализированные локальныепеременные предварительно не обнуляются, а принимаютпроизвольные значения, зависящие от информации, оставшейся в занимаемых ими ячейках памяти,

  • если переменная внутри подпрограммы определена в разделе описания константConst, то память под нее выделяется не в сегменте стека, а в сегменте данных, причемначальноезначение ей присваиваетсяодин раз доначала работы программы, а не при входе в подпрограмму:

Function Func(k: Word) : Word;

Const n: Word = 0; nтипизированная константа