|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Процедуры и функции
Процедурные типы - это нововведение фирмы 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) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции. В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: значения, переменные, константы (в стандартном Паскале только значения). Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |