
Лекция 4. Программирование разветвлений.
Алгоритмы разветвляющейся структуры
Очень
часто последовательность шагов алгоритма
различна для разных исходных данных,
возможных в решаемой задаче. Такие
алгоритмы называются разветвляющимися.
В обычном смысле разветвление предполагает
наличие альтернатив (вариантов или
ветвей). При выполнении алгоритма
происходит выбор одной или нескольких
последовательностей шагов алгоритма
– ветвей при выполнении некоторого
условия. Чаще всего ветвление
предусматривает два варианта. В
блок-схемах эта ситуация описывается
следующим образом:
а) разделение алгоритма на две ветви, каждая из которых предусматривает выполнение некоторых шагов ЕСЛИ…………ТО………..ИНАЧЕ…… |
б) разветвление, при котором в одной ветви не предусмотрено никаких шагов (обход) ЕСЛИ………ТО……… |
Да (ТО)
Да (ТО) |
|
Проверка условия, записанного после слова ЕСЛИ, предполагает два варианта ответа:
ДА (условие выполнено), НЕТ (условие не выполнено).
В зависимости от варианта ответа и выбирается вариант выполнения алгоритма, или, как говорят, выполняется ветвь.
Пример 1. Составить алгоритм нахождения действительных корней квадратного уравнения общего вида ax2+bx+c=0, a≠0, b≠0. В случае, если нет действительных корней, написать «нет действительных корней».
Блок-схема алгоритма
Условные операторы
Для программирования разветвляющейся структуры на Фортране предусмотрено несколько видов условных операторов: условный логический оператор, условный блочный оператор, условный структурный оператор. В записи алгоритма эти операторы заменяют шаг ЕСЛИ в блок-схемах. В этих операторах условие записывается в виде логического выражения, которое может принимать лишь два значения: .TRUE. (истина) или .FALSE. (ложь).
Определение. Логическое выражение (ЛВ) представляет собой неравенство (или отношение), т.е. сравнение переменных или арифметических выражений. Напомним, как логические операции записываются на Фортране.
Операции сравнения (отношения):
Название операции |
Символ операции (Фортран-90 и Фортран -77) |
Больше |
> и .GT. |
Больше или равно |
>= и .GE. |
Не равно |
/= и .NE. |
Меньше |
< и .LT. |
Меньше или равно |
<= и .LE. |
Равно |
== и .EQ. |
Логические операции:
Название операции |
Символ операции |
Логическое отрицание НЕ |
.NOT. |
Логическое пересечение И |
.AND. |
Логическое объединение ИЛИ |
.OR. |
Логическая эквивалентность |
.EQV. |
Логическая неэквивалентность |
.NEQV. |
Примеры логических выражений:
Обычная запись |
Фортран |
Значение ЛВ |
|
abs(sin(x)) .LE. 1 |
истина (для любых x) |
N кратно 5? |
N / 5 * 5 = = N |
истина, если N делится на 5 и ложь, если не делится на 5 |
|
M **3 / = 64 |
ложь для M = 4, истина для всех других случаев |
|
(x >= -1) .AND. (x < 2) |
Истина,
если x
принадлежит промежутку |
Условный логический оператор
Условный логический оператор записывается в общем виде следующим образом:
IF (ЛВ) оператор S,
где S – любой выполняемый оператор, кроме оператора цикла и другого условного оператора.
Порядок выполнения условного логического оператора:
-
Вычисляется значение логического выражения (ЛВ), т.е. проверяется истинно оно или ложно.
-
Если ЛВ истинно, то выполняется оператор S. После него выполняется оператор, следующий за условным оператором.
-
Если ЛВ ложно, то оператор S не выполняется и управление передается оператору, следующему за условным логическим оператором.
Пример 2. Найти максимальное из двух произвольных не равных друг другу чисел.
Код программы на Фортране:
PRINT *, “Vvedite dva chisla”
READ *, A, B
IF (A = = B) PRINT *, “Chisla ravny: A = B !”
IF (A > B) max=A
IF (A < B) max=B
PRINT *, ‘max=’, max
END
Рассмотрим выполнение программы «по шагам», т.е. проследим выполнение каждого оператора компьютером. Известно, что компьютер выполняет все команды (строки программы) последовательно с первой строки до последней. Сначала компьютер выполнит оператор первой строки, т.е. напечатает на экране текст: Vvedite dva chisla, что означает подсказку для пользователя ввести два числа с клавиатуры. Затем будет выполняться оператор, стоящий во второй строке программы, т.е. пользователь должен ввести два числа: для определенности возьмем, например, A=3.5 и B=7.
Далее выполняется 3 строка, т.е. происходит сравнение двух чисел A и B, и если они равны, то на экране пользователь увидит текст: Chisla ravny: A = B !. Это означает, что вы сделали ошибку и ввели два одинаковых числа, что не соответствует условию задачи. Но так как наши значения переменных A и B не равны, условный логический оператор передаст управление на следующую строку, и, значит, оператор PRINT *, “ A = B !” не будет выполняться.
В 4 строке стоит условный логический оператор, и, в соответствии с порядком его выполнения, если логическое выражение A > B - истина, а в данном случае это не так, следовательно, управление будет передано на следующую строку. Переходим к 5 строке, опять проверяем работу следующего условного логического оператора. Если условие A<B – истина, что соответствует нашему случаю, следовательно, выполняется стоящий за логическим выражением оператор, т.е. переменной max присваивается значение переменной B, в результате переменная max принимает значение равное 7. В следующей строке записан оператор вывода на экран, это значит, что на экране мы увидим текст: max= 7. Программа заканчивается оператором конца программы END.
Пример 3. Найти минимальное из трех произвольных вещественных чисел x1, x2, x3, не равных между собой.
Заметим, что такой алгоритм часто используется в программировании. Опишем его. Допустим, что значение переменной x1 является минимальным. Сохраним это значение в переменной Xmin. Тогда, сравнивая Xmin с другими переменными x2 и x3, в случае, если оказывается, что Xmin больше x2, то переменной Xmin присваиваем значение переменной x2. Затем также сравниваем переменную x3 и Xmin. Если оказывается, что Xmin больше x3, то переменной Xmin присваиваем значение переменной x3.
Реализуем этот алгоритм. Код программы на Фортране:
PROGRAM MINIMUM
print *, “Vvod x1, x2, x3”
read *, x1, x2, x3
Xmin = x1
if (Xmin > x2) Xmin = x2
if (Xmin > x3) Xmin = x3
print *, “Xmin =”, Xmin
END
Попробуйте самостоятельно изменить код программ в примерах 2 и 3, если в условиях задач надо найти минимум в примере 2 и максимум – в примере 3.
Заметим, что в примере 3 программа написана с использованием строчных букв. Вспомните, что в Фортране можно использовать прописные (большие) и строчные (маленькие) буквы латинского алфавита, при этом не делается разницы между ними, т.е. буква B и b воспринимается компилятором Фортрана как одна и та же буква.
Условный логический оператор используется в том случае, если в результате выполнения условия требуется выполнить всего один оператор. Если по условию требуется выполнить несколько операторов, то тогда нужно использовать условные блочный или структурный операторы.