Содержание
- 2. © С.В.Кухта, 2009 Структура, назначение и применение подпрограмм. Параметры и аргументы, области действия имен. Процедуры Функции
- 3. © С.В.Кухта, 2009 1. Понятие подпрограммы
- 4. © С.В.Кухта, 2009 Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи. Обычно подзадачи
- 5. © С.В.Кухта, 2009 Подпрограмма - это в первую очередь программа. Со всеми полагающимися полноценной программе атрибутами:
- 6. © С.В.Кухта, 2009 Т.о., подпрограмма - это последовательность операторов, которые определены и записаны только в одном
- 7. © С.В.Кухта, 2009 В языке Pascal имеется два вида подпрограмм: процедуры и функции. Виды подпрограмм Описывая
- 8. © С.В.Кухта, 2009 При использовании процедур или функций программа должна содержать текст процедуры или функции и
- 9. © С.В.Кухта, 2009 2. Объявление и описание подпрограммы
- 10. © С.В.Кухта, 2009 Функция – это подпрограмма, определяющая одно – единственное скалярное или ссылочное значение, используемое
- 11. © С.В.Кухта, 2009 Процедуры следует объявлять так: Объявление процедуры procedure ( ); Если объявление процедуры оторвано
- 12. © С.В.Кухта, 2009 Описание подпрограммы должно идти после ее объявления. Оно осуществляется по следующей схеме (единой
- 13. © С.В.Кухта, 2009 Если объявление подпрограммы было оторвано от ее описания, то описание начинается дополнительной строкой
- 14. © С.В.Кухта, 2009 Описания двух различных подпрограмм не могут пересекаться: каждый блок должен быть логически законченным.
- 15. © С.В.Кухта, 2009 Описание подпрограммы: пример procedure err(c:byte; s:string); var zz: byte; begin if c=0 then
- 16. © С.В.Кухта, 2009 В заголовке подпрограммы (в ее объявлении) указывается список формальных параметров переменных, которые принимают
- 17. © С.В.Кухта, 2009 В этом случае подпрограмма не получает никаких переменных "извне". Однако отсутствие параметров и,
- 18. © С.В.Кухта, 2009 О возможных способах подстановки значений в параметры ( , var, const) рассказано в
- 19. © С.В.Кухта, 2009 вызовет ошибку уже на этапе компиляции. Для того чтобы обойти это ограничение, составной
- 20. © С.В.Кухта, 2009 Основное различие между функциями и процедурами состоит в количестве возвращаемых ими значений. Любая
- 21. © С.В.Кухта, 2009 Например: Возвращаемые значения function min(a, b: integer): integer; begin if a>b then min:=
- 22. © С.В.Кухта, 2009 В отличие от функций, процедуры вообще не возвращают (явным образом) никаких значений. О
- 23. © С.В.Кухта, 2009 Любая подпрограмма может быть вызвана не только из основного тела программы, но и
- 24. © С.В.Кухта, 2009 Вызов подпрограмм
- 25. © С.В.Кухта, 2009 Вызов функции может стать равноправным участником арифметического выражения. Например: c:= min(a, a*2); if
- 26. © С.В.Кухта, 2009 Процедура же ничего не возвращает явным образом, поэтому ее вызов является отдельным оператором
- 27. © С.В.Кухта, 2009 3. Способы подстановки аргументов
- 28. © С.В.Кухта, 2009 Как уже упоминалось выше, при вызове подпрограммы подстановка значений аргументов в параметры производится
- 29. © С.В.Кухта, 2009 В списке параметров подпрограммы перед параметром-значением служебное слово отсутствует. Например, функция func3 имеет
- 30. © С.В.Кухта, 2009 В области памяти, выделяемой для работы вызываемой подпрограммы, создается переменная с именем .
- 31. © С.В.Кухта, 2009 В качестве примера рассмотрим последовательность действий, выполняемых при передаче аргументов 1+а/2, а и
- 32. © С.В.Кухта, 2009 Итак, при вызове func3(1+a/2,a,true) будут выполнены следующие действия: создать временные переменные func3.x, func3.k,
- 33. © С.В.Кухта, 2009 В списке параметров подпрограммы перед параметром-переменной ставится служебное слово var. Например, процедура proc3
- 34. © С.В.Кухта, 2009 В отличие от параметра-значения, для параметра-переменной не создается копии при вызове подпрограммы. Вместо
- 35. © С.В.Кухта, 2009 Понятно опять же и ограничение на аргументы, которые должны соответствовать параметрам-переменным: ни константа,
- 36. © С.В.Кухта, 2009 В списке параметров подпрограммы перед параметром-константой ставится служебное слово const. Например, процедура proc4
- 37. © С.В.Кухта, 2009 Во время выполнения подпрограммы соответствующая переменная считается обычной константой. Ограничением является то, что
- 38. © С.В.Кухта, 2009 В отличие от параметра-переменной, для параметра-константы создается копия при вызове подпрограммы. Параметр-константа: механизм
- 39. © С.В.Кухта, 2009 4. Области действия имен
- 40. © С.В.Кухта, 2009 Глобальные объекты - это типы данных, константы и переменные, объявленные в начале программы
- 41. © С.В.Кухта, 2009 Пример разграничения контекстов program prog; var a:byte; procedure pr1 (p:byte); var b:byte; {первый
- 42. © С.В.Кухта, 2009 Поскольку глобальные переменные видны в контекстах всех блоков, то их значение может быть
- 43. © С.В.Кухта, 2009 Вообще говоря, совпадения глобальных и локальных имен допустимы, поскольку к каждому локальному имени
- 44. © С.В.Кухта, 2009 Если имеются глобальная и локальная переменные с одинаковым именем, то изнутри подпрограммы к
- 45. © С.В.Кухта, 2009 5. Примеры решения задач
- 46. © С.В.Кухта, 2009 Вычислить s = 1 + x/1! + x2/2! + x3/3! + ... +
- 47. © С.В.Кухта, 2009 Пример 1 {функция вычисления знаменателя} function b(i:integer) :real; var j : integer; {счетчик
- 48. © С.В.Кухта, 2009 Пример 1 {основная программа} begin write('введите аргумент - x, и количество слагаемых -
- 49. © С.В.Кухта, 2009 Найти наименьший член последовательности a(n)=n2-7n+1, где n изменяется от 1 до m. Пример
- 50. © С.В.Кухта, 2009 Пример 2 begin write('Введите m - количество элементов последовательности'); readln(m); k := 1*1-7*1+1;
- 51. © С.В.Кухта, 2009 Написать набор процедур для работы с обыкновенными дробями, обеспечив их сложение, вычитание, умножение,
- 52. © С.В.Кухта, 2009 Пример 3 Var x, y, {числитель и знаменатель дроби } p, q, {числитель
- 53. © С.В.Кухта, 2009 Пример 3 { Вычисление НОД(x,y) } function nod(x, y:integer):integer; begin if (x=0) or
- 54. © С.В.Кухта, 2009 Пример 3 { Сокращение дроби } procedure sokr(var c, d:integer); var r:integer; begin
- 55. © С.В.Кухта, 2009 Пример 3 { Вычитание двух дробей } procedure raz(a, b, c, d:integer; var
- 56. © С.В.Кухта, 2009 Пример 3 { Деление двух дробей } procedure del(a, b, c, d:integer; var
- 57. © С.В.Кухта, 2009 Пример 3 write('Сумма равна '); sum(x, y, p, q, s, t); wywod(s, t);
- 58. © С.В.Кухта, 2009 6. Рекурсивные процедуры и функции
- 59. © С.В.Кухта, 2009 В общем случае рекурсией называется ситуация, когда какой-то алгоритм вызывает себя прямо или
- 60. © С.В.Кухта, 2009 Таким образом, любая рекурсия обязательно должна содержать два условия: Вычисление результата через другие
- 61. © С.В.Кухта, 2009 Чтобы понять, как будет выполняться эта программа, вспомним, что на время выполнения вспомогательного
- 62. © С.В.Кухта, 2009 Широко известно рекурсивное определение факториала: Пример 4 Решение. В первой строке определения явно
- 63. © С.В.Кухта, 2009 Пример 4 program task4; var n : integer; { исходное значение } function
- 64. © С.В.Кухта, 2009 Пусть необходимо вычислить 4! Основной алгоритм: вводится n=4, вызов fact(4). Основной алгоритм приостанавливается,
- 65. © С.В.Кухта, 2009 Написать рекурсивную функцию, вычисляющую указанное число Фибоначчи. Пример 5 Решение. Последовательность Фибоначчи задается
- 66. © С.В.Кухта, 2009 Пример 5 function fib(n:integer):integer; begin if n=0 then fib:=1 else if n=1 then
- 67. © С.В.Кухта, 2009 Написать рекурсивную процедуру, переводящую целое число из десятичной системы счисления в восьмеричную. Пример
- 69. Скачать презентацию