Простые процедуры и параметры.

ПРОЦЕДУРЫ CF Pascal

Процедуры CF Pascal на самом деле обладают значительно большей гибкостью и мощью, чем было представлено в главе 2. Процедуры могут иметь параметры, могут объявлять внутренние переменные, чьи значения доступны только внутри процедуры, и таким образом защищены от использования извне. Для иллюстрации использования процедур будет разработана небольшая библиотека операций над натуральными числами.

Процедуры – наиболее важная часть CF Pascal (и многих других языков программирования) потому что они позволяют разбить программу на небольшие разделы для лучшего понимания. Каждый раздел в значительной степени самодостаточен, его можно изучать в отдельности. При использовании процедуры нет необходимости читать весь ее текст, обычно достаточно прочитать название процедуры или обобщающий комментарий.

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

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

Процедуры с параметрами

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

Понятия: оператор процедуры, объявление процедуры, формальные параметры, фактические параметры, правило «все или ничего»

Простые процедуры и параметры.

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

Например, объявление процедуры:

PROCEDURE SwitchOneTwo;

BEGIN

Hold := OneV;

OneV := TwoV;

TwoV := Hold;

END.

Может быть написано для обмена значений OneV и TwoV, разрушая значение Hold. Это объявление добавляет пару

<SwitchOneTwo, Hold := OneV; OneV := TwoV; TwoV := Hold>

к состоянию выполнения и процедурное выражение SwitchOneTwo имеет значение

SwitchOneTwo = <s, s(SwitchOneTwo) (s)>

= <s, Hold := OneV; OneV := TwoV; TwoV := Hold (s)>

= (Hold, OneV, TwoV := OneV, TwoV, OneV)

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

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

Идентификаторы параметров помещаются в заголовке процедуры и используются в тексте как «подставные лица», то есть они фактически только обозначают место, куда будут подставлены переменные, использованные при вызове процедуры в тексте программы.

Например, заголовок:

PROCEDURE SwitchThese2(VAR V1, V2, temp: CHAR)

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

PROCEDURE SwitchThese2(VAR V1, V2, temp: CHAR);

BEGIN

Temp := V1;

V1 := V2;

V2 := Temp;

END

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

Например, если в программе объявлены переменные Hold, OneV и TwoV, то процедурное выражение

SwitchThese2(OneV, TwoV, Hold)

Выполнит обмен значений OneV и TwoV точно так же как это сделала бы процедура SwitchOneTwo. Но мы также с помощью

SwitchThese2(OneV, AnyV, Hold)

сможем обменять значения OneV и AnyV без всяких изменений в объявлении переменной Switchthese2. Как будто в тексте объявления процедуры формальные параметры были заменены на фактические. В последнем примере

SwitchThese2(OneV, AnyV, Hold)

= Hold := OneV; OneV := AnyV; AnyV := Hold

= (Hold, OneV, AnyV := OneV, AnyV, OneV)

Процедуры могут иметь параметры разных типов. Например:

PROCEDURE Copy (VAR F1, F2: TEXT; VAR Ch: CHAR);

Может быть использован как заголовок процедуры, чей оператор BEGIN копирует файл F1 в файл F2 с сохранением структуры строк.

PROCEDURE Copy (VAR F1, F2: TEXT; VAR Ch: CHAR);

BEGIN {Copy}

WHILE NOT EOF (F1)

DO

BEGIN

WHILE NOT EOLN (F1)

DO

BEGIN

READ(F1, Ch);

WRITE(F2, Ch)

END

READLN(F1);

WRITELN(F2)

END

END {Copy}

Эта процедура может в дальнейшем быть использована с любым существующими файлами, которые подставляются вместо F1 и F2 и любой существующей символьной переменной, которая подставляется вместо Ch. Например:

Copy(INPUT, OUTPUT, temp)

Будет отображать input в output.

Наши рекомендации