Песни о Паскале - [32]

Шрифт
Интервал

После заголовка процедуры ставится точка с запятой. Далее следует тело, заключенное в блок BEGIN-END. Завершается описание процедуры ещё одной точкой с запятой. В блоке BEGIN-END размещают любое количество исполняемых операторов по тем же правилам, что применялись нами ранее. Обратите внимание: блок BEGIN-END в теле процедуры обязателен! Даже если внутри блока будет всего один оператор, или не будет вовсе!

Теперь решим, где расположить это хозяйство? На рис. 41 показана знакомая вам структура простой программы. После объявления констант и переменных следует главная программа, где исполняемые операторы заключены между BEGIN и END.



Рис.41 – Структура простой программы

По правилам языка любой объект программы – константа, переменная, процедура – должен объявляться до своего использования. Стало быть, описание процедуры надо поместить до того, как будет сделан её вызов. Поскольку процедура Pause вызывается из главной программы, её описание должно быть помещено перед нею.


>{ P_19_1 – Пример применения процедуры }

>var Man : string;


>procedure Pause; {--- описание процедуры ---}

>begin

>      Write(’Нажмите Enter…’);

>      Readln;

>end;


>begin       {--- главная программа ---}

>      Writeln(’Как тебя зовут?’); Readln(Man);

>      Writeln(’Здравствуй, ’, Man);

>      Pause;       { вызов процедуры }

>end.


Но в каком порядке будут выполняться операторы этой программы? Мы знаем, что компьютер исполняет программу, как бы читая её слева направо и сверху вниз. Стало быть, операторы в теле процедуры выполняются первыми?

А вот и нет! Главная программа на то и главная, чтобы исполняться первой. Все начнётся с запроса имени пользователя и так далее. Когда же дело дойдет до вызова процедуры Pause, вступят в бой операторы в теле этой процедуры. Последовательность исполнения показана на рис. 42 (обратите внимание на нумерацию строк). Вызов процедуры Pause приведет, как говорят программисты, к передаче управления внутрь тела процедуры. После исполнения расположенных там операторов, управление возвращается в главную программу к оператору, следующему за вызовом.



Рис.42 – Последовательность выполнения операторов

Итак, хотя процедура размещается в тексте выше главной программы, её операторы выполняются позже – после вызова процедуры.

При необходимости вызов процедуры можно повторить. Например, чтобы подразнить пользователя и заставить его трижды нажать клавишу Enter, сделаем так:


>begin       {--- главная программа ---}

>      Writeln(’Как тебя зовут?’); Readln(Man);

>      Writeln(’Здравствуй, ’, Man);

>      Pause;

>      Pause;

>      Pause;

>end.


Процедуры с параметрами

Вам ясна техника объявления и вызова процедур? Тогда рассмотрим ещё один случай: пусть выводимое процедурой сообщение меняется по нашему желанию. Для этого процедуру снабжают параметром. Вы знаете, что параметр указывается в скобках за именем процедуры, например:


>      Pause (’Будьте любезны нажать Enter!’);


Попробуйте вызвать процедуру этим способом, что вам скажет компилятор? Ничего хорошего не скажет и будет прав. Откуда процедуре знать о вашем желании вывести именно это сообщение? Но если добавить в заголовок процедуры объявление параметра, дело пойдет на лад. Объявление параметра тоже помещают в скобки; оно похоже на объявление переменной. В нашем случае заголовок процедуры с параметром может выглядеть, например, так:


>procedure Pause (msg : string);


Здесь имя параметра msg назначено нами произвольно (это сокращение от слова message – «сообщение»). Параметр, объявленный в заголовке, называют формальным, он доступен только внутри процедуры, где можно обращаться с ним, как с обычной переменной. Например, вывести на экран, как в нашем случае.


>procedure Pause (msg : string); { объявление процедуры с параметром }

>begin

>      Write(msg); Readln;

>end;


Что касается вызывающей программы, то имя формального параметра ей неизвестно.

Как действует такая процедура? В момент вызова в главной программе формальному параметру msg автоматически присваивается указанное в вызове фактическое значение, – оно и будет напечатано. Повторяю: присвоение формальному параметру фактического значения происходит автоматически, без участия программиста. Теперь наша программа станет такой.


>{ P_19_2 – применение процедуры с параметром }


>var Man : string;

>{--- объявление процедуры с параметром msg ---}

>procedure Pause (msg : string);

>begin

>      Write(msg); Readln;

>end;


>begin       {--- главная программа ---}

>      Writeln(’Как тебя зовут?’); Readln(Man);

>      Writeln(’Здравствуй, ’, Man);

>      Pause(’Нажмите Enter…’);

>      Pause(’Еще раз…’);

>      Pause(’И ещё разок!’);

>end.


Здесь процедура Pause вызвана трижды с тремя разными фактическими параметрами, испытайте эту программу.

Итоги

• С ростом размера программы стремительно растет её сложность. Для упрощения программ их разбивают на процедуры и функции.

• Чтобы создать процедуру или функцию, необходимо поместить в программе её описание, состоящее из заголовка и тела.

• Внутрь процедуры или функции можно передать один или несколько параметров. Для этого в заголовке процедуры объявляют формальные параметры, а при вызове указывают фактические.


Рекомендуем почитать
Рождение Эмеральда, слабость Амбера

Миры Эмеральда являются свободной прелюдией к мирам «Амбера» Роджера Желязны и к «Хроникам Фауста» Константина Мзареулова. Некоторые события и данные основываются на мелких подробностях из тех книг, но возможны случайные противоречия. Спасибо Роджеру Желязны за идею войны Амбера с Хаосом. Спасибо Константину Мзареулову за то, что он оригинально продолжил «Хроники Амбера» серией «Хроники Фауста». Спасибо Льву Стрельникову, моему приятелю, за то, что он морально помог стать мне писателем и тем самым начать создание «Хроник Эмеральда».


На седьмом небе

Сегодня пятница, 20 ноября 2038 года. Я лежу на земле и смотрю в небо. Там наверху, далеко, темно так, что хоть глаз выколи. Хоть оба вырви, а ничего нет. Представьте, что вы закрыли глаза — и пусто. Выпили чай, пустая кружка, открытые настежь окна дома — и холодно. Холодно, снег шел уже много раз. В этом году холодно, и в следующем будет также, если не пошевелитесь. Если не включите чайник, не закроете окна, не заставите сигнализацию работать, не проверите детей, жену, собаку… Никакого тебе больше чая, жены.


Красная Горка

Это небольшая история о следователе Павле.


Петля на шее

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


Стрела на Север

Приключенческая повесть с инопланетянином, делающим неожиданные подарки.


Вечный эмигрант

Трясет Перу, и Яву, и Бермуды И тонет Русь в дешевеньком вине А я живу, живу с мечтой о чуде, "Сосновых башнях"* в дивной той стране...