АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Процедуры и функции

Читайте также:
  1. II. Выполнение процедуры
  2. III. Завершение процедуры
  3. III. Завершение процедуры
  4. III. Окончание процедуры
  5. XVIII. ПРОЦЕДУРЫ И ФУНКЦИИ
  6. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  7. Аналитические методы при принятии УР, основные аналитические процедуры, признаки классификации методов анализа, классификация по функциональному признаку.
  8. Аналитические процедуры
  9. Аналитические процедуры аудита
  10. Банки и их функции. Банковская система
  11. Банкротство: понятие, факторы, процедуры
  12. В 72-х дневном цикле подвиг длится 8 суток, из которых 2 суток – голод, а 6 – очистительные процедуры и работа над собой. В 12-ти летнем цикле подвиг длится 1 год.

 

Процедурные типы - это нововведение фирмы 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;

Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.

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

sin1(х) = (sin(x) + 1) * ехр(-х)

cos1(x) = (cos(x) + 1) * exp(-x).

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

Пример 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) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)