ВЕТВЛЕНИЯ

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

Пример 1. Допустим, вы собрались пойти в кинотеатр на сеанс 12.00. Алгоритм покупки билетов может выглядеть так:

Подойти к кассе. Если билеты на сеанс 12.00 имеются, то купить билеты.

Отойти от кассы.

 

Пример 2. Представьте себе, что вам нужно проехать к автозаправочной станции (АЭС) по дороге, участок которой ремонтировался, и вам неизвестно, закончился ли ремонт. Подъезжая к этому участку, вы будете вынуждены воспользоваться следующим алгоритмом:

Уменьшить скорость.

Если ремонт участка закончен, то проехать 5 км по отремонтированному участку, иначе проехать 10 км в объезд. Остановиться у АЭС.

“Билеты на сеанс 12.00 имеются” — это условие, которое надо проверить в первом примере. Во втором примере проверяется условие “ремонт участка закончен”.

Что же происходит после проверки условия? В первом примере, если условие выполнено, совершается действие

купить билеты,

а затем — действие

отойти от кассы.

Если же условие не выполнено, то сразу совершается действие отойти от кассы.

Во втором примере в случае выполнения условия совершается действие

проехать 5 км по отремонтированному участку,

а затем — действие

остановиться у АЭС.

В противном случае совершается действие

проехать 10 км в объезд, а затем — действие

остановиться у АЭС.

Мы видим, что при выполнении каждого из этих алгоритмов наступает такой момент, когда появляется несколько направлений для продолжения. Алгоритм как бы раздваивается, разветвляется (словно дорога). В этом случае говорят, что алгоритм содержит ветвление.

В рассмотренных ветвлениях как “прямой путь”, так и “объезд” содержит только одно действие. Но так бывает далеко не всегда. Скажем, в первом примере слова “Купить билеты” предполагают выполнение нескольких действий, например, таких: протянуть кассиру деньги, назвать сеанс и количество билетов, получить билеты. Учитывая это, попробуем

записать алгоритм покупки билетов более подробно. Как и раньше, будем записывать действия в столбик:

Подойти к кассе. Если билеты на сеанс 12.00 имеются, то:

Протянуть кассиру деньги.

Назвать сеанс и количество билетов.

Получить билеты.

Отойти от кассы.

Казалось бы, все в порядке: мы лишь разъяснили, что значит “купить билеты”. Но по этой записи стало невозможно понять очередность выполнения действий, поскольку неясно, какое именно действие следует выполнять, если билетов на сеанс 12.00 нет. Значит, в записи алгоритма необходим специальный указатель, показывающий последнее действие, участвующее в ветвлении. Договоримся в качестве такого указателя употреблять слова “Конец ветвления” и писать его в строке, следующей за последним действием ветвления:

Подойти к кассе. Если билеты на сеанс 12.00 имеются, то:

Протянуть кассиру деньги.

Назвать сеанс и количество билетов.

Получить билеты.

Конец ветвления.

Отойти от кассы.

Теперь ясно: если условие не выполнено, то сразу совершается действие, записанное после слов “Конец ветвления”.

Итак, ветвление (развилка)это такая форма организации действий, при которой в зависимости от выполнения или невыполнения некоторого условия совершается либо одна, либо другая последовательность действий.

Чтобы более наглядно представлять те или иные формы организации действий, очень полезны так называемые блок-схемы. Каждое действие алгоритма, кроме проверки условия, будем помещать в прямоугольник, а вопрос о том, выполняется ли некоторое условие,—в ромб. Блок-схемы на рисунках 13, а, б, в изображают соответственно последовательное выполнение действий, ветвления в полной и неполной формах. На рисунке 14 изображена блок-схема алгоритма покупки билетов.

 

IF...THEN...ELSE

УСЛОВНЫЙ ОПЕРАТОР

Условный оператор IF позволяет изменить порядок выполнения команд в зависимости от некоторого логического условия, т.е. он осуществляет ветвление вычислительного процесса. Условный оператор имеет вид:

IF <условие> THEN <оператор1> [ELSE <оператор2>];

В случае истиности логического выражения, стоящего в условии, выполняется <оператор1>, а <оператор2> пропускается. При ложном значении логического выражения пропускается <оператор1> и выполняется <оператор2>.

Оператор IF может быть полным (присутствуют обе ветви) или неполным (Else-ветви нет, при ложном условии ничего не делается). По правилам каждая из ветвей может содержать либо один выполняемый оператор, либо несколько, объединенных в составной. Точка с запятой перед Else считается ошибкой.

ПРИМЕР: Ввести целое число. Вывести соответствующий ему символ ASCII-таблицы, либо сообщить, что такого символа нет (0-31 - управляющие коды, затем до 256 - печатаемые символы).

program ascii_symbol;

var      i:word;

begin

write('Введите целое число: ');        readln(i);

if (i>31) and (i<256) then

writeln('Соответствующий символ - ', Chr(i))

else writeln('Такого символа нет');

readln

end.

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

Это вложенность, или, если забыть про стандартные определения, просто ситуация, когда нужно после проверки условия выполнять не одно, а несколько действий если условие верно, после чего также выпонять несколько действий, если условие не верно.

Здесь нам не обойтись без примера, который я сейчас приведу.

Давайте напишем программу, которая будет:

1.                                                                                                                                                                              Читать два числа A, B с клавиатуры;

2.                                                                                                                                                                              Складывать их и если сумма больше 50, то:

1.                                                                                                                                                                                                      Читать A еще раз;

2.                                                                                                                                                                                                      Опять складывать A и B;

3.                                                                                                                                                                                                      Выводить ответ на экран (уже ничего не проверяя).

3.                                                                                                                                                                              Если сумма меньше 50, то:

1.                                                                                                                                                                                                      Читать B еще раз;

2.                                                                                                                                                                                                      Вычесть A и B;

3.                                                                                                                                                                                                      Выводить ответ на экран (уже ничего не проверяя).

4.                                                                                                                                                                              Конец программы.

Как мы здесь будет поступать? Заметили, нам нужно выполнять несколько действий, в ходе проверки. Все это, в принципе могло бы выглядеть так (только алгоритм):

If A+B > 50 Then

Readln(A);

A := A + B;

Write(A);

else

Readln(B);

A := A - B;

Write(A);

Выглядит, вроде, без ошибок. Но попробуйте, напишите так программу. Ничего не выйдет, в конструкции if...then...else должно быть только по одному действию. Как же поступить?

Здесь нам на помощь приходит возможность вложенности. Как же это реализовать? На самом деле очень просто. Необходимо заключить все действия в отдельные служебные слова begin и end; - то есть сделать как бы маленькую программку в основной программе или сделать ее вложенной - отсюда и название "вложенность". Только запомните, после слова end, если вы его используете для обособленности оператора в конструкциях, ставиться точка с запятой - ";", а не точка! Точка ставиться только в конце программы. Без исключений.

Итак, модифицированный вариант нашей программы, уже полностью:

Program Primer;

var

A,B: Integer;

begin

Write('Введите A: ');

Readln(A);

Write('Введите B: ');

Readln(B);

If A+B > 50 Then

begin

Readln(A);

A := A + B;

Write(A);

end

else

begin

Readln(B);

A := A - B;

Write(A);

end;

Readln;
end.

Вот, собственно и все. Этот метод применяется везде и повсеместно. Уверяю вас, скоро вы забудете про него и это уже будет получаться автоматически. А пока запомните это и вспоминайте при необходимости.

На дом

на дом задачи № 8 - 12

            еще задачи № 13 - 17

           

 

Перейти на главную