Студопедия

Главная страница Случайная страница

Разделы сайта

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






Нетипизованные параметры подпрограмм






 

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

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

 

Function Equal(var a, b; size: word): boolean;

type bytes=array[1..65520] of byte; {тип - массив байтов максимального размера}

var i: word;

begin i: =1;

while (i< =size) and (bytes(a)[i]=bytes(b)[i]) do

i: =i+1;

Equal: =i> size

end.

 

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

k=(i-1)n+j, где n - число элементов в строке.

 

Пример 3. Описание процедуры обмена строк с номерами r1 и r2 матрицы a (n - длина строки):

Procedure Rows_Swap(var a; n, r1, r2: word);

var i, k1, k2: word;

t: real;

begin

for i: =1 to n do

begin

k1: =(r1-1)*n+i;

k2: =(r2-1)*n+i;

t: =t_max_vect(a)[k1];

t_max_vect(a)[k1]: =t_max_vect(a)[k2];

t_max_vect(a)[k2]: =t

end

end;

 

28. ПРОЦЕДУРНЫЕ И ФУНКЦИОНАЛЬНЫЕ ТИПЫ

 

TP позволяет рассматривать процедуры и функции как объекты, которые могут быть присвоены переменным или переданы в качестве параметра подпрограммам. Такие переменные должны иметь процедурный или функциональный тип. Далее будем называть любой из этих типов процедурным. Описание процедурного типа представляет собой описание заголовка подпрограммы, но без указания имени подпрограммы, например:

 

Type proс=procedure; {тип используется для процедур без параметров }

swap_proс =procedure(var a, b: real);

math_func =function(x: real): real;

Имена параметров играют только иллюстративную роль. Можно описывать переменные процедурных типов, компоненты структурированных типов могут иметь процедурные типы. Например,

Var f: math_func;

f_arr: array[1..3] of math_func;

psw: swap_proс;

p_sort2: procedure (var x, y: real);

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

1) компилироваться с дальним типом вызова ({$F+});

2) не должна быть вложенной;

3) не должна быть стандартной;

4) не должна быть процедурой прерывания или типа inline.

 

Для обеспечения первого условия перед описанием подпрограммы или подпрограмм можно указать директиву компилятора {$F+}, а после описания - {$F-} (пример 1), или после заголовка подпрограммы указать директиву FAR (пример 2).

Если стандартную подпрограмму нужно передать в качестве параметра или присвоить переменной, то требуется создать некоторую «надстройку» (пример 2).

 

 
 

 

 


Пример 3. Программа нахождения корней трех уравнений на промежутке [a, b] с точностью e:

Type t_math_func=function (x: real): real;

var f: array[1..3] of t_math_func;

a, b, eps: real;

i: byte;

function root(a, b, eps: real; f: t_math_func): real;

{функция нахождения корня уравнения f(x)=0 методом половинного деления}

var c: real;

begin

while abs(b-a)> eps do

begin

c: =(a+b)/2;

if f(a)*f(c)< 0 then b: =c else a: =c;

end;

root: =(a+b)/2

end;

{$F+}

function f1(x: real): real;

begin f1: =sin(x) -0.1

end;

function f2(x: real): real;

begin f2: = sin(x)/cos(x)+0.1

end;

function f3(x: real): real;

begin f3: = exp(x) -1/2

end;

{$F-}

Begin write(‘Введите промежуток и точность’);

read(a, b, eps);

f[1]: =f1; f[2]: =f2; f[3]: =f3;

for i: =1 to 3 do

writeln(‘Уравнение ‘, i, ‘: x=’, root(a, b, eps, f[i]))

end.

 

29. МОДУЛИ В TP

 

TP содержит библиотеку подпрограмм, которая хранится в файле turbo.tpl. Все подпрограммы разбиты на несколько групп, называемых модулями. В каждом модуле содержатся описания констант, типов, переменных, процедур и функций. Один из модулей, модуль Graph, находится в отдельном файле Graph.tpu.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.