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

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

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

Объявление процедурного типа в разделе type похоже на заголовок подпрограммы: после имени типа пишется слово procedure или function, за которым в круглых скобках записывается список формальных параметров с указанием типа; для функции после списка формальных параметров указывается через двоеточие тип функции. В отличие от заголовка подпрограммы после слов procedure и function не указывается имя подпрограммы. В разделе переменных var объявляются переменные процедурного типа.

Формат записи:

1. type

<имя типа> = procedure(<список форм. параметров>);

<имя типа> = function(<список форм. парам.>):<тип функции>;

var

<имя переменной> : <имя типа>;

2. var

<имя переменной> : procedure (<список форм. парам>);

<имя перем.> : function (<список форм.парам.>):<тип функции>;

Например,

type

Proc = procedure(var A, B : real; d : integer);

Func = function(X, Y : real) : real;

var

P1, P2 : Proc;

F : Func;

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

Следующий пример иллюстрирует использование переменных процедурного типа.

Задача 1.

program DELEN;

type

Proc = procedure(var X, Y : integer);

Func = function(X, Y : integer) : real;

Var P : Proc; F : Func; A, B : integer;

{$F+}

procedure Swap(var X1, Y1 :integer);

var Z:integer;

begin

if X1 < Y1 then begin Z := X1; X1 := Y1; Y1 := Z end

end;

function Del(X2, Y2 :integer) : real;

begin Del := X2/Y2 end;

function Minus(X3, Y3 : integer) : real;

begin Minus := X3–Y3 end;

{$F–}

{основная программа}

begin

Write('Введите два целых числа'); Readln(A, B);

P:= Swap; P(A, B); F:= Del;

Writeln('Частное от деления большего числа на меньшее ');

Writeln(F (A, B):5:2);

F:= Minus;

Writeln('Разность между большим и меньшим числами');

Writeln(F(A, B):5:2)

end.

Замечание 1. Процедурная переменная и подпрограмма должны быть совместимы для присваивания т.е. должны иметь одинаковое число формальных параметров, совпадающих по типам; функции, кроме того, должны иметь идентичный тип. Например, процедурная переменная P совместима с подпрограммой Swap, так как количество и тип формальных параметров в процедурной переменной P типа Proc совпадает с количеством и типом формальных параметров описанных в заголовке подпрограммы.

Замечание 2. Существует ряд правил использования подпрограмм в качестве процедурной переменной:

– подпрограммы должны компилироваться с ключом {$F+} или иметь директиву far для получения полного адреса подпрограмм, эта директива записывается в конце заголовка указанных подпрограмм после точки с запятой и после нее ставится точка с запятой;

(procedure Swap(var X1, Y1: integer); far;)

Подпрограммы не должны быть стандартными процедурами и функ циями; они не должны объявляться внутри других процедур и функций.

Замечание 3. После присвоения процедурной переменной имени подпрограммы имеется возможность вызывать эти подпрограммы как непосредственно, так и с помощью указания процедурной переменной. Так, следующие два вызова считаются эквивалентными P(A, B) и Swap(A, B).

При описании процедур и функций параметрами могут быть процедурные переменные, т.е. передаваемыми параметрами могут быть параметр – процедура или параметр – функция. Фактически этот параметр является параметром – значением, т.к. записывается без зарезервированного слова var. В качестве фактического параметра в этом случае используется соответствующая процедура или функция, имеющая необходимое количество параметров требуемых типов.

Для параметров – процедур и параметров – функций существуют те же правила, что и для других переменных процедурного типа: подпрограммы должны компилироваться с директивой far или с ключом {$F+}, не должны быть стандартными подпрограммами, не должны объявляться внутри подпрограмм.

Задача 2. Написать программу, которая печатает таблицу значений функции f(x)=tg(x)+1 в интервале изменения аргумента x от a до b с шагом h.

program TAB_FUNC;

type Func = Function(X: real):real;

Var a, b, h: real;

Function F1(X:real) : real; far;

begin F1:= sin(X)/cos(X)+1 end;

procedure Printfunc(X,b,h:real; F: Func);

begin While X<=b do

begin

Writeln( X:5:3, F(X):8:3);

X:=X+h end

end;

begin

Write('Введите интервал и шаг функции: '); Readln(a,b,h);

Printfunc(a,b,h,F1)

end.

Задачи для самостоятельного решения

1. В четырехугольнике ABCD АВ = х, ВС = у, CD = z, AD = t, AC = d. Составьте алгоритм вычисления площади четырехугольника, используя подпрограмму ГЕРОН (а, b, с, S). Вычисления площади треугольника по формуле Герона:

S= ,где р=(a+b+c)/2

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

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

4. Постройте алгоритм нахождения наименьшего общего кратного (НОК) двух натуральных чисел, используя алгоритм нахождения наибольшего общего делителя как подпрограмму. Исполните алгоритм для аргументов 14 и 26, 21 и 84. Указание. Для любых натуральных чисел а, b, с справедливо тождество а *b= НОД (а, b) *НОК (а, b).

5.Оформить в виде процедур задачу обработки числового массива: найти минимальный, максимальный и их номера в массиве; определение среднего арифметического.

6. Составить алгоритм поиска наибольшего элемента в линейном массиве из n чисел Х(n), используя алгоритм нахождения большего из двух как подпрограмму.

7. Даны две линейные таблицы КЛАСС-1 [1:25] и КЛАСС-2 [1:30], содержащие оценки учащихся двух параллельных классов по математике. Требуется определить количество хороших и отличных оценок в каждом классе. Для этого используйте подпрограмму.

8. Составьте программу вычисления функции z=(k1+k2)/(s1+s2), где s1 и k1 сумма и количество положительных элементов массива А(12), s2 и k2 сумма и количество положительных элементов масcива B(12). Для вычисления суммы и количества элементов используйте подпрограммы.

9. В массивах А и В, состоящих из 10 элементов замените все элементы, следующие за членом с наибольшим значением на 0.5. Используйте подпрограмму для нахождения максимального члена массива.

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

11. В целочисленном массиве А определить количество чисел Фибоначчи. Определение чисел Фибоначчи оформить в подпрограмме.

12. Найти все натуральные числа, не превосходящие n которые делятся на сумму своих цифр. Определение таких чисел оформить в подпрограмме.

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