Функции в языке 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. Составьте программу, в которой есть две функции: одна подсчитывает разряды числа, а вторая — вычисляет сумму цифр числа. Вторая функция должна вызываться, только если первая вернула число больше 1-го.
  2. Представьте, что есть подпрограмма, которая выводит на экран переданное в нее вещественное число в формате двух знаков после запятой и раскрашивает целую и дробную части в разные цвета. Функцией или процедурой следует быть этой подпрограмме? Если в вашей системе установлен модуль crt языка Pascal, попробуйте разработать программу с такой подпрограммой.