Песни о Паскале
Шрифт:
Рис.23 – Блок схема полного условного оператора
Внутри ромбика или рядом с ним обычно показывают проверяемое условие, а положительную и отрицательную ветви располагают слева и справа от него.
Пост номер один
Вам понятен условный оператор? Тогда обратимся к программе-часовому. Вероятно, вы написали её раньше меня, и нам осталось лишь сверить варианты.
var S : string;
begin
Writeln(’Пароль?’); Readln(S);
if S = ’pascal’
then Writeln(’Проходите!’)
else Writeln(’Стойте!’);
Writeln(’Нажмите Enter’); Readln;
end.
Почему после оператора Writeln(’Проходите!’) не видно разделителя – точки с запятой? Потому, что внутри условного оператора разделители не ставят! Другое дело – оператор Writeln(’Стойте!’). Здесь заканчивается условный оператор IF, и точка с запятой уместна – она разделяет операторы. Попробуйте нарушить эту запись и узнать мнение компилятора.
Неполный условный оператор
Что за окном? нет ли дождя? ЕСЛИ дождь идет, ТО прихватите зонтик. В этом кратком рассуждении нет отрицательной ветви, поскольку в ней никаких действий не предусмотрено. В таких случаях отрицательную ветвь отбрасывают и получают неполный условный оператор.
IF <условие> THEN <Оператор>
Блок-схема такого оператора показана на рис. 24.
Рис.24 – Блок-схема неполного условного оператора
Пост номер два
Применим неполный условный оператор ко второй версии электронного часового – программе «P_10_2».
var S, R : string;
begin
Writeln(’Пароль?’); Readln(S);
R:= ’Стойте!’;
if S = ’pascal’
then R:= ’Проходите!’;
Writeln(R);
Writeln(’Нажмите Enter’); Readln;
end.
Здесь для хранения решения введена переменная R, в которую изначально помещается суровое «Стойте!». После успешной проверки пароля значение переменной меняется на благосклонное «Проходите!», а затем решение выводится на экран.
Откомпилируйте и проверьте оба варианта часового. «Поиграйте» с ошибками компиляции. Если компиляция прошла гладко, внесите ошибки сознательно и исследуйте реакцию компилятора.
Теперь вы познакомились с двумя вариантами условного оператора. Ни один серьезный алгоритм не обходится без них. Скоро вам доведется изобретать весьма хитрые алгоритмы и рисовать блок-схемы для них. Значит, надо привыкать к блок-схемам; на рис. 25 представлены схемы наших программ.
Рис.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(’Оркестр, музыку!’);