мета-данные страницы
Процедуры и функции
Процедуры
На уровне идей, всё ниже сказанное относится не только к языку Паскаль, но и к большинству других языков программирования. Исключением являются конкретные языковые конструкции (имён процедур), которые даны именно для Паскаля и некоторые механизмы реализации.
Процедура (подпрограмма) – большой (более или менее) фрагмент кода, который описан специальным образом один раз, но может вызываться из разных мест программы. Процедурами, а точнее – вызовами стандартных процедур, являются многие «популярные» команды, такие, как команды ввода/вывода (write, writeln, read и readln).
Описание и вызов процедур
Следует различать описание и вызов процедур.
Описание процедуры определяет, что именно и каким образом делает процедура, а также как её следует использовать в программе. Считается, что описание каждой процедуры (возможно - уже в виде готового программного кода) существует всегда, но может быть скрыто от разработчика. В соответствии с описанием процедуры, при порождается и встраивается в готовую программу реальный программный код, который исполняется в программе в момент вызова процедуры.
Не следует путать описание процедуры в программе с описанием процедуры в справочной системе или в сопровождающей документации. Последнее – просто текст, предназначенный для того, чтобы помочь программисту освоиться с применением процедуры.
Вызов процедуры – это применение процедуры в конкретном месте текста программы. В готовой программе ему соответствует некоторый стандартный механизм, который позволяет передать управление на код процедуры и затем вернуть его обратно коду самой программы.
Объявление процедуры – редко встречающаяся конструкция, которая провозглашает, что мы планируем использовать определённым образом некоторую процедуру, полное описание которой будет предоставлено позже в соответствующий момент. Примером является «косвенная рекурсия», когда процедура А использует в своём описании вызовы процедуры В, а процедура В, в свою очередь, использует вызовы процедуры А. Объявление процедуры указывает, что обращение к некоторому неописанному полностью объекту не является ошибкой, если производится в соответствии с этим объявлением. В готовом программном коде, соответствия объявлению нет, это механизм, который позволяет согласовать код программы с кодом процедуры
Функции
Функции – это специальный вид процедур, которые возвращают значения заранее оговоренного типа, т.е. вызовы функций могут заменять значения указанного типа в выражениях или в качестве параметров других процедур и функций. Например:
y:=sin(x);                     
m:= round( i/j + frac(q) );    
writeln(round(y));             
Их описание и применение несколько отличается от описания и применения просто «чистых» процедур.
Во многих современных версиях языков программирования, функции могут использоваться как процедуры. Например:
while keypressed do readkey;      
Обратное - неверно. Неверный пример:
x:= z+read(z); 
Процедуры можно разделять по нескольким критериям. В данном случае, говоря о стандартных процедурах, процедуры неявно различаются по месту расположения кода. А именно: 
  * стандартные добавляются в программу автоматически, пример – write; 
  * стандартные библиотечные  требуют указания в программе на необходимость подключения дополнительных системных библиотек (пример – keypressed, readkey, delay из CRT); 
  * дополнительные библиотечные  требуют установки в системе и подключения в коде программы дополнительных библиотек (пример – circle, setfillstyle, getcolor из graph или из нашей библиотеки oglgraph);
  * собственные библиотечные  требуют создания, установки в системе и подключения в коде программы дополнительных библиотек; 
  * локальные описываются в программе.
Библиотеки могут 
  * поставляться изначально как стандартные, в составе инструментов разработчика вместе с компилятором, отладчиком и т.д.
  * создаваться программистом или его коллегами для себя;  
  * создаваться и распространяться некоторой третьей стороной.  
Иначе говоря, Вы можете описать самостоятельно или получить со стороны специальным образом оформленный  маленький алгоритм (подпрограмму), решающий частную задачу, и включить его качестве простого действия в свой более сложный алгоритм (программу).  При этом, описание можно сделать таким образом, что ваш алгоритм будет применим к более или менее широкому набору объектов, с которыми работает общий алгоритм.
Пример, на примере сортировки массива по возрастанию значений с помощью сортировки выбором. 
Идея сортировки в следующем:
Массив рассматриваем как состоящий  в каждый момент работы программы из двух частей - сортированной и несортированной. Сами части будут меняться!
В начале считаем, что несортированная часть занимает весь массив, а сортированная - всё остальное,  
1) Находим максимальный во всём массиве элемент.
В рассматриваемой части массива
<code pascal | Крайне общий алгоритм программы сортировки массива>
uses allForSorting;          Библиотека «Всё для сортировки». 
                          // Скорее всего - не существует в реальности.
                          // Содержит ВСЁ (происхождение чего мы не хотим объяснять)
const
n=1000; // Размер массива. Выбран по принципу - "а почему бы и нет?"
type
ArrayType = array[1..N] of integer;
                          // Описание типа ("устройства") сортируемого массива
var
SortedA : ArrayType; // Объявление самого сортируемого массива
begin
FillArray (SortedA); // Заполняем наш массив начальными значениями PrintArray(SortedA); // Показываем, что получилось. SortArray (SortedA); // Сортируем наш массив "таинственным способом". PrintArray(SortedA); // Показываем, что получилось
end. </code>
Важно то, что с помощью механизма передачи параметров, подобный фрагмент кода способен выполнять одни и те же действия с разными объектами, т.е. значениями(константами), переменными и выражениями. Например, вычислять кубический корень из заданного числа, сортировать произвольный массив с элементами указанного типа, отбрасывать ненужные пробелы в указанной строке и т.д.
Описание процедуры – это общее описание алгоритма, реализующегося в процедуре, средствами используемого языка программирования. Многие системы программирования позволяют получить программу, собранную из фрагментов, написанных на нескольких языках программирования. Например - с ассемблерными вставками, т.е. фактически - с непосредственным использованием команд процессора.
В программе может содержатся предварительное описание или объявление процедуры, которое описывает, как должна вызываться процедура, т.е. указывает ее имя и порядок подстановки параметров, но не описывает алгоритма процедуры. В частности, оно используется для присоединения программ, написанных на ассемблере.
Вызов процедуры – применение ранее описанного алгоритма к конкретно указанным объектам уже при работе программы.
При описании алгоритма процедуры, используются формальные параметры, которые не являются реальными объектами, доступными для дальнейшего использования в программе. При вызове процедуры, происходит подстановка
Функция – специальным образом оформленная процедура, которая возвращает значение определённого типа. Это означает, что вызов функции приводит в вычислению значения данного типа, которое может может быть использовано. Вызов функции одновременно является выражением и может быть использован везде, где может быть использовано другое выражение, вычисляющее значение данного типа, т.е. в качестве присваиваемого значения, в более сложном выражении или при подстановке параметра при вызове другой процедуры или функции.
Например, алгоритм сортировки выбором (по возрастанию) требует нахождения максимального элемента на различных частях массива, а также.
Большинство языков программирования позволяют оформлять многократно используемый код в виде процедур и/или функций. Целью написания процедур может быть:
минимизация написания повторяющегося кода - когда программисту приходится несколько раз разрабатывать и описывать идентичные последовательности команд, решающих одинаковые задачи, подразумеваются излишние затраты времени разработчика; минимизация включения повторяющегося кода - когда в программу включается в различных местах программы множество одинаковых или практически одинаковых фрагментов;
стандартизация кода