Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
процед_и_функцБелов.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

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 выводит уже преобразованную последовательность на экран. Аналогичные действия выполняются для последовательностей и . В результате выполнения программы на экране будут значения , , и шесть последовательностей чисел.