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

Лабораторная работа №1 Процедурные типы

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

1. Теоретические сведения

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

Type

Proc1 = Procedure (a, b, c : real; var d: real);

Proc2 = Procedure ( var a, b);

Proc3 = Procedure;

Func1 = Function : string;

Func2 = Function ( var s: string) : real;

Как видно из приведенных примеров, существует два процедурных типа:

тип-процедера и тип-функция.

Рассмотрим пример, иллюстрирующий механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1(x) = (sin(x) + 1) * e-x

и cos1(x) = (cos(x) + 1) * e-x.

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

Пример 1.1

Program VichFunc;

Uses Crt;

Type Func = Function (x: real) : real;{объявление процедурных типов: типа функций}

{$F+}; {включение директивыдальнего” вызова}

Function sin1(x:real): real;

begin

sin1 := (sin(x)+1) * exp(-x);

end;

Function cos1(x:real): real;

begin

cos1 := (cos(x)+1) * exp(-x);

end;

{$F-};

Procedure PrintFunc(n: byte; F: Func);{вычисление и печать значений функций реализуется в данной процедуре, в которой в качестве параметра передается номер позиций n на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции}

const np=5; {количество вычислений функций}

Var X: real; I: integer;

Begin

for i:=1 to np do

begin

x:= i * (2 * 3.14/np);

GotoXY(n,whereY);{перемещаем курсор к элементу экрана с координатами Х,У., whereY – возвращает текущую координату Yтекущего положения курсора в окне}

writeln (x:5:3; F(x):10:5);

end;

End;

Begin {Основная программа}

ClrScr;

PrintFunc(1,sin1);

GotoXY(1,1);

PrintFunc(35,cos1);

KeyPressed;

End.

Обратим внимание: для установления правильных связей функций sin1 и cos1 с процедурой PrintFunc они должны компилироваться с расчетом на дальнюю модель памяти. В этом режиме при вызове подпрограмм используются длинные 4-байтовые адреса (для записи адреса в память отдельно сохраняется сегментный адрес = 2 байтам, и смещение = 2 байтам). 2-х байтовые адреса применяются обычно для адресации подпрограмм, объявленных в основной программе или ее подпрограмма.

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

Стандартные (встроенные) процедуры и функции ТР не могут передаваться рассмотренным способом.

В программе могут быть объявлены переменные процедурных типов, например, так:

Var

P1 : Proc1;

f1,f1: Func2;

ap: array [1..N] of Proc2;

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

Type

Proc = Procedure ( n: word; var a : byte);

Var

ProcVar : Proc;