
информатика / Информатика_2 семестр / 2-VBA / VBA-Учебные материалы / VBA-3 Разветвления
.doc
РАЗВЕТВЛЯЮЩИЕСЯ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ.
Большинство задач невозможно реализовать только с помощью линейной структуры, поскольку они обычно содержат различные условия, в зависимости от выполнения которых выбирается то или иное направление решения.
Рассмотрим пример
У1.
Необходимо вычислить значение функции
при любых значениях a
и
b.
На первый взгляд решение этой задачи
можно описать алгоритмом линейной
структуры, но при a·b
= 0 задача не может
быть решена, т. к. деление на нуль
невозможно. Для корректного решения
задачи необходимо предусмотреть вывод
сообщения, если вычисление y
невозможно. Тогда вычислительный процесс
можно описать следующим образом:
вычислить
y,
если a·b
≠ 0
вывести сообщение, если a·b = 0
Составим графическую схему алгоритма решения данной задачи.
В ГСА решения этой задачи используется блок «Решение» (проверка условия), имеющий один вход и два выхода в зависимости от результата проверки выполнения условия – «да» и «нет».
В нашем примере это блок 3, в котором проверяется условие a·b <> 0. В зависимости от результата проверки условия возможны два пути продолжения решения задачи. Каждый из этих путей называется ветвью, а алгоритм – разветвляющимся. Как и во всех разветвляющихся алгоритмах, в данной задаче нарушается естественный порядок следования блоков. Так, за блоком 3 могут выполняться блоки 4 и 5, образуя ветвь 1, а может и блок 6, образуя ветвь 2.
Любое изменение естественной (линейной) последовательности выполнения блоков называется переходом. Переходы бывают двух видов: условные и безусловные. Условный переход реализуется с помощью условного оператора If, который имеет блочный и однострочный формат записи, безусловный переход реализуется с помощью оператора GoTo.
Оператор условного перехода If
Блочный оператор If
В зависимости от конкретной задачи используют различные его модификации.
Самая простая – безальтернативная (усеченная) форма записи. Она применяется тогда, когда в случае истинности условия необходимо выполнить несколько программных операторов, а при невыполнении условия никаких действий нет:
(если) (тогда)
IF Условие THEN
Операторы при выполнении Условия
END IF
Например, фрагмент программы для ветви 1 примера У1 (блоки ГСА № 3-5):
IF a*b <>0 THEN
y=1/(a*b)
MsgBox “y=” & y
END IF
Альтернативная форма оператора If применяется в тех случаях, когда при истинности условия необходимо выполнить один набор операторов, а при невыполнении условия – другой. В этом случае оператор If записывается в следующем виде:
IF Условие THEN
Операторы при выполнении Условия
ELSE ‘ иначе
Операторы при невыполнении Условия
END IF
Текст программы для примера У1 с использованием альтернативной формы оператора If можно записать следующим образом:
Пример
У2
(разветвление на 3 ветви).
Вычислить
Для наглядности и контроля работы программы введем дополнительную переменную nv, предназначенную для хранения номера ветви, по которой выполняется расчет при конкретном значении x.
В данном примере при истинности условия 1 (x<0) выполняются вычисления по 1-й формуле. Если условие 1 не выполняется, проверяется условие 2 (x = 0), при его истинности выполняются вычисления по 2-й формуле. Если ни первое, ни второе условия не выполняются, вычисления производятся по 3-й формуле. Во всех случаях после расчета осуществляется вывод результата. Текст программы:
ПРАВИЛО: Количество условных блоков (операторов If) всегда на единицу меньше числа ветвей, на которые расходится вычислительный процесс!!!
Как видно из примера У2, операторы If могут быть вложенными. При этом каждый внутренний If должен полностью входить во внешний If:
If
Условие1
Then
…
Else
…
If
Условие2
Then
…
Else
…
End If
…
End If
Если между внешним Else и внутренним If нет других операторов, то их обычно соединяют в одно слово, а команду End If , соответствующую внутреннему If, исключают. Запишем таким способом программу для примера У2:
Однострочный (линейный) оператор If
Линейный формат условного оператора If записывается следующим образом:
IF Условие THEN Операторы_вып_усл [ ELSE Операторы_невып_усл ]
Примеры: if a<b then a=b
if s=2*d then y=s^2 else y=0
Линейной форма оператора называется потому, что условный оператор записывается только в одной строке, без переноса его на другую строку (End If не нужен!).
Линейный If применяется редко, обычно в тех случаях, если необходимо проверять не более двух условий, и операторы после ключевых слов достаточно кратки.
Объединение условий с помощью логических операций
Пример
У3:
Вычислить:
Если этот пример
записать в виде
, то он ничем
не будет отличаться от примера У2
(разветвление на 3 ветви).
Способ 1 (аналогичен примеру У2):
Примечание. Аналогично примеру У2 самостоятельно организуйте в программе вывод номера ветви, по которой осуществляется расчет при конкретном значении x.
В операторе If можно объединять результаты простых отношений в более сложные логические формулы с помощью операций AND (и), OR (или). Но при изображении ГСА каждое условие записывается в отдельном блоке!
Способ 2 (для примера У3): If x>=1 AND x<=2 Then y =sin(x) Else y =cos(x)
ИЛИ:
Способ 3 (для примера У3): If x<1 OR x>2 Then y =cos(x) Else y =sin(x)
Объединять с помощью логических операций можно только условия в операторе If, но не другие операторы, например:
Неверно: If a<3 Then a =5 AND s =0 Верно: If a<3 Then a =5 : s =0
Оператор безусловного перехода GoTo
Он используется для передачи управления в определенное место программы без проверки каких-либо условий и имеет следующий формат:
GoTo Метка
Метка обозначает место в программе, куда осуществляется переход. Имя метки выбирается по обычным правилам для имен переменных и оканчивается двоеточием. Метка может находиться как до, так и после оператора GoTo. Например:
GoTo
m1
‘Переход
на строку с меткой m1
…….
m1: y=cos(x)
В ГСА оператор GoTo отображается просто линией потока.
Проверка кратности чисел
В некоторых задачах бывает необходимо проверить, кратно ли число N числу K. Это можно сделать разными способами с использованием условного оператора и функций, рассмотренных в лекции «VBA-1», например:
1) если N Mod K = 0, то число N кратно числу K;
2) если N/K = Fix(N/K), то число N кратно числу K;
3) если N/K = N\K, то число N кратно числу K.
Напоминание:
Mod – целочисленный остаток от деления двух чисел;
Fix – целая часть числа;
/ – операция обычного деления;
\ – операция целочисленного деления.
Пример У4. Введите произвольное целое число X. Проверьте его на четность и выведите соответствующее сообщение.
Примечание. Число четное, если оно кратно 2, т. е. остаток от деления этого числа на 2 равен нулю. Решим эту задачу, используя первый способ проверки кратности числа (с помощью Mod).
ГСА и текст программы приведены ниже.
стр.