28618

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

Доклад

Информатика, кибернетика и программирование

Для объявления процедурного типа используется заголовок процедуры функции в котором опускается ее имя например: type Prod = Procedure a b c: Real; var d: Real; Proc2 = Procedure var a b ; РгосЗ = Procedure; Func1 = Function: String; Func2 = Function var s: String: Real; Как видно из приведенных примеров существует два процедурных типа: типпроцедура и типфункция. Вычисление и печать значений этих функций реализуются в процедуре PRINTFUNC которой в качестве параметров передаются номер позиции N на экране куда будет...

Русский

2013-08-20

15.45 KB

0 чел.

Процедурные типы - это нововведение фирмы Borland (в стандартном Паскале таких типов нет). Основное назначение этих типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. 
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например: 

type 
Prod = Procedure (a, b, c: Real; var d: Real); 
Proc2 = Procedure (var a, b) ; 
РгосЗ = Procedure; 
Func1 = Function: String; 
Func2 = Function (var s: String): Real; 


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

sin1(х) = (sin(x) + 1) * ехр(-х) 
cos1(x) = (cos(x) + 1) * exp(-x). 


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

Uses CRT; 
type 
Func = Function (x: Real) : Real; 
{----------------} 
Procedure PrintFunc (XPos: Byte; F:Func) ; 
{Осуществляет печать функции F . (XPos - горизонтальная позиция начала вывода) } 
const 
np = 20; {Количество вычислений функций} 
var 
х : Real; i : Integer; 
begin {PrintFunc} 
for i := 1 to np do 
begin 
x := i * (2 * pi / np) ; 
GotoXY (XPos, WhereY) ; 
WriteLn (x:5:3, F(x):18:5) 
end 
end; {PrintFunc} 
{-----------------} 
Function Sin1fx: Real): Real; far; 
begin 
sinl := (sin(x) + 1) * exp(-x) 
end; 
Function Cos1(x: Real): Real; far; 
begin 
cosl := (cos(x) + 1) * exp(-x) 
end; 
{---------------} 
begin {основная программа} 
ClrScr; {Очищаем экран} 
PrintFunc (1, sin1); GotoXY (1,1); {Переводим курсор в левый верхний угол} 
PrintFunc (40, cos1) 
end. 


Обратите внимание: для установления правильных связей функций SIN1 и COS1 с процедурой PRINTFUNC они должны компилироваться с расчетом на дальнюю модель памяти. Вот почему в программу вставлены стандартные директивы FAR сразу за заголовками функций. В таком режиме должны компилироваться любые процедуры (функции), которые будут передаваться в качестве фактических параметров вызова. 
Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом. 
В программе могут быть объявлены переменные процедурных типов, например, так: 

var 
p1 : Proc1; 
f1, f2 : Func2; 
р : array [1..N] of Proc1; 


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

type 
Proc = Procedure (n: word; var a: Byte); 
var 
ProcVar: Proc; x,
у : Byte; 
Procedure Procl(x: word; var y: Byte); far; 
begin 
if x > 255 then 
у := x mod 255 
else 
у := Byte(x) 
end; 
begin {
Главная программа
ProcVar := Proc1; 
for x := 150 to' 180 do 
begin 
ProcVar (x + 100, y); 
Write (y:8) 
end 
end. 


Разумеется, такого рода присваивания допустимы и для параметров-функций, например: 

type 
FuncType = Function (i : Integer) : Integer; 
var 
VarFunc : FuncType; 
i : Integer; 
Function MyFunc (count : Integer) : Integer; far; 
begin 
....... 
end; {MyFunc} 
begin {Основная программа} 
....... 
i := MyFunc(1); {Обычное использование результата функции} 
....... 
VarFunc := MyFunc; 
{Присваивание переменной процедурного типа имени функции MyFunc} 
....... 
end. 


Отметим, что присваивание 

VarFunc := MyFunc(1); 


будет недопустимым, так как слева и справа от знака присваивания используются несовместимые типы: слева - процедурный тип, а справа - INTEGER; имя функции со списком фактических параметров MyFunc(1) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции. 
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения,параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).


 

А также другие работы, которые могут Вас заинтересовать

1310. Числовые характеристики случайных величин 73 KB
  Математическое ожидание. Формула для вычисления математического ожидания случайной величины по плотности распределения. Дисперсией случайной величины. Среднеквадратическое отклонение случайной величины.
1311. Ознакомление с организацией и технологией производства на ИП Дмитриев 107 KB
  Технологическая схема производства заварного пирожного. Контроль качества готовой продукции. Контроль производства заварного пирожного. Организационная характеристика.
1312. Экономические проблемы организации производства 75.5 KB
  Прибыль и убытки предприятия, производящего продукты питания. Прибыль и показатели рентабельности предприятия, производящего продукты питания. Налогооблагаемая прибыль и фактический налог на прибыль определяются по материалам налоговой отчетности.
1313. Ускорение. Прямолинейное движение с постоянным ускорением. Мгновеннная скорость 128 KB
  Векторная величина, равная отношению изменения скорости к промежутку времени, в течение которого это изменение произошло. Перемещение при равноускоренном движении. Уравнение движения.
1314. Адвокат в арбитражном процессе 27 KB
  Участие адвоката в арбитражной процессе обусловлено тем, что такие дела решают судьбу владения большими материальными ценностями. То есть, как известно, арбитражный процесс, и адвокат в арбитражном процессе являют собой процесс по решению хозяйственного вопроса между юридическими лицами.
1315. Расчет экономической эффективности установки 342.5 KB
  Установка поверки включает в себя электронные компоненты, корпус, печатную плату, блок питания. Их стоимость по прайсу Чип и Дип от 13.05.2012. Расчет заработной платы проектировщика. Экономический эффект от внедрения установки.
1316. Конспект лекций по Java 203.88 KB
  Коллекции-ассоциативные массивы (Мар). Сортировка и поиск, библиотеки ява. Предложение знакомства с менеджерами компоновки.
1317. Концепт желание в сопоставительном плане (на материале глагольных лексем русского, английского и немецкого языков) 325.17 KB
  Целью работы является характеристика способов выражения концепта желание в сопоставительном плане на материале глагольных лексем русского, английского и немецкого языков.
1318. ЛИНГВОКУЛЬТУРНЫЙ КОНЦЕПТ ВРЕМЯ ВОЕННОЕ/ KRIEGSZEIT В ИДИОЛЕКТАХ К. М. СИМОНОВА И Э. М. РЕМАРКА (НА МАТЕРИАЛЕ ТЕКСТОВ ВОЕННОЙ ПРОЗЫ) 328.6 KB
  Целью настоящей диссертации является подтверждение правомерности выделения сложного концепта Время военное/ Kriegszeit, а также анализ реализации его многоуровневой структуры в сопоставительном плане на материале текстов военной прозы К. Симонова и Э. М. Ремарка.