ВВЕДЕНИЕ
В методической разработке рассмотрено использование процедур и функций в среде Турбо-Паскаль. Показаны способы описания процедур и функций, описание рекурсивных функций, использование в качестве формальных параметров подпрограмм – массивов. Приведены примеры программ с использованием процедур и функций, а также примеры программ для каждого пункта домашнего задания.
В конце методической разработки приведены варианты домашнего задания.
Прочитав текст задания, легко заметить соответствия между пунктами задания и разделами методической разработки. Так, например, пунктам 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.
Пояснения к программе: Для определения вычисляются значения рекурсивных функций
и
, а значение
вводится с клавиатуры. Вызов функций
,
в функции
и функций
,
в функции
свидетельствует о рекурсивности обращения.