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

Процедурный тип.

В Турбо Паскале определен тип данных , который называется процедурным. Определение этого типа аналогично определению заголовка подпрограммы без имени.

Простейший способ определения этого типа:

VAR P:PROCEDURE;

Значениями переменной Р может быть любая процедура.

VAR <имя>: PROCEDURE < список формальных параметров >

Введение этого типа позволяет описывать формальные параметры как подпрограммы.

TYPE FUNC=FUNCTION(X,Y:BYTE):BYTE;

VAR F1,F2: FUNC;

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

Если в той же программе имеются функции сложения двух чисел , тодопустимо присвоение F1:=АDD;

причем F1 в качестве значения .

FUNCTION АDD(А,В:BYTE):BYTE;

BEGIN

АDD:=А+В;

END;

F1:=АDD; { после этого присваивания возможно вызвать функцию двумя способами}

WRITELN(АDD(1,2));

WRITELN(F1 (1,2));

Правило использования процедурных типов

1. Подпрограмма , присваиваемая переменной процедурного типа , должна быть оттранслирована в режиме дальнего типа вызовов. Это директива компилятора { F+}.

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

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

А) открытие файла с заданными числами и инициализация глобальных переменных;

Б) вычисление сумм и количества;

В) вывод результата и закрытие файла.

Центральная процедура расчета содержит две вложенных процедуры: соответствующие вычисления для положительных и отрицательных чисел. Сама центральная процедура работает как управляющая по отношению к вложенным. Глобальный текст программы образует имена 4-х переменных, предназначенных для подсчета результатов, имя файла с исходными данными и имена 3-х процедур (START, PROCESS, FINISH). Все эти имена глобальные переменные и используются во всех блоках программы. Блоки START и FINISH не имеют разделов описаний, работают с глобальными переменными, доступными им по правилу блочности.

PROGRAM EXAMPLE;

VAR

INFILE: FILE OF INTEGER; {исходныйфайл}

COUNTPOS, COUNTNEG : WORD;

SUMPOS, SUMNEG : LONGINT; {переменные для подсчета нужных значений}

PROCEDURE START; {начальные действия}

BEGIN

ASSIGN(INFILE,PARAMSTR(1));

RESET(INFILE);

COUNTPOS:=0;COUNTNEG:=0;

SUMPOS:=0; SUMNEG:=0;

END;

PROCEDURE PROCESS; { вычисления}

BEGIN

VAR

VA 1: INTEGER;

{вложенные процедуры}

PROCEDURE PROCESSPOS(ITEM:INTEGER); {подсчет положительных чисел}

BEGIN

SUMPOS := SUMPOS + ITEM;

INC(COUNTPOS)

END;

PROCEDURE PROCESSNEG(ITEM:INTEGER); { подсчет отрицательных чисел}

BEGIN

SUMNEG := SUMNEG+ ITEM;

INC(COUNTNEG)

END;

BEGIN { PROCESS }

REPEAT

READ(INFILE , VA 1);

IF VA 1 > 0 THEN

PROCESSPOS(VA 1)

ELSE

PROCESSNEG(VA 1)

UNTIL

EOF(INFILE)

END; {PROCESS }

PROCEDURE FINISH; { завершающие действия}

BEGIN

WRITELN(' Сумма' ', 'COUNTPOS',' положительных чисел =',SUMPOS);

WRITELN(Сумма' ', 'COUNTNEG',' отрицательных чисел =',SUMNEG);

CLOSE(FILE);

END;

BEGIN { начало внешнего блока программы }

START;

PROCESS;

FINISH

END; {Конец программы }