2. Описание функции заданного вида
В первом пункте домашнего задания необходимо описать функцию заданного вида и по соответствующим формулам вычислить значения и .
Рассмотрим пример.
Пример 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.
В самой программе,
при вычислении значения
,
в качестве фактических параметров
используются
,
а при вычислении значения
в качестве фактических параметров
используются
.
3. Рекурсия
Рекурсия – это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе.
Рассмотрим примеры.
Пример 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.
Пояснения к
программе:
Для определения
вычисляются значения рекурсивных
функций
и
,
а значение
вводится с клавиатуры. Вызов функций
,
в функции
и функций
,
в функции
свидетельствует о рекурсивности
обращения.
4. Использование параметров-массивов в подпрограммах
Существенным отличием объявления переменных в списке формальных параметров подпрограммы от объявления их в разделе описания переменных является то, что типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому нельзя объявлять следующую процедуру:
PROCEDURE S ( A : ARRAY [1..10] OF REAL );
так, как в списке формальных параметров фактически объявляется тип-диапазон, указывающий границы индексов массива.
Если в подпрограмме передается массив, то необходимо первоначально описать его тип:
TYPE AT = ARRAY [1..10] OF REAL;
PROCEDURE S ( A : AT );
Рассмотрим пример, который соответствует пункту 4 домашнего задания.
Пример 8.
Задать три последовательности случайных
чисел
,
,
,
где
,
,
.
Все числа последовательности
кратные 2 умножить на
,
числа
кратные 3 умножить на
,
числа
кратные 5 умножить на
.
На экран вывести заданные и преобразованные последовательности , , .
PROGRAM PR8;
TYPE Mas=ARRAY [1..12] OF REAL;
VAR N, M, L : Mas;
i : BYTE;
A, B, C : REAL;
PROCEDURE ZAD (t : BYTE; VAR Mt : Mas);
BEGIN
RANDOMIZE;
FOR i:=1 TO t DO
Mt[i]:=RANDOM (20);
END;
PROCEDURE VIVOD (t : BYTE; Mt : Mas);
BEGIN
FOR i:=1 TO t DO
WRITE (Mt[i]:5:0);
WRITELN;
END;
PROCEDURE PREOB (t, p : BYTE; s : REAL; VAR Mt : Mas);
BEGIN
FOR i:=1 TO t DO
IF TRUNC(Mt[i]) MOD p=0 THEN Mt[i]:=s*Mt[i];
END;
BEGIN
WRITELN ('задать значения A, B, C ');
READ (A, B, C);
ZAD (12, N);
WRITELN ('исходная послед. N ');
VIVOD (12, N);
PREOB (12, 2, A, N);
WRITELN ('преобразованная послед. N ');
VIVOD (12, N);
ZAD (10, M);
WRITELN ('исходная послед. M ');
VIVOD (10, M);
PREOB (10, 3, B, M);
WRITELN ('преобразованная послед. M ');
VIVOD (10, M);
ZAD (8, L);
WRITELN ('исходная послед. L ');
VIVOD (8, L);
PREOB (8, 5, C, L);
WRITELN ('преобразованная послед. L ');
VIVOD (8, L);
END.
В результате выполнения программы на экран будет выведено:
задать значения , , .
2 3 4
исходная послед.
3 12 6 9 4 0 13 17 14 10 7 8
преобразованная послед.
3 24 12 9 8 0 13 17 28 20 7 16
исходная послед.
5 10 9 6 3 11 12 7 15 8
преобразованная послед.
5 10 27 18 9 11 36 7 45 8
исходная послед.
9 11 5 7 2 13 15 18
преобразованная послед.
9 11 20 7 2 13 60 18
Пояснения к программе: В данной программе задается тип Mas, который соответствует массиву 12 чисел типа REAL. Это сделано для того, чтобы использовать этот тип в качестве формальных параметров при описании процедур. Поскольку наибольшее количество элементов в последовательностях , , равно 12, то и тип Mas содержит 12 элементов.
Процедура ZAD
используется для получения последовательности
случайных чисел, которые заносятся в
массив Mt. Используемая стандартная
процедура RANDOMIZE инициализирует датчик
псевдослучайных чисел, а с помощью
стандартной функции RANDOM образуются
случайные числа в диапазоне 0-20. Формальными
параметрами процедуры ZAD являются:
– количество элементов в последовательностях;
Mt – имя массива, в который заносятся
элементы последовательностей.
Процедура VIVOD осуществляет вывод в строку – элементов массива Mt. Формальные параметры процедуры VIVOD аналогичны формальным параметрам процедуры ZAD.
Процедура PREOB
производит преобразование
– элементов массива Mt по следующему
правилу: те элементы массива Mt, которые
кратны значению
умножаются на значение
.
Кратность элементов массива Mt проверяется
с помощью операции MOD, которая позволяет
получить остаток от целочисленного
деления элемента Mt[i] на число
.
Если этот остаток равен 0, то элемент
Mt[i] кратен числу
.
В процессе выполнения
самой программы сначала задаются
значения
,
,
.
В результате выполнения процедуры ZAD
получаем последовательность случайных
чисел
,
.
С помощью процедуры VIVOD эта последовательность
выводится на экран. Процедура PREOB
осуществляет преобразование
последовательности
по заданному правилу. Процедура VIVOD
выводит уже преобразованную
последовательность
на экран. Аналогичные действия выполняются
для последовательностей
и
.
В результате выполнения программы на
экране будут значения
,
,
и шесть последовательностей чисел.
