Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инструкции для преподавателей[1].doc
Скачиваний:
1
Добавлен:
10.11.2019
Размер:
504 Кб
Скачать
☆

Тема 5.

Объявление подпрограмм. Процедуры и функции.

Объявление подпрограмм.

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

Синтаксическая диаграмма объявления подпрограмм имеет вид:

Подпрограммы имеют имя. Как правило, подпрограммы помимо имени имеют список параметров, посредством которых данные попадают в подпрограммы и извлекаются из них в виде результатов. Список формальных параметров:

Подпрограммы объявляют в разделе объявлений, а обращаются к ним (вызывают) в разделе инструкций программы.

Синтаксическая диаграмма вызова подпрограммы имеет вид:

При объявлении подпрограммы параметры, указанные в списке называют формальными.

При вызове подпрограммы формальные параметры заменяют фактическими.

Примеры объявления и вызова подпрограмм:

function Tang( x : Real) : Real ; { вещественная функция вещественного аргумента}

Пример многократного вызова функции:

z := 0.3; y := Tang(z); d := Tang(y –2*z);

begin

Tang := sin(x)/cos(x)

end;

function Tang2( x : Real) : Real ; { вещественная функция одного аргумента }

Var S, C : Real; {локальные объявления }

begin

S := sin(x); C := cos(x); Tang2 := S/C

end;

procedure Tang1( x : Real; var rezult : Real ) ; { процедура }

Пример вызова процедуры:

z := 0.3; Tang1( z, y ); Tang1(y –2*z , d );

begin

rezult := sin(x)/cos(x)

end;

function Exp1( x, delta : Real) : Real ; {экспонента - вещественная функция двух аргументов}

Var s, a : Real; i : Integer; { локальные объявлния }

Пример вызова функции:

z := 0.3; epsilon := 1e-6;

y := Exp1(z, epsilon) + sin(z);

r := Exp1(z, 0.0001)

begin s := 1; i := 0; a := x;

while abs(a) > delta do

Begin

s := s + a; i := i + 1; a := a*x/i;

End;

Exp1 := s

end;

procedure csth( x : Real; var ch, sh, th : Real ) ; { три гиперболические функции}

Пример вызова процедуры:

z := 0.3;

csth( z, a, b, c );

csth( 0.45, a1, b1, c1 );

y := a – c1;

Var ep, em, r : Real;

begin

ep := exp(x); em := 1/ep;

ch := (ep + em)*0.5;

sh := (ep - em)*0.5;

th := sh/ch

end;

В качестве фактических параметров можно использовать переменные, константы, выражения.

Установлено правило, регламентирующие эти возможности:

  1. Если формальный параметр описан с атрибутом var, его называют параметром - переменной. Фактическим параметром в этом случае может бать только переменная.

  2. Если формальный параметр не имеет атрибута var, его называют параметром - значением. Фактическим параметром в этом случае может бать константа, выражение.

Замечание.

Стандарт языка требует, чтобы все параметры подпрограмм были типизированы (принадлежали конкретным заранее объявленным типам) однако, применять конструкторы типов в заголовке подпрограммы запрещено. Нельзя записать заголовок в таком виде:

Procedure ReadArray( N : 1..9; var A : array[1..9] of real ). {ТАК НЕЛЬЗЯ ПИСАТЬ}

Необходимо в разделе объявлений сконструировать новые типы – например:

Type Int = 1..9 ; Vector = array[Int] of Real ;

Procedure ReadArray( N : Int; var A : Vector ) ; { чтение массива}

Пример вызова процедуры:

m := 5;

ReadArray(5, B);

ReadArray(5*m, C);

Var i : Int;

Begin

For i := 1 to N do

Begin

Write(‘введи ’, i, ‘ элемент ‘); Read(A[i])

End;

End;

Параметры подпрограмм можно условно разделить на входные (посредством которых данные попадают в подпрограммы) и выходные (посредством которых извлекаются результаты).

Параметры – значения могут бать только входными параметрами.

Параметры – переменные могут бать входными и выходными.

Procedure Demo( x, y : Real; i, m : Integer; var ch, sh, th : Real; var k : Integer ) ;

  1. Параметры функции всегда входные.

  2. Выходным параметром является имя функции, оно содержит результат.

  3. В теле функции необходима инструкция присваивания имени функции некоторого значения (результата).

F unction Exp1( x, delta : Real) : Real ;

Параметрами подпрограмм могут быть подпрограммы.

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

Например:

Type Func = Function ( x, y : Real) : Real ; {процедурный тип – функция двух аргументов}

Procedure csth( x : Real; F1 : Func ; var ch, sh, th : Real ) ;

Var ep, em, r : Real;

Пример вызова процедуры:

z := 0.3;

csth( z, Exp1, a, b, c );

y := a – c1;

Begin

ep := F1(x, 1e-6); em := 1/ep;

ch := (ep + em)*0.5;

sh := (ep - em)*0.5;

th := sh/ch

End;

В этом примере формальным параметром процедуры csth является переменная F1, тип которой Func – функция двух параметров. При вызове процедуры csth в программе формальный параметр F1 заменен фактическим именем функции Exp1 (функция предназначена для вычисления экспоненты).

Задачи для классной и домашней работы (не менее 3 в классе и 3-6 дома). 6.1 – 6.49.

Итог. Контрольная работа по всем разделам темы 5.