Песни о Паскале
Шрифт:
Writeln(’Как тебя зовут?’); Readln(Man);
Writeln(’Здравствуй, ’, Man);
Pause;
Pause;
Pause;
end.
Процедуры с параметрами
Вам ясна техника объявления и вызова процедур? Тогда рассмотрим ещё один случай: пусть выводимое процедурой сообщение меняется по нашему желанию. Для этого процедуру снабжают параметром. Вы знаете, что параметр указывается в скобках за именем процедуры, например:
Pause (’Будьте
Попробуйте вызвать процедуру этим способом, что вам скажет компилятор? Ничего хорошего не скажет и будет прав. Откуда процедуре знать о вашем желании вывести именно это сообщение? Но если добавить в заголовок процедуры объявление параметра, дело пойдет на лад. Объявление параметра тоже помещают в скобки; оно похоже на объявление переменной. В нашем случае заголовок процедуры с параметром может выглядеть, например, так:
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 вызвана трижды с тремя разными фактическими параметрами, испытайте эту программу.
Итоги
• С ростом размера программы стремительно растет её сложность. Для упрощения программ их разбивают на процедуры и функции.
• Чтобы создать процедуру или функцию, необходимо поместить в программе её описание, состоящее из заголовка
• Внутрь процедуры или функции можно передать один или несколько параметров. Для этого в заголовке процедуры объявляют формальные параметры, а при вызове указывают фактические.
• Тип фактического параметра должен совпадать с типом формального параметра, объявленного в процедуре.
А слабо?
А) Напишите ещё одну версию процедуры Pause, выводящую сообщение либо на русском, либо на английском языке. Параметр этой процедуры должен быть булевым и работать она должна так:
Pause(true); { печатается «Нажмите Enter…» }
Pause(false); { печатается «Press Enter…» }
Б) Напишите и испытайте процедуру (назовем её Line – «линия»), печатающую строку заданной длины, составленную из звездочек, например:
Line(3); { печатает «***» }
Line(7); { печатает «*******» }
Подсказка: внутри процедуры надо организовать цикл.
В) Напишите процедуру для очистки экрана, она может пригодиться вам в будущем. Подсказка: можно напечатать несколько десятков пустых строк (не менее 25, что зависит от настройки размера консольного окна).
Г) Напишите и испытайте процедуру, принимающую два параметра – числа, и печатающую их сумму и их разность.
Задачи на темы предыдущих глав
Д) Пользователь вводит строку с телефонным номером (только цифры), количество цифр заранее неизвестно. Ваша программа должна дополнить номер дефисами, разбивающими его на триады, т.е. по три цифры двумя способами:
• начиная с первых цифр, например 112-345-1;
• начиная с последних цифр, например 1-123-451.
Е) Почтальон разносит газеты по улице, состоящей из N домов. Четные и нечетные номера расположены по разные стороны улицы. В здравом уме почтальон не рискует лишний раз переходить её. Ваша программа должна напечатать последовательность номеров, по которым будут разнесена почта, когда почтальон начинает работу:
• с первого дома;
• со второго дома;
• с N-го (то есть последнего) дома.
Глава 20
Процедуры: первый опыт
Некоторые считают программирование искусством. Если так, то в чем оно? Искусный программист умеет (кроме прочего) превращать сложную программу в простую, – он равномерно распределяет сложность между процедурами и функциями. Как научиться этому? Усвойте несколько ключевых истин, но главное здесь – практика. Без «шишек» и «синяков» тут не обойтись. Однако, сколько за одного битого небитых дают?