nextupprevious

Next:6.1.2 Блоки и локализация имен
Up:6.1 Подпрограммы: процедуры и функции
Previous:6.1 Подпрограммы: процедуры и функции
 


6.1.1 Описание и вызов процедуры

Может случиться, что некоторый составной оператор должен появиться в нескольких местах программы. Чтобы программисту не приходилось тратить время на повторную запись этого оператора, в языке Zonnon предусматриваются средства для оформления оператора в виде подпрограммы, называемой процедурой. Программист имеет возможность приписать составному оператору некоторый идентификатор (имя процедуры) и использовать это имя в качестве сокращенной записи в тех местах, где должен появиться (исполниться) составной оператор. Процедура задается описанием, которое должно находиться в программе после раздела описаний переменных. Использование имени процедуры в качестве сокращенной записи называется оператором процедуры (или вызовом процедуры).

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

module СуммаДвухЧисел;
    const N = 100;
    var Число1, Число2, Сумма : Real; I : 1..N;
    procedure Линия;
    begin
        for I := 1 to N do write('-') end;
        writeln
    end Линия;
begin
    read(Число1, Число2);
    Сумма := Число1 + Число2; Линия; Линия;
    writeln(Число1); writeln(Число2); Линия;
    writeln(Сумма); Линия; Линия
end СуммаДвухЧисел.

Здесь, как и обычно, описание процедуры состоит из двух частей: заголовка процедуры (первая строка в описании процедуры Линия) и тела процедуры (составной оператор в описании процедуры Линия). Процедура Линия достаточно проста, но она позволила сделать программу короче текстуально; с процедурой программу стало легче читать, понимать и модифицировать. Например, пусть требуется рисовать не линию, а строку с чередующимися символами "звездочка" и "минус". Тогда, хотя имеются пять вызовов процедуры Линия, изменение в программу необходимо внести только в одно место в теле процедуры:

procedure Линия;
begin
    for I := 1 to N div 2 do write('$*$-') end;
    if Odd(N) then write('$*$')end;
    writeln
end Линия;

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

Механизм подпрограмм -- это мощное средство абстракции, позволяющее расширить язык путем включения новых операций и операторов. В языке Zonnon мы часто сталкиваемся со средствами абстракции. Например, когда в выражении нами используется операция сравнения двух целых чисел, мы, как правило, совсем не интересуемся тем, как она выполняется на конкретной ЭВМ, предполагая только, что она выполняется правильно. Подобным же образом, записывая вызов подпрограммы, мы исходим лишь из того, что подпрограмма делает, и не уделяем внимания тому, как она это делает реально. Другими словами, при описании подпрограммы основное выделяемое свойство -- это то, что делает подпрограмма, а главное из тех свойств, которые желательно опустить из рассмотрения, -- это то, как она это делает. Если рассматривать программу как конструктивное доказательство теоремы о том, что внешняя спецификация непротиворечива и вычислима, то подпрограмма -- это лемма, используемая в таком конструктивном доказательстве.

Next:6.1.2 Блоки и локализация имен
Up:6.1 Подпрограммы: процедуры и функции
Previous:6.1 Подпрограммы: процедуры и функции


© В.Н. Касьянов, Е.В.Касьянова, 2004