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) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции. 
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения,параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).


 

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

19521. Амплитудно фазовый критерий Найквиста 3.26 MB
  Амплитудно фазовый критерий Найквиста. АФ критерий Найквиста позволяет оценить устойчивость системы с отрицательной обратной связью то есть замкнутый по найденной экспериментальной или из передаточной функции АФХ разомкнутой системы. Рассмотрим замкнутый контур....
19522. Показатели качества переходных процессов 1.78 MB
  Показатели качества переходных процессов. Процессам управления представляют следующие основные требования по точности установившихся режимов по устойчивости и по качеству переходных процессов. Устойчивость САУ то есть затухание протекающих в ней процессов явля
19523. Интегральные критерии качества 1.75 MB
  Интегральные критерии качества. Интегральный критерий дает обобщенную оценку качество переходного процесса одну из достоинств интегральных критериев в том что для их определения не обязательно строить график переходного процесса что иногда является затруднительны...
19524. Расширенные частотные характеристики 1.3 MB
  Расширенные частотные характеристики. При разработки САУ критерия качества применяют не только для оценки готовых систем но их используют на стадии разработки вводя в расчеты и тогда параметры системы получают с учетом определенных требований. Наиболее удобным пока...
19525. Пропорциональный закон регулирования 341 KB
  Пропорциональный закон регулирования описывается следующим уравнением . Здесь: параметр настройки регулятора. заданное значение регулируемой координаты. Знак €œ€ означает что регулятор включен в систему по принципу отрицательной обратной. Уравнение регулятора
19526. Интегральный закон регулирования 454.5 KB
  Интегральный закон регулирования описывается уравнением. Как видно из уравнения интегральным регулятором является интегрирующие звено с постоянной интегрирования которая является параметром настройки регулятора. Динамические характеристики: ; АФХ ; АЧХ ; ФЧХ ...
19527. Пропорционально-дифференцируемый (ПД - регулятор) 1014 KB
  Пропорционально-дифференцируемый ПД регулятор Представляет собой параллельное соединение пропорционально и дифференциальной составляющей. Динамические характеристики: С точки зрения качества переходных процессов ПД регулятора обладае...
19528. Пропорционально – интегральный регулятор (ПИ) 798 KB
  Пропорционально интегральный регулятор ПИ Динамические характеристики: Система с ПИ регулятором не дает статической ошибки. ПИ регулятор сочетает в себе достоинство обеих простейших составляющих. П составляющая обеспеч...
19529. Пропорционально – интегрально дифференцируемый регулятор (ПИД) 1.11 MB
  Пропорционально интегрально дифференцируемый регулятор ПИД АФХ АЧХ: ФЧХ ПИД регулятор сочетает в себе достоинства всех 3х составляющих. Высокое быстродействие П составляющей малая динамическая ошибка за счет воздействия по скорости и отсутст...