- •5.160 5. Программирование с использованием подпрограмм
- •5. Программирование с использованием подпрограмм
- •Процедуры
- •Объявление процедуры
- •Заголовок процедуры
- •Обращение к процедуре
- •Список формальных параметров
- •Пример 5.1 выполнения задания
- •Задания 5.1 для самостоятельной проработки
- •Функции Объявление функции
- •Заголовок функции
- •Обращение к функции
- •Пример 5.2 выполнения задания
- •Задания 5.2 для самостоятельной проработки
- •Рекурсивные подпрограммы
- •Пример выполнения задания на составление рекурсивной подпрограммы
- •Задания 5.3 для самостоятельной проработки
- •Параметры - открытые массивы
- •Динамические массивы
- •Перегружаемые подпрограммы
- •Параметры со значениями по умолчанию
- •Примеры программ с подпрограммами
Задания 5.3 для самостоятельной проработки
Составить программу для вычисления определенного интеграла с помощью рекурсивной подпрограммы. В основной программе осуществить:ввод исходных данных - пределов интегрирования, параметраnи, в случае необходимости, параметровp(варианты 1-3, 5-8,16, 17, 19, 24-26),a(варианты 13, 14, 16-18),b(вариант 18);вычисление интеграла с помощью подпрограммы;вывод исходных данных и полученного результата с поясняющим текстом. Вычислить интеграл приближенно с точностью ε и сравнить полученные результаты. В заданиях приведены выражения для неопределенных интегралов и первообразных.
2.

3.

4. 
5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

![]()
26.

Дополнительные сведения о подпрограммах и массивах
До стих пор мы использовали для объявления формальных параметров-массивов имена ранее объявленных типов массивов. В этом случае для объявления массивов, используемых в качестве фактических параметров должны использоваться те же имена типов массивов (иначе компилятор выдаст сообщение об ошибке), что в ряде случаев может привести к нерациональному расходу оперативной памяти. Например, если требуется иметь процедуру, объединяющую элементы массивов X(n),n≤100, иY(m),m≤100, в массивеZ, то придется иметь следующие объявления имён типов и параметров процедуры
type
tMXY=array[1..100] of Real;
tMZ=array[1..200] of real;
procedure Objedinenie(const X,Y:tMXY; n,m:Integer; out Z:tZ);
var
i:Integer;
begin
for i:=1 to n do
Z[i]:=X[i];
for i:=1 to m do
Z[i+n]:=Y[i];
end;
и объявление фактических массивов, например,
var
A,B:tMXY;
C:tZ;
даже в том случае, когда реальные значения nиmзначительно меньше 100, как в следующем вызова процедуры
Objedinenie(A,B,3,5,C);
Исключить указанные ограничения и недостатки позволяет использование открытых массивов при объявлении формальных параметров и динамических массивов в блоках программ и подпрограмм.
Параметры - открытые массивы
Для передачи одномерных массивов в подпрограмму можно использовать так называемые открытые массивы. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не описывающий диапазон его индексов. Применительно к рассмотренному примеру, процедура Objedinenieпри использовании открытого массива будет иметь следующий вид:
procedure Objedinenie(const X,Y:array of Real; n,m:Integer;
out Z: array of Real);
var
i:Integer;
begin
for i:=0 to n-1 do
Z[i]:=X[i];
for i:=0 to m-1 do
Z[i+n]:=Y[i];
end;
У открытого массива минимальный индекс всегда равен нулю, что и нашло отражение в тексте подпрограммы при организации циклов.
При использовании открытых массивов подпрограмма становится более универсальной, так как соответствующими фактическими параметрами могут быть массивы любого типа с тем же базовым типом, что и базовый тип формального параметра. Однако это не приводит к уменьшению расхода памяти, если в подпрограмме обрабатывается лишь часть элементов массивов, объявленных в блоке вызывающей программы, как в последней реализации процедуры Objedinenie. Максимальный эффект в использовании памяти будет в случае, когда в блоке вызывающей программы массив будет иметь размер, равный количеству обрабатываемых данных. В этом случае можно будет сократить список параметров, так как размер обрабатываемого массива можно определить в подпрограмме с помощью стандартной функцииLength, а индекс последнего элемента – с помощью стандартной функцииHigh. Возвращаемое функциейHighзначение будет на 1 меньше размера массива, так как индексация элементов открытого массива начинается с нуля.
Таким образом, используя открытые массивы можно передавать в подпрограмму и обрабатывать внутри подпрограммы одномерные массивы с произвольным количеством элементов. Это и демонстрирует следующее объявление процедуры Objedinenieдля работы с открытыми массивами.
procedure Objedinenie(const X,Y: array of Real;
out Z: array of Real);
var
i,n:Integer;
begin
n:= High(X);
for i:=0 to n do
Z[i]:=X[i];
for i:=0 to High(Y) do
Z[i+n]:=Y[i];
end;
При обращении к подпрограмме, имеющей в качестве формального параметра открытый массив, для передачи фактического параметра можно использовать конструктор массива. Конструктор массива представляет собой список значений элементов массива, разделенных запятыми и заключенных в квадратные скобки. Например, используя конструктор массива, можно записать обращение к процедуреObjedinenieследующим образом:
Objedinenie([3.5, 2.2, 1, 8], [1.3, 3.2, 8.5, 7.4, 2.5],Z)
в результате чего элементам массива Z с индексами от 1 до 8 будут присвоены значения 3.5, 2.2, 1, 8, 1.3, 3.2, 8.5, 7.4, 2.5.
При передаче константного массива соответствующий формальный параметр в подпрограмме должен быть параметром-значением или параметром-константой, он не может быть параметром-переменной или выходным параметром-результатом.
Базовым типом открытого массива может быть сложный тип, объявленный ранее, например, тип статического массива или тип записи. Соответствующим фактическим параметром должен быть массив с тем же базовым типом.
Пример. Составить процедуру для вычисления суммы элементов матриц с произвольным количеством строк и числом столбцов, равным 3. Использовать эту процедуру для матриц A(2,3) иB(4,3). Матрицы задать начальными значениями. Для контроля за изменением индексов суммируемых элементов матриц, значениями элементов и накоплением суммы использовать в процедуре оператор вывода.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
tn=array[-1..1] of Integer;
tmn2=array[1..2] of tn;
tmn4=array[-5..-2] of tn;
procedure Pp1(mn:array of tn; out s:Integer);
var i,j:Integer;
begin
s:=0;
for i:=Low(mn) to High(mn) do
for j:=Low(tn) to High(tn) do
// или для второго измерения статического массива
// for j:=Low(mn[0]) to High(mn[0]) do
begin
s:=s+mn[i,j];
WriteLn(' i=',i,' j=',j:2,' mn[i,j]=',mn[i,j],' s=',s);
end;
end;
var
A:tmn2=((5,3,7),
(7,9,2));
B:tmn4=((2,4,1),
(7,6,2),
(0,1,8),
(3,7,5));
r:Integer;
begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
WriteLn('Вызов процедуры для обработки матрицы A');
Pp1(A,R);
WriteLn('Сумма элементов массива B = ',R);
WriteLn;
WriteLn('Вызов процедуры для обработки матрицы B');
Pp1(B,R);
WriteLn('Сумма элементов массива B = ',R);
ReadLn;
end.
Результат работы программы представлен на следующем рисунке

Следует обратить внимание на граничные значения индексов, представляющих номера строк и столбцов. Номера строк изменяются от 0 до значения, на 1 меньшего числа строк в фактическом массиве, так как формальный параметр является открытым массивом (по количеству содержащихся в нём одномерных массивов типа tn), а номера столбцов изменяются от -1, как в массивах - фактических параметрах, до 1 , так как для типа статического массива стандартные функцииLowиHighвозвращают минимальное и максимальное значения индексов из объявления типа статического массива.

