Процедуры и функции

Урок 13. Процедуры и функции в Pascal. Часть 2.

Итак, сегодня мы с вами на learnpascal.ru продолжаем изучать функции и процедуры — важнейшую часть структурного программирования. В этом уроке мы рассмотрим только процедуры и функции. И даже не будем практиковаться, оставим это для последующих уроков.

Структура программы.

Программы на языке Паскаль состоят из заголовка программы, раздела описаний и тела программы. Раздел описаний может включать следующие подразделы: меток, констант, типов, переменных, процедур и функций. Последовательность подразделов в структуре программы произвольная, но естественно, что если вводится переменная нового типа, заданного в Туре, то подраздел Туре предшествует подразделу Var. Принцип нашего языка программирования «то, что используется, должно быть описано» сохраняется и для раздела описаний.

program <имя программы>;

label <метки>;
const
  <описание констант>;

type
  <описание типов данны\>;

var
  <описание переменных>;
  
<процедуры и функции>;

begin
  <основное тело программы>;
end.

Структура процедуры и функции

Структура процедуры.

До этого момента времени мы использовали из раздела описаний только описание переменных и типов. На этом занятии мы начнем изучать процедуры. Структура процедуры повторяет структуру программы. Отличия выделены «полужирным» шрифтом.

procedure <имя процедуры> (<параметры>);

label 
   <метки>;

const 
   <описание констант>;

type 
   <описание типов данных>;

var 
   <описание переменных>;

<процедуры и функции>;

begin
   <основное тело процедуры>;
end;

Напишу простую программу с процедурой, складывающей два числа.

var
  a, b, c: integer;

procedure sum(x, y: integer; var z: integer);
begin
  z := x + y;
end;

begin
  write('Введите два числа: ');
  readln(a, b);
  sum(a, b, c); {процедура вызывается своим именем, которое вы написали после зарезервированного слова procedure в описании}
  writeln(c);
end.

Итак, что вы видите? Точнее, что вам не понятно в данной программе? Я думаю, что вы не можете понять, почему перед z стоит var, а перед x, y — нет. Но всему свое время.

Процедуры и функции

Обратимся к примеру, приведенному на рисунке выше. Слева приведен фрагмент текста основной программы, справа — процедура. Как только в теле программы объявляется имя процедуры с параметрами, выполнение «главного» тела прекращается, и управление вычислительными процессами передается процедуре. После выполнения процедуры осуществляется возврат на оператор основной программы, следующий за вызовом процедуры.

Немножко теории:
В любой программе все переменные делятся на два типа: локальные и глобальные. В нашей программы переменные а, b, с — глобальные, а х, у, z — локальные. Глобальные переменные — это переменные из раздела описаний основной части программы, а локальные — из раздела описаний процедур и функций. Локальные переменные существуют только в течение времени работы процедуры, определяются (создаются) при её вызове и исчезают после завершении работы процедуры.

В программе определены переменные a, b, c. В процедуре x, y, z — её параметры, и они являются переменными процедуры. Причем между х, у  и z существует большая разница.

Поясню ее очередным рисунком.

Параметры

Параметры.

При описании процедуры указывается список формальных параметров. Каждый параметр является локальным по отношению к описываемой процедуре, к нему можно обращаться только в пределах данной процедуры (в нашем примере х, у, z — формальные параметры). Фактические параметры — это параметры, которые передаются процедуре при обращении к ней (а, b, с — фактические параметры). Число и тип формальных и фактических параметров должны совпадать с точностью до их следования.

Параметры-значения.

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

Параметры-переменные.

Другими словами, передача параметров по ссылке. Это те формальные параметры, перед которыми стоит идентификатор var. Передается адрес фактического параметра (обязательно переменной), после этого формальный
параметр становится его синонимом. Любые операции с формальным параметром выполняются непосредственно над фактическим параметром.

Структура функции

Функция выглядит почти так же, как и процедура. Почти единственное отличие в том, что заголовок функции начинается с ключевого слова Function и кончается типом возвращаемого данной функцией значения.

function <имя функции> (<список формальных операторов>): <тип возвращаемого значения>;

Кроме того, в теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции или переменная result, а в правой — ее значение.

Пример:

var
  a, b, c: integer;

function sum(x, y: integer): integer;
begin
  sum := x + y;
end;

begin
  readln(a, b);
  writeln(sum(a, b));
end.

Или так:

var
  a, b, c: integer;

function sum(x, y: integer): integer;
begin
  result := x + y;
end;

begin
  readln(a, b);
  writeln(sum(a, b));
end.
Небольшое послесловие:

Каждая процедура должна иметь одну точку входа и одну точку выхода (то есть использование goto, break, exit нежелательно), использование глобальных переменных в процедуре следует свести к минимуму, взаимодействие с процедурой должно осуществляться (по возможности) только через параметры.
Постепенно вы должны отказаться от технологии неструктурированного программирования. Сегодня мы с вами осваиваем структурную технологию разработки программ, при этом на каждом этапе текущая задача разбивается на ряд подзадач, определяя тем самым некоторое количество отдельных подпрограмм. Концепция процедур и функций — один из механизмов второго витка развития технологий программирования, а именно, структурного проектирования.

  • Игорь Купченко

    Я надеюсь, это не последний урок, который вы выложили на данном сайте. Жду следующих ваших уроков. Благодаря этому вашему посту я наконец-то понял, что такое функции и процедуры, а всё благодаря человеческому объяснению и наглядных примеров.

    • Владимир

      Большое спасибо за замечательное объяснение того, как использовать Процедуры и Функции!

    • Sergey Chizhov

      Полностью согласен. Как раз из-за того, что прочитав учебник и ничего не поняв, бросил программирование, потому как думал, что оно сложное.

  • Антон

    Я не понимаю, так чем все-таки отличаются переменные x, y от z?

  • Евгений

    Доброго времени суток подскажите почему выбивает ошибку в этой строке

    var a,b,c:shortint;
    procedure sum(x,y:integer; var z:real);
    begin

    z:=x + y;
    end;

    begin
    write(‘Bvedeti 2 chisla: ‘);
    readln(a,b);
    sum(a,b,c); //: Неправильный тип параметров подпрограммы
    writeln(c);

    end.

  • Евгений

    все понял надо чтобы переменные были одноименные