Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVYeT_K_EKZAMYeNU.doc
Скачиваний:
6
Добавлен:
21.12.2018
Размер:
211.97 Кб
Скачать

35 Передача в подпрограмму параметров регулярного типа (массивов, строк).

Типом любого формального параметра может быть только стандартный

или ранее объявленный тип.

Пример:

TYPE TYPE

ATYPE=ARRAY[1..10]OF REAL;

INTYPE=STRING[15];

PROCEDURE S(A:ATYPE);

OUTTYPE=STRING[30];

FUNCTION ST(S:INTYPE):

OUTTYPE

Иной способ для передачи параметров переменных отключением контроля компиляции.

Открытый массив PROCEDURE I (A: ARRAY OF REAL);

36 Функции. Описание. Вызов функции.

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

Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове - фактическими.

FUNCTION<имя>[(<формальные параметры>)]:<тип>

Сразу за заголовками может следовать одна стандартных директив: ASSEMBLER <тело подпрограммы на ассемблере>, EXTERNAL<объявление внешней подпрограммы>, FAR, FORWARD, INLINE<встроенные машинные инструменты>, INTERRUPT,NEAR. FUNCTION<имя функции>(параметр: тип); Begin <тело подпрограммы> end;

37 Рекурсии. Прямая и косвенная рекурсия. Директива forward.

Рекурсия – это такой способ организации вычислительного процесса при котором программа в ходе выполнения составляющих её операторов обращается сама к себе.

Для избежания переполнения стёка, следует размещать промежуточные результаты во вспомогательной переменной.

Begin

…………………………

F:=fac(n-1); - вспомогательная переменная

……………………….

End;

Рекурсивный вызов может быть косвенным, который разрешается опережающим описанием:

Procedure b(j: byte);

Forward;

Procedure a (i: byte);

Begin

B(i);

End;

38 Символьный тип.

Значением символьного типа является множество всех символов ПК.

Каждому символу присваивается целое число в диапазоне 0..255.Это

служит кодом внутреннего представления символа, его возвращает

функция ORD. Для кодировки используется код ASCII – 7 битный код,

т.е. с его помощью кодируется 128 символов (0..127). В то же время

в 8-битном байте, отведённом для хранения символа в ТП, можно

закодировать в 2 раза больше символов (0..255). (0-127ASCII, 128-

255-может меняться на ПК разных типов).

0-31 – служебные коды (пробелы)

39 Процедурные типы. Параметры-функции. Параметры-процедуры.

Процедурные типы – гибкое средство для передачи функций и процедур

в качестве фактических параметров обращения к другим процедурам и

функциям.

Type p1=procedure(a, b, c: real; var d: real);

F= function: string;

Любые процедуры или функции, передаваемые в качестве фактических

параметров объявляется директивой far.

Стандартные процедуры или функции ТП могут передаваться

рассмотренным образом. В программе могут быть объявлены

переменные процедурных типов.

Var p1:proc1;

F: func2;

Ap: array [1..n] of proc1;

Переменные процедурных типов допускается присваивать в качестве

значений имена соответствующих подпрограмм=> переменные становятся

синонимом имени подпрограммы.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]