Смекни!
smekni.com

Структура Паскаль-программы (стр. 5 из 5)

Общая структура подпрограммы.

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

1) Интерфейс подпрограммы.

2) Описание локальных объектов.

3) Операторы.

Интерфейсом подпрограммы является её заголовок. В описании локальных объектов могут определяться константы, переменные, другие подпрограммы и т.п.

procedure <имя> [(список формальных параметров)];

function <имя> [(список формальных параметров)]: <тип>;

Список формальных параметров – список тех параметров, которые передаются подпрограмме в точке её вызова.

procedure Swap (var x, y: real);

function Max (a, b: byte): byte;

procedureStop;

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

Среди описаний в подпрограмме может содержаться описание других подпрограмм (так называемые, вложенные подпрограммы). (См. рис. в тетради).

При работе с блоками необходимо соблюдать следующие правила:

1) Имена объектов, описанных в блоке, считаются известными в пределах данного блока, включая и все вложенные блоки.

2) Имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков.

3) Если во внутреннем блоке описан объект, имя которого совпадает с именем из внешнего блока, то имя из внешнего блока не будет доступно во внутреннем блоке.

Совокупность объектов, описанных в самом внешнем блоке, называется глобальными переменными.

var i: integer;

procedure P;

var i: integer;

begin

writeln(i);

end;

begin

i := 1;

P;

end.

Параметры.

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

Swap(a, b);

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

procedure Incorrect (a: array[1..15] of real); - запись неправильная.

type vector = array[1..15] of real;

procedure Correct (a: vector); - запись правильная.

Примеры заголовков подпрограмм:

function MaxElem (a: vector; n: byte): real;

procedure Sum (a, b: matrix; var c: matrix);

procedure Move (var Source, Dest; n: word);

Формальные параметры в заголовках процедуры могут быть заданы тремя способами:

1) без служебного слова varс указанием типа.

2) со служебным словом varи с указанием типа.

3) со служебным словом varбез указания типа.

Эти три способа задания формальных параметров выражают три различных способа передачи параметров подпрограммам.

Первый способ называется «передача параметров по значению».

Второй способ называется «передача параметров по ссылке».

Третий способ называется «передача нетипизированных параметров по ссылке».

Передача параметров по значению.

Это самый простой и наиболее распространённый способ. При передаче параметров по значению программа работает с копией фактического параметра.

var a, b: real;

procedure SumSquare (x, y: real);

begin

x := x * x;

y := y * y;

writeln(x + y);

end;

begin

a := 1,7;

b := 8,09;

SumSquare(a, b);

writeln(a, b);

end.

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

Типовые параметры.

При вызове подпрограммы мы можем представлять переменную типа, но не выражения.

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

1. Применить конструкцию приведения типа.

2. Описать в подпрограмме локальную переменную определённого типа, с совмещением её в памяти с нетипизированным параметром.

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

Fqual(var Source,Dest);

Type

Bytes=array[0..maxint] of byte;

Var

N:integer;

Begin

N:=0;

While (n<size) and (bytes(dest)[n]=bytes(source)[n]) do n:=n+1;

Fqual:=(n=size)

End.

Type

Vector=array[1..10] of integer;

Point=record

X,y:integer

End;

Var

Vec1,vec2:vector;

N:integer;

P:point;

Fqual(vec1,vec2;size of integer);

Fqual(vec1[1], {сравниваются 5 первых элементов vec1 с 5 последними элементами vec2} vec2[6]; sizeofinteger);

Fqual(vec1[1],P,4);

Второй способ:

В TurboPascal для того чтобы разместить 2 параметра в одном том же поле, используется слово absolute.

Var A:real;

B:integer absolute a;

В случае такого описания новая память под хранение переменной bне отводится. Переменная aи b могут иметь разные типы. Никаких проверок не производится.

Вычисление значения функции.

Смысл функции заключается в вычислении некоторого значения и организации передачи этого значения в точку вызова. Возврат вычисленного значения осуществляется следующим образом.

В теле функции должен присутствовать оператор присваивания, в левой части которого должно быть указано имя функции, а в правой части – выражение, вычисляющее возвращаемое значение. Тип выражения должен быть совместим с типом функции. Если в теле функции ни одного такого оператора нет, результат функции считается неопределённым.

Exit– с помощью этой процедуры можно немедленно вернутся в точку вызова подпрограммы.

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

Это слово указывает на то, что тексты подпрограмм располагаются далее.

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

Распределение памяти для локальных переменных.

Турбо Паскаль реализует следующий принцип распределения памяти для подпрограмм

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