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


 

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

50708. Определение коэффициента поверхностного натяжения по высоте подъёма жидкости в капиллярных трубках 25 KB
  Тема: Определение коэффициента поверхностного натяжения по высоте подъёма жидкости в капиллярных трубках. Цель работы: определить коэффициента поверхностного натяжения. Вывод: В этой работе мы с помощью четырёх капиллярных трубок нашли два значения коэффициента поверхностного натяжения 1 = 745  178103 Н м и 2 = 644  218103 Н м.
50709. Исследование напряженного состояния тонкостенной цилиндрической оболочки 282 KB
  В таких оболочках действуют кольцевые в первом главном сечении и меридиональные напряжения во втором главном сечении которые могут определиться через внутренние силы и моменты: ; 1 где S меридиональные силы; Т кольцевые силы; толщина стенки; Z координата точки в которой определяем напряжение; Z изменяется от до . Из формулы 1 следует что напряжения распределены по толщине стенки по линейному закону достигая наибольших значений на внутренней или нагруженной поверхностях опор ; 2 В этих формулах если...
50710. ПОКУДОВА ДОБОВИХ ГРАФІКІВ НАВАНТАЖЕННЯ ЗА ДАНИМИ ОБСТЕЖЕННЯ ГРУПИ КОМУНАЛЬНО-ПОБУТОВИХ ЕЛЕКТРОПРИЙМАЧІВ ТА ВИЗНАЧЕННЯ РОЗРАХУНКОВОГО МАКСИМАЛЬНОГО НАВАНТАЖЕННЯ І ОСНОВНИХ ХАРАКТЕРИСТИК ГРАФІКА 191 KB
  Натурний експеримент Мета роботи. Побудова добового графіку навантаження комунально-побутового споживача житлового будинку квартири тощо на основі обстеження його електроприймачів та обчислення розрахункового максимального навантаження і основних числових характеристик графіка. ТЕОРЕТИЧНІ ВІДОМОСТІ Електричне навантаження є основним...
50711. ИССЛЕДОВАНИЕ СЛОЖНОЙ ЦЕПИ ПОСТОЯННОГО ТОКА 126 KB
  Выполнить опытную проверку принципа наложения. Принцип наложения формулируется следующим образом: ток в Кой ветви равен алгебраической сумме токов вызываемых в этой ветви каждой из э. Принцип наложения используется в методе расчета получившем название метода наложения. Опытная проверка принципа наложения производится в следующем порядке: а в цепи собранной при выполнении пункта 1 отключается один из источников э.
50712. Имя существительное как части речи 72.5 KB
  Имя существительное – это самостоятельная часть речи, имеющая категориальное значение предметности и выражающая его в несловоизменительных категориях рода и одушевленности
50713. Ознайомлення з приладами та пристроями для вимірювання витрат енергоносіїв 132 KB
  Витрата рідини що вимірюється в одиницях обєму називається обємною Vτ наприклад м3 с а в одиницях мас масовою Мτ кг с. Звязок між ними Мτ= Vτρ де ρ кг м3 густина рідини. Обєм рідини як правило не є одиницею кількості речовини оскільки для однієї і тієї ж кількості рідини він залежить від температури і тиску або питомого обєму. За необхідності із цього поняття виокремлюють краплинні рідини і гази.
50714. Исследование работы фланцевого соединения 86.5 KB
  Эксперимент начинается со снятия показаний тензодатчиков при разгруженных болтах. Затяжка каждого болта контролируется по изменению показаний прибора ВСТ4. Значения показаний прибора разгруженных Поi и затянутых Пi болтов заносятся в таблицу 3 причем разность показаний для каждого болта не должна отличаться от расчетной более чем 15.
50715. Исследование фазового резонанса в цепи с последовательным соединением активного, индуктивного и емкостного сопротивлений 108 KB
  Цель работы: уяснить условия получения резонанса напряжений экспериментально исследовать явление резонанса напряжений в зависимости от изменения либо реактивного сопротивления либо частоты исследуемой цепи. Резонанс напряжений называется такой пассивной электрической цепи переменного тока с последовательным соединением активного индуктивного и емкостного сопротивлений при котором входное реактивное сопротивление равно нулю. При резонансе напряжений напряжение на входе цепи совпадает по фазе с током т.
50716. Исследование колебаний вращающегося вала 324 KB
  Изза неточности изготовления и сборки центры масс деталей как правило не находятся на оси вращения вала т. При вращении вала вследствие дисбаланса возникают переменные по направлению силы инерции дополнительно нагружающие вал и его опоры и вызывающие механические колебания системы. В связи с этим необходимо исследование колебаний вращающегося вала.