Страница |1 Процедуры и функции в Паскаль. Подпрограммы. В Паскале используются подпрограммы функции (FUNCTION). двух видов: процедуры (PROCEDURE) и Процедуры и функции аналогичны программам в миниатюре и имеют общее название – подпрограммы (это часть программы, описывающая некоторый алгоритм, который можно многократно использовать, обращаясь к нему из различных точек программы). Подпрограмма это разделение сложной задачи на подзадачи. Такой принцип дефрагментации программы называется нисходящим программированием и соответствует принципам структурного программирования. Повышается надёжность программы в силу уменьшения возможных ошибок. Использование подпрограмм сокращает текст программы, увеличивает гибкость и функциональность (библиотеки. Использование в многомодульных программных реализациях). Существуют встроенные процедуры и функции - они являются частью языка и хранятся в так называемых библиотеках языка. Это написанные разработчиками Pascal (или одной из интегрированных сред разработки программного обеспечения на базе языка, например, Delphi) подпрограммы для наиболее часто востребованных операций, например, вычисление синуса или прорисовка окружности. Библиотечные процедуры и функции вызываются по имени без предварительного описания. Например, функции – abs, sqrt, ln.. или процедуры – readln, write… Программисту, однако, при решении своих специфических задач, не хватает тех функций, которые предоставляются библиотекой Pascal. В этом случае программист разрабатывает собственные процедуры и функции. Напомним, что программа состоит из двух основных разделов: раздел описаний и раздел операторов. При этом раздел описаний объединяет пять подразделов. РАЗДЕЛ ОПИСАНИЙ: 1. 2. 3. 4. 5. раздел меток (label) раздел констант (const) раздел типов (type) раздел переменных (var) раздел процедур и функций. Как видим, в программе описание процедур и функций располагаются в разделе описаний между разделами переменных и операторов. Подпрограмма оформляется подобно основной программе, т.е. состоит из заголовка, раздела описаний, раздела операторов. Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме. Имена, представленные в разделе описаний подпрограммы, называют локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы. Глобальные и локальные имена размещаются в разных областях оперативной памяти (ОП) и существуют только на время работы соответствующего программного блока. РАЗДЕЛ ОПЕРАТОРОВ (действий). После вызова подпрограммы из программы выполнение программы приостанавливается и управление передается в подпрограмму, после завершения подпрограммы управление возвращается в программу. Страница |2 Оформление процедур. PROCEDURE имя (список формальных параметров: тип); раздел описаний; BEGIN раздел операторов; END; Оформление функций. Функция - это подпрограмма, результат выполнения которой есть единственное скалярное значение, присваемое имени этой функции. FUNCTION имя(список формальных параметров: тип): тип; раздел описаний; BEGIN раздел операторов; END; Вызыв процедур и функций одинаков: Имя (фактические параметры); Однако напомним, что вызов функции можно делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например sin(x). Фактические и формальные параметры (аргументы). С помощью фактических и формальных параметров данные передаются из программы в процедуру и из процедуры в программу. В качестве формальных параметров могут быть только переменные с указанием типа, а в качестве фактических параметров могут быть константы, переменные, выражения без указания их типа. Формальные параметры используются при описании подпрограмм, а фактические параметры используются при вызове подпрограммы. Списки параметров нужны для организации интерфейса (взаимодействия) между программой и подпрограммой, т.е. обмена информацией между вызывающей программой и вызываемой подпрограммой. Параметры делятся также на входные, выходные, входные и выходные одновременно. Процедуры и функции. Отличия. Функция отличается от процедуры двумя особенностями: всегда вычисляет некоторое значение, возвращаемое в качестве результата функции; вызывается в выражениях. Страница |3 Процедура имеет свои особенности: вызов процедуры является оператором языка; имеет входные и выходные аргументы (параметры, что тоже самое), причем выходных аргументов - ее результатов - может быть достаточно много. Отличие процедуры от функции состоит в том, что при вызове функция через свое имя возвращает в вызывающий блок значение, полученное в процессе ее выполнения, а процедура такого значения не возвращает. Имя процедуре требуется только для ее вызова, а имя функции необходимо как для ее вызова, так и для возвращения результата работы подпрограммы-функции (это фактически указатель на переменную, хранящую результат работы функции). Примеры. Пример 1. Использование процедуры с параметрами-переменными. program Zerkalo; var a,b: integer; procedure obmen (var x,y: integer); var Mid: integer; begin Mid:=x; x:=y; y:= Mid; end; begin a:=1; b:=2; writeln(a,' ',b); 12 obmen(a,b); writeln(a,' ',b); 21 obmen(a,b); writeln(a,' ',b); end. 12 Пример 2. Использование процедуры без параметров, необходимо вывести 15 звёздочек в строку. program StarLine; procedure StarLine; var i: integer; begin for i:=1 to 15 do write('*'); end; begin StarLine; end. *************** Страница |4 Пример 3. Программа, которая демонстрирует различия между процедурами и функциями на примере сложения двух целых чисел. program procedure_and_function; var a,b,sum_numbers: integer; procedure summing_up( var sum: integer; a, b: integer); begin sum:= a + b; end; function sum(a, b: integer):integer; begin sum:= a + b; end; begin a := 12; {Установка начальных значений} b := 15; {переменных "а" и "b"} *************** summing_up(sum_numbers, a, b); writeln('Cyмма чисел равна:', sum_numbers); {Суммирование чисел с использованием процедуры} sum_numbers:=sum(a,b); writeln('Cyммa чисел равна:',sum_numbers); {Суммирование чисел с использованием функции} writeln('Cyммa чисел равна: ', sum(a, b) ); end. {При обращение к функции можно непосредственно использовать оператор вывода writeln или write}