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

Лекция 4. Подпрограммы.

1.Структура процедур и функций.

2.Перегрузка подпрограмм.

3.Параметры по умолчанию

Структура процедур и функций (Лекция 2).

Структура процедуры.

Procedure <Имя>[(<Список формальных параметров>)]; [<Локальные разделы описаний>]

Begin

[<блок исполняемых операторов>]

End;

Структура функции.

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

[<Локальные разделы описаний>]

Begin

[<блок исполняемых опеpатоpов>]

<Имя>:=<Результат - переменная или выражение того же типа, что и тип функции>;

End; <Имя>==result;

Здесь локальные разделы описаний:

[Unit1,..]

<подключение своих модулей>

[Label]

<раздел описания меток>

[Const]

<раздел описания констант>

[Type]

<раздел описания типов>

[Procedure]

<раздел описания процедур>

[Function]

<раздел описания функций>

[Var]

<раздел описания переменных>

<Список формальных параметров>== [!Var, Const, Out!]<Имя1> : <Тип1>;

[!Var, Const, Out!]<Имя2> : <Тип2>; и т.д. через точку с запятой с указанием типа. Спецификатор Var указывается, если параметр является входным и он же выходной, т.е. для тех параметров, которые изменяют свое значение.

Спецификатор Out указывается только для выходных параметров (результата).

Спецификатор Const указывается, чтобы запретить изменение параметра

Пример. Подпрограммы циклического сдвига влево.

Procedure CyclShl(Var b : byte); Begin

b:=((b and $80) shr 7) + (b shl 1);

End;

Старший разряд становится

А все остальные сдвигаются влево.

на место младшего

Старший разряд пропадает

Procedure CyclShla(b : byte; Out bcycl : byte); Begin

bcycl:=((b and $80) shr 7) + (b shl 1); End;

Function CyclShlb(const b : byte) : byte; Begin

result:=((b and $80) shr 7) + (b shl 1);

End;

Основная программа и результат (текст функции Binary для краткости опущен).

Var b, bcycl : byte; BEGIN

b:=$96; writeln(Binary(b));

CyclShl(b);

writeln(Binary(b)); CyclShla(b, bcycl); writeln(Binary(bcycl));

writeln(Binary(CyclShlb(bcycl)));

Readln;

END.

Перегрузка подпрограмм

Две или несколько одноименных процедуры или функции должны быть объявлены как перегружаемые, если они

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

Procedure CyclShl(Var b : byte); overload; Begin

b:=((b and $80) shr 7) + (b shl 1); End;

Procedure CyclShl(b : byte; Out bcycl : byte); overload;

Begin

bcycl:=((b and $80) shr 7) + (b shl 1); End;

При анализе списка модификаторы Var, Const, Out не

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

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

Procedure CyclShl(Var b : byte); overload; Procedure CyclShl(b : byte); overload; //Ошибка - // списки одинаковы.

Procedure CyclShl(b : byte; Out bcycl : byte); overload;

Procedure CyclShl(Out bcycl : byte b : byte); overload; //Ошибка – параметры одного типа

Procedure CyclShl(b : byte; Out bcycl : byte); overload;

Procedure CyclShl(b : byte; Out bcycl : word); overload;// Так можно

Параметры по умолчанию

Функция может иметь несколько параметров со значениями по умолчанию. Они должны находиться в конце списка параметров. Например, на основе ранее рассмотренных подпрограмм можно составить функцию циклического сдвига на n позиций влево со значением по умолчанию n=1.

Function CyclShkN(b : byte; n : integer = 1) : byte;

Var i : integer;

Begin

for i:=1 to n do b:=CyclShlb(b); result:=b;

End;

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

b:=CyclShkN(b); writeln(Binary(b)); //Сдвиг на 1 b:=CyclShkN(b,0); writeln(Binary(b));//Нет сдвига b:=CyclShkN(b,5); writeln(Binary(b));//Сдвиг на 5

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

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

Function CyclShkN(b : byte; n : integer = 1) : byte; overload;

Function CyclShkN(b : byte) : byte; overload;

Но что делать компилятору, если он встречает обращение? b:=CyclShkN(b);

Какую функцию вызывать? Это и есть коллизия.