Итак, сегодня мы с вами на 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 нежелательно), использование глобальных переменных в процедуре следует свести к минимуму, взаимодействие с процедурой должно осуществляться (по возможности) только через параметры.
Постепенно вы должны отказаться от технологии неструктурированного программирования. Сегодня мы с вами осваиваем структурную технологию разработки программ, при этом на каждом этапе текущая задача разбивается на ряд подзадач, определяя тем самым некоторое количество отдельных подпрограмм. Концепция процедур и функций — один из механизмов второго витка развития технологий программирования, а именно, структурного проектирования.
Я надеюсь, это не последний урок, который вы выложили на данном сайте. Жду следующих ваших уроков. Благодаря этому вашему посту я наконец-то понял, что такое функции и процедуры, а всё благодаря человеческому объяснению и наглядных примеров.
Большое спасибо за замечательное объяснение того, как использовать Процедуры и Функции!
Полностью согласен. Как раз из-за того, что прочитав учебник и ничего не поняв, бросил программирование, потому как думал, что оно сложное.
Я не понимаю, так чем все-таки отличаются переменные x, y от z?
т.к. перед z стоит var, то его значение после процедуры передаeтся глобальной переменной с, которую он заменяет в подпрограмме. А значения а и b меняются на x и y только во время выполнения процедуры
Доброго времени суток подскажите почему выбивает ошибку в этой строке
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.
var a,b,c:integer;
procedure sum(x,y:integer; var z:integer);
begin z:=x + y;
end;
begin write(‘Bvedeti 2 chisla: ‘);
readln(a,b); sum(a,b,c);
writeln(c);
end.
var a,b: integer; c:real;
procedure sum(x,y:integer; var z:real); Типы переменных должны быть одинаковые, имена разные
Все понял, надо чтобы переменные были одноименные.
Спасибо, единственный нормальный сайт, где все понятно объясняется.
Не понятно зачем нужна эта конструкция с var в процедуре:
a, b, c: integer;
procedure sum(x, y: integer; var z: integer);
Если куда проще написать так:
a, b, z: integer;
procedure sum(x, y: integer);
Вводим x,y, и вызываем z. Так и не понял зачем нужен var в процедуре и как его применять.