Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр_пас_3.doc
Скачиваний:
120
Добавлен:
04.11.2018
Размер:
13.31 Mб
Скачать

2.6.7. Параметры подпрограмм без указания типа

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

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

Используя подпрограмму с параметром без типа, можно сделать ее универсальной, т.е. пригодной для обработки любого массива. Рассмотрим пример такой подпрограммы, суммирующей элементы одномерного массива произвольной длины.

Program SumMas;

Var a: array[1..10] of real;

s1: real;

k : integer;

{ функция с параметром без типа }

Function Sum( var mas; n: integer ): real;

Type tarray = array[1..maxint] of real;

Var i: integer;

s: real;

Begin

s := 0;

For i := 1 to n Do

s := s + tarray( mas )[ i ];

Sum := s

End;

{ раздел операторов программы }

Begin

Writeln( ‘введите массив’ );

For k := 1 to 10 Do

Readln( a[k]);

{ вызов функции для суммирования массива }

s1 := Sum( a, 10);

Writeln( s1 )

End.

В этом примере имя tarray определяет тип одномерного массива с количеством элементов равным максимальному целому числу. В подпрограмме это имя используется для приписывания типа параметру mas. Реально при обращении к функции Sum вместо параметра mas подставляется массив a из 10 элементов.

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

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

Параметр процедурного типа - это параметр-значение.

Таким параметрам в заголовке подпрограммы должен приписываться процедурный тип.

Задание процедурного типа - это просто заголовок процедуры (функции), из которого изъято имя процедуры (функции).

Например: Type func = function (x: real): real;

proc = procedure (x: real; Var y: real);

В этом примере тип func описывает функцию одной вещественной переменной, имеющую вещественный результат; тип proc определяет процедуру с двумя вещественными параметрами, первый параметр - значение, второй - переменная.

При обращении к подпрограммам, имеющим параметры процедурного типа, на место таких параметров подставляются имена подпрограмм, соответствующих описанным типам. Эти подпрограммы не должны быть стандартными и должны компилироваться с использованием дальней модели памяти. Т.е. перед текстом подпрограмм должна стоять директива компилятору {$F+}, а в конце директива - {$F-}.

Рассмотрим пример программы, в состав которой входит процедура приближенного решения нелинейного уравнения методом половинного деления. Решить приближенно уравнение - значит найти на оси х отрезок

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

program uravn;

type ur = function(x:real):real;

var a,b,x_cor:real;

rez:boolean;

{процедура решения уравнения}

procedure cor(g:ur;lgr,rgr,eps:real;var x:real; var pr:boolean);

{ входные параметры: g - имя функции, задающей вид уравнения;

lgr, rgr - границы отрезка;

eps - точность;

выходные параметры: х - середина отрезка, содержащего корень;

pr - признак, принимающий значение true,

если корень найден и - значение false,

если корня на отрезке нет}

begin

{проверка, есть ли корень на заданном отрезке}

if g(lgr) * g(rgr) > 0 then pr:=false

else

begin

pr:=true;

repeat

x:=(lgr + rgr)/2;

{выбор половины отрезка, при помощи изменения

значения левой или правой границы}

if g(lgr) * g(x) > 0 then lgr:=x

else rgr:=x;

until abs(lgr - rgr) <= eps;

x:=(lgr + rgr)/2;

end

end;{конец процедуры}

{$F+}

{функция, задающая уравнение}

function f(x:real):real;

begin

f:=sin(x) - 0.5

end;{конец функции}

{$F-}

begin

a:=0;

b:=pi/2;

{вызов процедуры решения уравнения}

cor(f,a,b,0.01,x_cor,rez);

{анализ, возвращенных функцией результатов }

if rez then writeln('x_cor = ',x_cor)

else writeln('на отрезке [',a,',',b,'] нет корня')

end.