Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
89
Добавлен:
10.04.2015
Размер:
473.6 Кб
Скачать

Лекция для ЗФ

РАЗВЕТВЛЯЮЩИЕСЯ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ.

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

Рассмотрим пример У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).

ГСА и текст программы приведены ниже.

стр. 8 из 8