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


 

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

48681. Исследование характеристик линейных электрических цепей 2.58 MB
  Задание к курсовой работе Нормирование параметров и переменных цепи Определение передаточной функции цепи Hs Расчет частотных характеристик цепи Hj Определение переходной h1t и импульсной ht характеристик Вычисление реакции цепи при воздействии одиночного импульса на входе Определение спектральных характеристик одиночного импульса воздействия Вычисление спектра реакции при одиночном импульсе на входе Определение спектра периодического входного сигнала Приближенный расчет реакции при...
48682. Численное моделирование и анализ переходных процессов в электрической цепи 576 KB
  В начальный момент времени ключ находится в положении При этом цепь разомкнута, напряжение на конденсаторе и ток в катушке равны нулю (U = 0, I = 0). Происходит первое переключение ключа (ключ мгновенно переводится в положение 2). При этом происходит заряд конденсатора, меняются значения U и I.
48684. Основы теории цепей 379 KB
  Содержание расчетно-пояснительной записки: таблица исходных данных; электрическая схема фильтра системы уравнений цепи; комплексная функция передачи; карта полюсов и нулей; АЧХ и ФЧХ и импульсные характеристики. С помощью метода узловых напряжений составляется система уравнения цепи в математической и скалярной форме.
48685. Проектирование электрической сети для электроснабжения потребителей целлюлозно-бумажной промышленности 1.33 MB
  В условиях эксплуатации баланс мощности составляется на каждый час суток(диспетчерский график нагрузки), и на каждый месяц следующего квартала. При проектировании электрической сети баланс мощности составляется для определения суммарного необходимого ввода мощности на электростанциях и обмена потоками мощностей с энергосистемой.
48686. Организация пассажирского движения 988.5 KB
  Для каждой категории поездов необходимо установить число и продолжительность стоянок по техническим надобностям смены локомотивов и локомотивных бригад технического осмотра составов снабжения топливом водой а также для посадки и высадки пассажиров или погрузки – выгрузки багажа и почты. Общим условием рациональной технологии обработки всех поездов является выполнение вспомогательных и подготовительных операций до их прибытия на станцию на основе предварительной информации о наличии свободных мест количестве багажа и почты...
48688. Исследование и анализ линейных динамических цепей 423.5 KB
  Полоса частот, в которой ослабление мало, называется полосой пропускания. Полоса частот, в которой ослабление велико, называется полосой непропускания (задерживания). Между этими полосами находится переходная область.
48689. Расчет радиовысотомера (РВ) с диапазоном измеряемых высот от Нmin до Нmax при удельной ЭПР отражающей поверхности не менее - 20 дБ 668.5 KB
  Расчет параметров сигнала. Принять что высота настройки УПФ следящей системы 25кГц коэффициент шума приемника 20 дБ потери энергии сигнала в высокочастотном тракте не превышают LΣ а при обработке ζΣ.04 м Ширина диаграммы направленности: φ=15 град Потери энергии сигнала в высокочастотном тракте: LΣ≤16 дБ Потери при обработке: Σ≤17 дБ Максимальная скорость изменения высоты: Vн mx=2 м с Удельная ЭПР отражающей поверхности: S≥20 дБ КПД антенны: ηа=0. При непрерывном сигнале обязательно применение в РВ...