Программы, в которых каждое следующее действие выполняется после предыдущего, называются линейными. Однако часто встречаются нелинейные программы, в которых порядок действия отличается от порядка расположения команд.
Ветвление – участок программы, позволяющий выбрать для исполнения, в зависимости от истинности условия, одну из двух групп команд.
Так выглядит
ветвление на схеме
а так – на Паскале
Существует также неполное ветвление, в котором группа команд исполняется только при истинности условия. Ложное условие не вызывает никаких действий.
Если в правой или левой ветви всего одна команда, то использовать слова begin и end не обязательно. Но, даже если в полном ветвлении в первой части не использовать begin и end, перед else точку с запятой не ставят.
Пример: Вася собирает древние монеты. Он приобрёл a динариев и b сестерциев разного достоинства и года выпуска. Хватит ли ему места в альбоме, если там всего с ячеек для монет?
program money;
var
a,b,c:integer;
begin
write(’Сколько динариев купил Вася? ’); readln(a);
write(’Сколько сестерциев купил Вася? ’); readln(b);
write(’Сколько свободных ячеек в альбоме? ’); readln(c);
if a + b <= c then
writeln(’Места в альбоме хватит’)
else
writeln(’Места в альбоме не хватит’);
end.
Условие в ветвлении представляет собой логическое выражение. Оно может содержать арифметические (или другие, например, текстовые) выражения и операции сравнения между ними: < (меньше), > (больше), = (равно), < > (не равно), <= (меньше или равно), >= (больше или равно).
Результат логического выражения – истина (true) или ложь (false). Например, значение выражения 2 > 3 равно false, а выражения 2 <= 3 - true. Для хранения в памяти логических значений существуют логические (булевские) переменные. Их описывают в разделе VAR словом boolean. Например, a:=b>c;
Иногда требуется составить сложное логическое выражение, содержащее несколько сравнений. В этом случае каждое сравнение помещают в скобки, а между ними используют логические операции and, or или xor. Операция and (И) обозначает одновременность выполнения двух условий. Операция or (ИЛИ) обозначает достаточность выполнения одного из двух условий. Операция xor (Исключающее ИЛИ) обозначает неодновременность выполнения двух условий (только одно из двух условий верно). Кроме того, существует операция отрицания not. Если она стоит перед истинным выражением, в результате получается ложь, а применённая к ложному, даёт истину. Ниже приведены таблицы истинности логических операций.
Если в одном выражении используется несколько логических операций, последовательность их выполнения определяется приоритетом: 1) NOT; 2) AND; 3) OR; 4) XOR. Все арифметические операции – более приоритетны, а все операции сравнения – менее приоритетны, чем логические операции. Нужная последовательность операций может быть достигнута применением скобок.
Примеры:
(2=3) or (2< >3) – результат true
((5+5> =10) or (1=2)) and ((2< 3)=(2+2< >5)) – результат true
(2<3) and not (2*2=4) – результат false
Пример задачи с составным условием: Ввести температуру морской воды и определить, можно ли купаться. Благоприятная для купания температура – от 19 до 26 градусов.
program water;
var
t:real;
begin
write(’Введите температуру воды у пляжа ’);
readln(t);
if (t>=19) and (t<=26) then
writeln(’Можно купаться’)
else
writeln(’Купаться нельзя’);
end.
Ещё пример: Так как поворот Земли вокруг своей оси занимает несколько больше, чем 24 часа, то за 4 года накапливается опережение на одни сутки. Поэтому каждый год, кратный 4, является високосным (на 1 день больше). Но эти расчёты тоже неточны: за каждые 100 лет накапливается отставание почти на 1 сутки, поэтому годы, кратные 100 не являются високосными. Но отставание за 100 лет на четверть меньше одних суток, поэтому каждый четырехсотый год увеличивают на день, и годы, кратные 400 являются все же високосными. Программа должна ввести с клавиатуры год и определить, является ли он високосным. Напомню: «a делится на b без остатка» обозначает, что при делении a на b остаток равен 0.
program year;
var
y:integer;
begin
write(’Введите год ’); readln(y);
if (y mod 4=0) and ((y mod 100<>0)
or (y mod 400=0)) then
writeln(’Високосный год’)
else
writeln(’Не високосный год’);
end.