Разница между процедурой и функцией в программировании
Пользователи, далекие от программирования в принципе, сталкиваются с понятиями функции и процедуры редко, и ассоциируются они с чем-то математическим и бюрократическо-медицинским. В программировании же этими понятиями оперирует множество языков, правда, даже специалисты порой не могут четко осознать разницу между функцией и процедурой. Как с тем сусликом: он есть, но его никто не видит. Посмотрим, настолько ли невидимы отличия.
Определение
Функция в программировании — подпрограмма, вызываемая из других подпрограмм необходимое число раз.
Процедура — поименованная часть программы (подпрограмма), многократно вызываемая из последующих частей программы необходимое число раз.
Сравнение
Основная разница между функцией и процедурой — в возвращаемом результате. По сути, и функции, и процедуры представляют собой логически неделимые блоки, из которых складывается код программы. Функция возвращает значение, процедура в большинстве языков программирования — нет, либо (в Си, например) возвращает пустое значение. В последнем случае (в Си) процедура считается подчиненной разновидностью функции.

Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.
9. Процедуры и функции
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Отличие функции от процедуры заключается в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Обобщенно процедуры и функции будем называть подпрограммами.
Верхняя строка процедуры называется заголовком процедуры и состоит из служебного слова procedure, названия функции, списка параметров и точки с запятой. Следом идут операторные скобки begin-end, называемые телом процедуры. После end обязательно ставится точка с запятой. Процедура может не иметь параметров, в этом случае ставить скобки необязательно.
Заголовок функции отличается тем, что вместо слова procedure пишется function, а после списка параметров или имени (если нет параметров) идет двоеточие и тип результата, который возвращает функция. Вызов встроенной или пользовательской подпрограммы имеет следующий синтаксис:
Если подпрограмма не имеет параметров, то скобки необязательны. Имя подпрограммы должно быть уникальным в пределах модуля и других подключаемых модулей и не должно совпадать с именами встроенных.
В подпрограмме могут быть объявлены локальные переменные, видимые только в теле подпрограммы. Раздел объявления переменных находится между заголовком и телом. Пример:
Имена локальных переменных могут совпадать с именами глобальных переменных. В этом случае использоваться будет локальная переменная.
Параметры процедур и функций
Синтаксис описания параметров разберем на примере:
Параметры в заголовке подпрограммы называются формальными параметрами. Параметры, передаваемые при вызове подпрограммы, называются фактическими.
Параметры одного типа отделяются запятой, после двоеточия указывается тип параметра. Параметры разных типов отделяются точкой с запятой. Список и тип формальных и фактических параметров должен совпадать. За этим следит компилятор.
Параметры, передаваемые в подпрограмму, делятся на:
Пример вызова функции:
В случае с параметрами-значениями и параметрами-константами тип формального и фактического параметра может быть совместимым. Если формальный определен как целое число, то фактический параметр может быть любого целого типа. Только нужно следить, чтобы формальный параметр мог «вместить» фактический параметр. В данном примере тип формального параметра Y «вмещает» переменную a, т. к. область допустимых значений больше. Целый формальный параметр несовместим с другими типами, в том числе с вещественными. А вот вещественный формальный параметр, совместим с целыми и вещественными.
В случае с параметрами-переменными требуется строгое соответствие типов, даже если формальный и фактический параметры являются родственными, например целыми. Т. е. если формальный параметр имеет тип Integer, то фактический параметр тоже должен иметь тип Integer, а не Byte, Word и т. д. Это касается и классов, даже если фактический параметр является потомком класса формального параметра.
Передача массивов в качестве параметров
Для передачи массива в подпрограмму должен быть определен пользовательский тип:
Фактический параметр должен быть переменной массива.
Компилятор не сообщит об ошибке, если объявить параметр-массив таким образом:
Однако во время выполнения вы получите ошибку «type mismatch».
В Паскале есть так называемые открытые массивы. Синтаксис формального параметра открытого массива следующий:
Открытый массив представляет собой одномерный массив. Нижняя граница массива всегда равна 0, даже если нижняя граница передаваемого массива отличается. Соответственно, верхняя граница равна длине массива минус 1. Для определения границ массива можно воспользоваться функциями Low и High. Пример:
Как видно из примера фактическим параметром может быть не только переменная, но и конструктор массива, который представляет собой перечисление элементов через запятую, заключенных в квадратные скобки.
В движке не поддерживаются вариантные открытые массивы, хотя некоторые встроенные подпрограммы имеют параметры такого типа (например, Format).
Возврат значения функции
Функция имеет предопределенную переменную Result, в которую сохраняется возвращаемое значение. Пример:
Выход из подпрограммы
В любой момент можно выйти из подпрограммы. Для этого предусмотрен оператор Exit.
PASCAL. В чем отличие процедур от функций. И любую ли задачу можно решить с помощью функции?
Функция – это подпрограмма, которую вызывают, чтобы выполнить какие-то расчеты или проверки. Когда она завершает работу, то возвращает управление вызывающей программе и передает ей результат расчета.
Процедура – это тоже подпрограмма. Ее тоже вызывают, чтобы выполнить какие-то действия, но от нее не требуется возвращать основной программе какие-либо значения.
Формат описания процедуры имеет вид:
procedure имя процедуры (формальные параметры) ;
раздел описаний процедуры
begin
исполняемая часть процедуры
Формат описания функции:
function имя функции (формальные параметры): тип результата;
раздел описаний функции
begin
исполняемая часть функции
Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.
var x,y,m,n: integer;
procedure MaxNumber(a,b: integer; var max: integer);
begin
if a>b then max:=a else max:=b;
end;
begin
write(‘Введите x,y ‘);
readln(x,y);
MaxNumber(x,y,m);
MaxNumber(2,x+y,n);
writeln(‘m=’,m,’n=’,n);
end.
Аналогичную задачу, но уже с использованием функций, можно решить так:
var x,y,m,n: integer;
function MaxNumber(a,b: integer): integer;
var max: integer;
begin
if a>b then max:=a else max:=b;
MaxNumber := max;
end;
begin
write(‘Введите x,y ‘);
readln(x,y);
m := MaxNumber(x,y);
n := MaxNumber(2,x+y);
writeln(‘m=’,m,’n=’,n);
end.
Забавный ответ у ivantrs. Немножко его скорректировав, можно написать:
«Процедура что-то делает и ничего не возвращает.. .
а функция ничего не делает и что-то возвращает. «:)
На самом деле фукнция напоминает собой вычисление некоего математического выражения в математике. Когда в математике вы вычисляете какое-то выражение, то вы получаете конкретное число — результат вычисления. Также и функция на Паскале: она возвращает некоторое значение заданного вами типа после выполнения предложений, записанных в ее теле.
Посмотрите сходства между функцией в математике и с вызовом функции на Паскале:
в математике y = sin( x )
на Паскале y = sin( x )
Как видите, полное сходство! То есть фукнцмя на Паскале возвращает некоторое значение. Другое дело, чтобы получить это значение, вы должны в теле функции иметь некоторые операторы языка Паскаля, которые в соответсвтии с алгоритмом будут вычислять нужное значение.
То есть вызов функции на Паскале вы можете вставлять в любое выражение, так как результатом работы функции будет некоторое значение.
Процедуры не возвращают значение.
Главная разница между ними также состоит в том, что если я не ошибаюсь, параметры в фукнцию при вызове передаются по значениею. Это значит, что в функцию передаются копии заданных вами аргументов при вызове.
А параметры в процедуру передаются по ссылке. Это значит, что если в процедуре вы меняете значение параметра, то тем самым вы меняете исходное значение в программе.