Лекция 6 Пользовательские процедуры и функции Подпрограммы Подпрограммой
40914-functions.ppt
- Количество слайдов: 15
Лекция 6 Пользовательские процедуры и функции
Подпрограммы Подпрограммой называется особым образом оформленный фрагмент программы, имеющий собственное имя. Упоминание этого имени в тексте программы приводит к активизации подпрограммы и называется ее вызовом. Сразу после активизации подпрограммы начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу и выполняются операторы, стоящие непосредственно за оператором вызова процедуры.
Подпрограммы Для обмена информацией между основной программой и подпрограммой используется один или несколько параметров вызова. Если они есть, то они перечисляются в круглых скобках за именем процедуры и вместе с ним образуют оператор вызова подпрограммы. В языке Паскаль имеются подпрограммы двух видов – процедуры и функции. Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции, и, следовательно, вызов функции может использоваться наряду с другими операндами в выражениях.
Подпрограммы Подпрограммы представляют собой инструмент, с помощью которого любая программа может быть разбита на ряд в известной степени независимых друг от друга частей. Такое разбиение необходимо по двум причинам: Во-первых, это средство экономии памяти: каждая подпрограмма существует в программе в единственном экземпляре, в то время как обращаться к ней можно многократно из разных точек программы. Вторая причина заключается в том, что использование подпрограмм позволяет структурировать текст программы. Последовательное выделение отдельных частей программы в подпрограммы продолжается до тех пор, пока реализуемые подпрограммами алгоритмы не станут настолько простыми, чтобы их можно было легко запрограммировать.
Описание подпрограмм Пользовательские подпрограммы описываются в разделе описания процедур и функций раздела описаний языка Паскаль. Описание подпрограммы состоит из заголовка, раздела описаний и тела подпрограммы: Заголовок подпрограммы; Раздел описаний Begin //Тело подпрограммы End; Исполняемая часть любой подпрограммы заканчивается словом end с точкой с запятой.
Заголовок подпрограммы Заголовок процедуры имеет вид: Procedure имя_процедуры (список_параметров); Здесь procedure – зарезервированное слово, список_параметров – параметры вызова передаваемые в процедуру. Список параметров может отсутствовать, тогда процедура описывается как: Procedure имя_процедуры; Заголовок функции имеет вид: Function имя_функции (список_параметров):тип_результата; Здесь function - зарезервированное слово, тип_результата – тип возвращаемого функцией результата. Для функций без параметров заголовок имеет вид: Function имя_функции:тип_результата;
Раздел описаний подпрограммы Раздел описаний подпрограммы идентичен разделу описаний основной программы. В нем также присутствует пять подразделов (описание меток, констант, типов, переменных, процедур и функций), которые могут повторяться и следовать друг за другом в произвольном порядке. Все данные, описанные в разделе описаний подпрограммы могут использоваться только внутри данной подпрограммы или внутри подпрограмм данной подпрограммы. Такие данные называют локальными. Также в данной подпрограмме могут быть использоваться все данные, описанные в разделе описаний основной программы или подпрограммы более высокого уровня, чьей подпрограммой является данная подпрограмма. Такие данные называют глобальными. В подпрограмме может быть повторно определен идентификатор, раннее определенный в основной программе. В этом случае на время выполнения подпрограммы производится переопределение данного идентификатора.
Список параметров Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены имена формальных параметров и их типы, например: Procedure Pr(a: Real; b: Integer; c: Char); Как видно из примера, параметры в списке отделяются друг от друга точками с запятой. Несколько следующих подряд однотипных параметров можно объединять, например: Function F(a,b: Real): Real; Операторы тела подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы.
Список параметров В программе, вызывающей подпрограмму список параметров имеет формальный смысл. К примеру, если в списке параметров функции Function F(x:real):real; присутствует вещественный параметр x, в программе для вызова функции достаточно указание в качестве любого вещественного значения, например: var y:real; // глобальная переменная, видна во всей программе procedure qub(x:real); var q:real;// локальная переменная, видна только в процедуре begin q:=x*x*x; writeln('Qub chisla ',x:1:1,' raven ',q:1:1); end; begin //начало основной программы y:=3; qub(2.3); qub(y); readln; end.
Список параметров Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной, либо, наконец, параметром-константой. По умолчанию параметры вызова определяются как параметры-значения. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово var, а если это параметры-константы,- слово const, например: Procedure MyProcedure (var a: Real; b: Real; const c:char); Параметры-значения передаются в подпрограмму, могут изменять свое значение в процессе выполнения подпрограммы, однако после выполнения подпрограммы сохраняют первоначальные значения.
Список параметров Параметры-переменные передаются в подпрограмму, могут изменять свое значение в процессе выполнения подпрограммы, и возвращают после выполнения подпрограммы измененные значения. Параметры-константы передаются в подпрограмму, но не могут изменять свое значение в процессе выполнения подпрограммы. Параметры-переменные используются для передачи результатов работы подпрограммы вызывающей программе. В соответствии с требованиями хорошего стиля программирования, рекомендуется там, где это возможно, использовать передачу результатов через параметры-переменные, избегая использования глобальных переменных, однако не стоит злоупотреблять их использованием и в случае ненужности передачи результатов использовать параметры-значения.
Пример разных видов параметров program pr1; var a,b,c:byte; procedure Proc1(var x:byte; y:byte; const z:byte); begin x:=2*x; y:=3*y; //z:=4*z; снятие комментария приведет к ошибке writeln(x,' ',y,' ',z,' '); end; begin a:=3; b:=4; c:=5; proc1(a,b,c); writeln(a,' ',b,' ',c,' '); readln; end. В результате получим: 6 12 5 6 4 5
Результат функции Как уже говорилось выше, функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции. Тип возвращаемого результата функции в последних версиях языка Паскаль (Object Pascal, Free Pascal) может быть любым. Присваивание выводимого значения производится в конце тела функции строчкой: имя_функции:=значение: Пример - функция возведения числа в куб: function qub(x:real):real; begin qub:=x*x*x; end;
Иерархия подпрограмм Возможен доступ только к подпрограмме на один уровень ниже. Так из основной программы можно получить доступ к подпрограмме А и нельзя к подпрограмме А1. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Так, например, из подпрограммы В21 мы можем вызвать подпрограмму А, использовать имена, объявленные в основной программе, в подпрограммах В и В2, и даже обратиться к ним. При взаимодействии подпрограмм одного уровня иерархии вступает в силу основное правило Турбо Паскаля: любая подпрограмма перед ее использованием должна быть описана. Поэтому из подпрограммы В можно вызвать подпрограмму А, но из А вызвать В невозможно.
Рекурсивное описание функций Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. Пример – вычисление факториала n!=n*(n-1)!: program recur; var n:integer; function fact(n:integer):longint; begin if n=0 then fact:=1 else fact:=n*fact(n-1); end; begin write('n='); readln(n); write('n!=',fact(n)); readln; end.