ОПИСАНИЕ ФУНКЦИИ ЗАДАННОГО ВИДА




ВВЕДЕНИЕ

 

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

В конце методической разработки приведены варианты домашнего задания.

Прочитав текст задания, легко заметить соответствия между пунктами задания и разделами методической разработки. Так, например, пунктам 1-2 задания соответствуют примеры из раздела 2 (ОПИСАНИЕ ФУНКЦИИ ЗАДАННОГО ВИДА); примеры, подобные пункту 3 задания можно найти в разделе 3 (РЕКУРСИЯ) методического пособия и т.д. Поэтому, подробно изучив примеры данного методического пособия и пояснения к ним, не возникнет сложностей при выполнении домашнего задания.

 

ПРОЦЕДУРЫИ ФУНКЦИИ

 

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

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

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

Подпрограмма, как и переменные должны быть описаны в разделе описаний программы. Описание подпрограммы состоит из заголовка и тела подпрограммы.

Заголовки процедуры и функции имеют следующий вид:

PROCEDURE <имя > [<сп.фор.парам.>];

FUNCTION <имя> [<сп.фор.парам.>]: <тип>;

где PROCEDURE, FUNCTION – ключевые слова;

<имя> - имя подпрограммы – правильный идентификатор;

<сп.фор.парам.> – список формальных параметров;

<тип> – тип возвращаемого функцией результата.

Список формальных параметров необязателен и может отсутствовать. Но если он есть, то в нем должны быть перечислены имена формальных параметров и их тип. Например:

PROCEDURE SB(A: REAL; B: INTEGER; C: CHAR);

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

FUNCTION F (A: REAL;B: REAL): REAL;

можно написать проще:

FUNCTION F (A, B: REAL): REAL;

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

Рассмотрим пример.

Пример 1. Вычислить , где , – площади треугольников и соответственно.

PROGRAM PR1;

VAR OA, OB, OC, OD, a, b, s1, s2, s: REAL;

PROCEDURE PL;

BEGIN

s:=a*b/2;

END;

BEGIN

WRITELN ('задать длины сторон треугольников');

READ (OA, OB, OD, OC);

a:=OA; b:=OB;

PL;

s1:=s;

a:=OD; b:=OC;

PL;

s2:=s;

WRITE (s1+s2:7:1);

END.

Пояснения к программе: Процедура PL позволяет вычислять площадь любого треугольника и в ней отсутствует список формальных переменных. Сначала с помощью процедуры READ задаются значения длин сторон треугольников. Переменным и присваиваются значения длин сторон треугольника и выполняется процедура PL. Переменной присваивается значение площади треугольника . Затем аналогичные действия выполняются для треугольника . С помощью процедуры WRITE осуществляется вывод результата на экран.

Любой из формальных параметров может быть либо параметром-значением, либо параметром-переменной. Если какие-либо параметры определяются как параметры-переменные, то перед ними необходимо ставить кодовое слово VAR. Например:

FUNCTION P (VAR X: REAL; Y: REAL): REAL;

Здесь параметр – параметр-переменная, а – параметр-значение.

Упростим программу из примера 1, путем ввода формальных параметров в процедуру PL.

Пример 2. Условие аналогично условию из примера 1.

PROGRAM PR2;

VAR OA, OB, OC, OD,s1, s2: REAL;

PROCEDURE PL (a, b: REAL; VAR s: REAL);

BEGIN

s:=a*b/2;

END;

BEGIN

WRITELN ('задать длины сторон треугольников');

READ (OA, OB, OD, OC);

PL (OA, OB, s1);

PL (OD, OC, s2);

WRITE (s1+s2:7:1);

END.

Пояснения к программе: В процедуре PL формальными параметрами являются – , , . При этом и являются параметрами-значениями, а – параметром-переменной. Параметры , и при первом обращении к процедуре PL, являются фактическими параметрами. Они подставляются вместо формальных параметров , , в заголовке процедуры и затем над ними осуществляются действия, описанные в теле процедуры. Полученное значение площади треугольника передается фактическому параметру . Затем процедура PL выполняется с фактическими параметрами , , и полученное значение площади треугольника передается фактическому параметру . С помощью процедуры WRITE осуществляется вывод результата на экран.

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

Рассмотрим пример 1 с использованием функции.

Пример 3. Условие аналогично условию из примера 1. Решим задачу с использованием функции.

PROGRAM PR3;

VAR OA, OB, OC, OD, s1, s2: REAL;

FUNCTION PLOS (a, b: REAL): REAL;

BEGIN

PLOS:=a*b/2;

END;

BEGIN

WRITELN ('задать длины сторон треугольников');

READ (OA, OB, OD, OC);

s1:=PLOS (OA, OB);

s2:=PLOS (OD, OC);

WRITE (s1+s2:7:1);

END.

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

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

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

Для того, чтобы понять, чем отличаются параметры-переменные от параметров-значений рассмотрим пример.

Пример 4. Зададим два целых числа и . Удвоим эти числа в процедуре UD. Причем параметр является параметром-переменной, а параметр параметром-значением. Значения параметров до и после вызова процедуры, а также результат их удвоения выведем на экран.

PROGRAM PR4;

VAR a, b: INTEGER;

PROCEDURE UD (VAR a: INTEGER; b: INTEGER);

BEGIN

a:=a+a;

b:=b+b;

WRITELN (' удвоенные: ',a:5, b:5);

END;

BEGIN

a:=5;

b:=7;

WRITELN (' исходные: ',a:5, b:5);

UD (a, b);

WRITELN(' результат: ',a:5, b:5);

END.

В результате выполнения программы на экран будет выведено:

исходные: 5 7

удвоенные: 10 14

результат: 10 7

Пояснения к программе: При выполнении процедуры UD значения и изменились, что отразилось на экране в графе «удвоенные». Однако далее в программу вернулось удвоенное значение и значение , которое было до выполнения процедуры. Т.е. удвоение второго формального параметра в процедуре UD не вызвало изменения фактической переменной , поскольку этот параметр описан в заголовке процедуры UD как параметр-значение.

 

ОПИСАНИЕ ФУНКЦИИ ЗАДАННОГО ВИДА

 

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

Рассмотрим пример.

Пример 5. Вычислить, используя подпрограмму, и , где .

PROGRAM PR5;

VAR s, t, a, b: REAL;

FUNCTION F (x, y: REAL): REAL;

BEGIN

F:=SQR(x)+SIN(y);

END;

BEGIN

WRITELN (' задать значения s, t ');

WRITE (' s = ');

READLN (s);

WRITE (' t = ');

READLN (t);

a:=F (t, SQR(s));

b:=F (t, s);

WRITELN (' a = ',a:7:1);

WRITELN (' b = ',b:7:1);

END.

Пояснения к программе: В качестве подпрограммы используется функция. Формальные параметры , являются параметрами-значениями типа REAL. Результатом функции F будет величина типа REAL.

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

 

РЕКУРСИЯ

 

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

Рассмотрим примеры.

Пример 6. Определение значений ряда Фибоначчи. В этом ряду первые два члена имеют значения 1, а каждый последующий является суммой двух предыдущих. То есть 1, 1, 2, 3, 5, 8, 13, 21, 34.....

PROGRAM PR6;

VAR n: BYTE;

FUNCTION FIB (i: BYTE): INTEGER;

BEGIN

IF i<=2 THEN FIB:=1

ELSE FIB:=FIB(i-1)+FIB(i-2)

END;

BEGIN

READ (n);

WRITELN (n,' - число ряда Фибоначчи = ',FIB(n));

END.

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

Пример 7. Описать рекурсивную функцию для определения , , где ; ; ; ; ; и вычислить .

PROGRAM PR7;

VAR Z, C: REAL;

FUNCTION P (i: INTEGER): REAL;

BEGIN

IF i=1 THEN P:=COS(3)

ELSE IF i=2 THEN P:=SIN(5)

ELSE P:=Z*P(i-1)-SQR(Z)*P(i-2);

END;

FUNCTION H (i: INTEGER): REAL;

BEGIN

CASE i OF

1: H:=SIN(3);

2: H:=COS(5);

ELSE H:=H(i-1)+H(i-2)+10

END;

END;

BEGIN

WRITE (' задать значение Z = ');

READLN (Z);

C:=Z*H(5)-P(8);

WRITELN (' C = ',C:7:1);

END.

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-07-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: