Песни о Паскале
Шрифт:
Рис.25 – Блок-схемы программ с полным и неполным условными операторами
Итоги
• Условный оператор изменяет порядок действий в зависимости от некоторого условия; оператор может
• Полный условный оператор состоит из условия IF и двух ветвей: положительной – THEN, и отрицательной – ELSE. В каждую из ветвей можно поместить по одному вложенному оператору.
• Неполный условный оператор состоит из условия IF и положительной ветви THEN.
А слабо?
А) В программах для часового укажите начало и конец условного оператора (то есть, первый и последний его символ, включая вложенные операторы).
Б) Напишите программу, которая спрашивает, идет ли дождь, и на ответ «да» выводит сообщение «А зонта-то у тебя нет!». Воспользуйтесь неполным условным оператором.
Глава 11
Операторный блок
Электронный часовой из 10-й главы пропускает только знающих пароль. Расширим круг его обязанностей. Пусть часовой, приняв верный пароль, отдаст ещё несколько команд, как то: «Распахнуть ворота! Оркестр, музыку!». А для нарушителей команды будут такими: «Тревога! Задержать его!». Разумеется, что команды будут выводиться на экран, причем каждая – в отдельной строке. Усеченная блок-схема программы показана на рис. 26.
Рис.26 – Блок схема часового, подающего дополнительные команды
Операторные скобки
На первый взгляд все ясно, как белый день: если пароль верный, то отдаем команды, что показаны на блок-схеме слева, а иначе те, что справа. Каждую команду выводим отдельным оператором, – так они окажутся в отдельных строках.
if S = ’pascal’
then Writeln(’Распахнуть ворота!’);
Writeln(’Оркестр, музыку!’);
Writeln(’Проходите!’);
else Writeln(’Тревога!’);
Writeln(’Задержать его!’);
Добавьте в программу часового все это и откомпилируйте. Что, не вышло? Тут обнажилась проблема с подряд идущими операторами печати. По правилам языка, они разделяются точками с запятой, не так ли? Но разделители «порежут» на части и условный оператор IF-THEN-ELSE, а это недопустимо! Наткнувшись
«Вероятно, в Паскале что-то предусмотрено на сей счет» – заподозрите вы. Конечно! Здесь выручит операторный блок, который превращает группу операторов в один, скрывая внутри себя разделители – точки с запятой. Блок организуют знакомой вам парой ключевых слов BEGIN и END. В нашей программе эти слова надо втиснуть в ветви условного оператора так:
if S = ’pascal’
then begin
Writeln(’Распахнуть ворота!’);
Writeln(’Оркестр, музыку!’);
Writeln(’Проходите!’)
end
else begin
Writeln(’Тревога!’);
Writeln(’Задержать его!’)
end;
Как видите, внутри блока BEGIN-END разделители ставят как обычно – для разграничения операторов.
А сколько операторов вместится в блок BEGIN-END? Да сколько угодно! Блок может быть и пустым, – иногда это оправдано. Предположим, вы ещё точно не решили, что будет внутри ветви: один оператор или больше. Тогда вставьте здесь пустой блок BEGIN-END, а затем думайте дальше. Вставка лишних блоков не влияет на программу, но может уберечь от синтаксических и логических ошибок.
И последний вопрос: почему после END нет точки? Ведь мы ставим её в конце программы! Да, но окончание программы – это единственный случай, когда после END ставится точка.
Красиво жить не запретишь
Вероятно, вы заметили, что ветви THEN и ELSE условного оператора расположены с отступом вправо. Что это, требование языка? Ничуть. Вы вправе написать программу даже в одну строку, и компилятор «проглотит» её. Но каково будет разбираться в такой программе вам или вашему приятелю?
Отступы в программе сделаны для удобства чтения. Строгих правил по этой части нет; оформление – дело вкуса. Но сложились традиции, следование которым облегчит жизнь и вам, и тем, кто будет читать ваши программы. Главная идея оформления программ состоит в выделении логических уровней. Что это такое? В данном примере это ветви THEN и ELSE, – они должны быть хорошо видны в тексте. Полезно, также, выделять блоки операторов. Для этого можно поместить слова BEGIN и END друг под другом, а содержимое блока сдвинуть относительно них вправо.
Разбирая примеры, вы со временем научитесь разумно оформлять свои программы, – лучше раз увидеть, чем стократ услышать. Вот, в частности, другой вариант оформления программы «P_11_1», где обе ветви условного оператора прекрасно видны, хотя скобки begin-end и не расположены друг под другом.
var S : string;
begin
Writeln(’Пароль?’); Readln(S);
if S = ’pascal’ then begin
Writeln(’Распахнуть ворота!’);
Writeln(’Оркестр, музыку!’);