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


 

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

63431. БАЗЫ ДАННЫХ И WEB ТЕХНОЛОГИИ 564 KB
  Основы web технологий Архитектура использования БД на Web Серверные технологии Использование языка XML для динамического представления информации Подходы по реализации портала Производительность надежность и безопасность данных...
63433. Роль зеленых насаждений в снижении загрязнения атмосферного воздуха. Правовые основы охраны атмосферного воздуха. Фотохимический смог и причины его образования 98 KB
  Только предприятия России выбрасывают в атмосферу более 70 млн т разнообразных веществ в год. При мощности 1 млн кВт она ежегодно выбрасывает в атмосферу 365 млрд м3 горячих газов содержащих пыль вредные вещества и 1000 млн м3 пара.
63434. УПРАВЛЕНИЕ ДАННЫМИ 328.5 KB
  Управление данными необходимый процесс Основная концепция управления данными Управление данными в экспедициях и экспериментах пунктах измерений Управление данными в центрах обработки данных Управление данными в отдельных проектах Управление данными...
63436. ДОСТОВЕРНОСТЬ И КАЧЕСТВО ДАННЫХ 318.5 KB
  Проблема качества данных Метрики оценки качества БД Источники ошибок Методы контроля данных Оформление результатов контроля данных Организация работ по повышению качества данных. Проблема качества данных Надежная БД должна обеспечивать высокую вероятность...
63437. Почвы и их рациональное использование. Экологическое состояние земельных ресурсов в РК. Источники, причины загрязнения и истощения земельных ресурсов. Проблемы опустынивания. Мероприятия по защите земель 78 KB
  Почвы и их рациональное использование. Структура почвы Почва это особое природное образование обладающей рядом свойств присущих живой и неживой природе. Он назвал почвы четвертым царством природы наряду с минералами животными и растениями.
63438. ОПТИМИЗАЦИЯ РАБОТЫ С БАЗАМИ ДАННЫХ 692.5 KB
  Ниже перечислены вопросы ответы на которые позволяют определить критерии оптимизации работы с БД: Сколько одновременно активных пользователей должна поддерживать система Основные или доминирующие типы запросов к системе Какова стратегия индексации данных Какие запросы будут оптимизированы...
63439. Экономический рост. Сущность, факторы, источники экономического роста. Типы экономического роста. Показатели экономического роста 120 KB
  Глобальной задачей любой экономической системы является полное удовлетворение потребностей всех людей. Цель является идеальной, поскольку не может быть достигнута никогда ввиду одновременного влияния на процесс развития экономики закона возвышения...