Функции в языке Pascal
Создано: 22.04.2026
Функции в языке программирования Паскаль, в отличие от процедур, должны возвращать какое-либо значение в главную программу или другую подпрограмму, если они вызывались из нее. Тип данных возвращаемого значения указывается в заголовке функции после скобок и двоеточия:
function имя(параметры): тип_результата;
В разделе действий функции возвращаемое значение должно присваиваться идентификатору-имени функции.
Возвращаемое в место вызова функции значение следует присваивать переменной или использовать в каких-либо операциях.
Сравним программу с процедурой, вычисляющей среднее арифметическое, с делающей то же самое программой, но содержащей функцию:
var a, b: integer; procedure Mean(n1, n2: integer); begin writeln((n1 + n2) / 2 :0:2); end; begin read(a, b); Mean(a, b); end.
var a, b: integer; m: real; function Mean(n1, n2: integer): real; begin Mean := (n1 + n2) / 2; end; begin read(a, b); m := Mean(a, b); writeln(m:0:1); end.
Если процедура сама выводила на экран результат вычислений и ничего не возвращала в главный блок begin-end, то функция просто выполняет вычисления и передает его результат туда, откуда была вызвана. Делается это с помощью присваивания имени функции. В главной программе полученное значение присваивается переменной m. Что здесь будет происходить со значением, функцию не волнует, это не ее дело. Данные могут быть выведены на экран как в коде выше, а могут участвовать в выражениях:
if Mean(a, b) > 0 then ...
writeln(Mean(a, b):0:1);
Добавьте в функцию Mean локальную переменную, которой присваивается результат вычислений. Только после этого значение этой переменной должно присваиваться имени функции. Какого тип данных будет у переменной?
Хотя код с процедурой получился короче, с точки зрения структурного программирования в данном случае лучше использовать функцию, так как с ее помощью подпрограмма становится еще больше универсальной. Она не решает сама, что делать с результатом, за нее это сделает основная программа. Ведь не факт, что программисту надо выводить результат как есть, может быть он хочет его оформить особым образом или использовать в других вычислениях.
Рассмотрим пример более сложной функции. Вспомним, что qword — это беззнаковый целочисленный тип данных, под который выделяется больше всего памяти. В программе человеку предлагается ввести число, оно может быть достаточно длинным по количеству цифр. Функция выполняет подсчет цифр числа, то есть определяет количество разрядов в нем. Для этого число в цикле делится на 10, то есть мы постепенно избавляемся от разрядов числа. Подсчет количества делений происходит в переменной i:
var num: qword; function Digits(n: qword): byte; var i: byte; begin i := 0; while n > 0 do begin n := n div 10; i := i + 1 end; Digits := i end; begin write('Введите положительное число: '); readln(num); num := Digits(num); writeln ('Количество разрядов = ', num); end.
В конце раздела действий функции мы присваиваем имени функции финальное значение количества разрядов. Такой способ во многих случаях надежнее и яснее. Однако в современных режимах работы компиляторов с Паскаля имя функции можно использовать как переменную. Посмотрим на такую функцию:
function DSum(n: qword): word; begin DSum := 0; while n > 0 do begin DSum := DSum + n mod 10; n := n div 10; end; end;
Она возвращает сумму цифр переданного в нее числа. Для этого на каждом обороте цикла извлекается последняя цифра, которая добавляется к уже имеющейся сумме. После от последней цифры избавляются. Здесь компилятор "догадывается", что если имя функции DSum находится справа от присваивания, то надо взять ее значение, а не вызывать функцию саму из себя (такое возможно, существуют рекурсивные функции).
Чтобы избежать неоднозначности, в современном Паскале в теле функции вместо ее имени можно использовать встроенную переменную result:
function DSum(n: qword): word; begin result := 0; while n > 0 do begin result := result + n mod 10; n := n div 10; end; end;
Если компиляция выполняется командой fpc, то скорее всего для использования result потребуется включить режим Object Pascal командой {$mode objfpc} в начале кода программы.
Напишите полную программу, в которой вызывается функция, вычисляющая сумму цифр числа.
Задания для дополнительной или самостоятельной работы:
- Составьте программу, в которой есть две функции: одна подсчитывает разряды числа, а вторая — вычисляет сумму цифр числа. Вторая функция должна вызываться, только если первая вернула число больше 1-го.
- Представьте, что есть подпрограмма, которая выводит на экран переданное в нее вещественное число в формате двух знаков после запятой и раскрашивает целую и дробную части в разные цвета. Функцией или процедурой следует быть этой подпрограмме? Если в вашей системе установлен модуль
crtязыка Pascal, попробуйте разработать программу с такой подпрограммой.