Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Подпрограммы.doc
Скачиваний:
28
Добавлен:
09.02.2015
Размер:
369 Кб
Скачать
☆

Задания 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, то придется иметь следующие объявления имён типов и параметров процедуры

  1. type

  2. tMXY=array[1..100] of Real;

  3. tMZ=array[1..200] of real;

  4. procedure Objedinenie(const X,Y:tMXY; n,m:Integer; out Z:tZ);

  5. var

  6. i:Integer;

  7. begin

  8. for i:=1 to n do

  9. Z[i]:=X[i];

  10. for i:=1 to m do

  11. Z[i+n]:=Y[i];

end;

и объявление фактических массивов, например,

  1. var

  2. A,B:tMXY;

  3. C:tZ;

даже в том случае, когда реальные значения nиmзначительно меньше 100, как в следующем вызова процедуры

  1. Objedinenie(A,B,3,5,C);

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

Параметры - открытые массивы

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

  1. procedure Objedinenie(const X,Y:array of Real; n,m:Integer;

  2. out Z: array of Real);

  3. var

  4. i:Integer;

  5. begin

  6. for i:=0 to n-1 do

  7. Z[i]:=X[i];

  8. for i:=0 to m-1 do

  9. Z[i+n]:=Y[i];

end;

У открытого массива минимальный индекс всегда равен нулю, что и нашло отражение в тексте подпрограммы при организации циклов.

При использовании открытых массивов подпрограмма становится более универсальной, так как соответствующими фактическими параметрами могут быть массивы любого типа с тем же базовым типом, что и базовый тип формального параметра. Однако это не приводит к уменьшению расхода памяти, если в подпрограмме обрабатывается лишь часть элементов массивов, объявленных в блоке вызывающей программы, как в последней реализации процедуры Objedinenie. Максимальный эффект в использовании памяти будет в случае, когда в блоке вызывающей программы массив будет иметь размер, равный количеству обрабатываемых данных. В этом случае можно будет сократить список параметров, так как размер обрабатываемого массива можно определить в подпрограмме с помощью стандартной функцииLength, а индекс последнего элемента – с помощью стандартной функцииHigh. Возвращаемое функциейHighзначение будет на 1 меньше размера массива, так как индексация элементов открытого массива начинается с нуля.

Таким образом, используя открытые массивы можно передавать в подпрограмму и обрабатывать внутри подпрограммы одномерные массивы с произвольным количеством элементов. Это и демонстрирует следующее объявление процедуры Objedinenieдля работы с открытыми массивами.

  1. procedure Objedinenie(const X,Y: array of Real;

  2. out Z: array of Real);

  3. var

  4. i,n:Integer;

  5. begin

  6. n:= High(X);

  7. for i:=0 to n do

  8. Z[i]:=X[i];

  9. for i:=0 to High(Y) do

  10. Z[i+n]:=Y[i];

end;

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

  1. 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). Матрицы задать начальными значениями. Для контроля за изменением индексов суммируемых элементов матриц, значениями элементов и накоплением суммы использовать в процедуре оператор вывода.

  1. program Project2;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. type

  6. tn=array[-1..1] of Integer;

  7. tmn2=array[1..2] of tn;

  8. tmn4=array[-5..-2] of tn;

  9. procedure Pp1(mn:array of tn; out s:Integer);

  10. var i,j:Integer;

  11. begin

  12. s:=0;

  13. for i:=Low(mn) to High(mn) do

  14. for j:=Low(tn) to High(tn) do

  15. // или для второго измерения статического массива

  16. // for j:=Low(mn[0]) to High(mn[0]) do

  17. begin

  18. s:=s+mn[i,j];

  19. WriteLn(' i=',i,' j=',j:2,' mn[i,j]=',mn[i,j],' s=',s);

  20. end;

  21. end;

  22. var

  23. A:tmn2=((5,3,7),

  24. (7,9,2));

  25. B:tmn4=((2,4,1),

  26. (7,6,2),

  27. (0,1,8),

  28. (3,7,5));

  29. r:Integer;

  30. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  31. WriteLn('Вызов процедуры для обработки матрицы A');

  32. Pp1(A,R);

  33. WriteLn('Сумма элементов массива B = ',R);

  34. WriteLn;

  35. WriteLn('Вызов процедуры для обработки матрицы B');

  36. Pp1(B,R);

  37. WriteLn('Сумма элементов массива B = ',R);

  38. ReadLn;

  39. end.

Результат работы программы представлен на следующем рисунке

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]