Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Структурное программирование

Операторы ветвления

Операторы ветвления изменяют последовательность выполнения операторов программы в зависимости от обрабатываемых данных. В VBA существуют три оператора ветвления: оператор безусловного перехода GoTo, оператор условного перехода If и оператор Case.

Оператор безусловного перехода GoTo

Оператор безусловного перехода записывается следующим образом:

GoTo <Label>

(Перейти_на <Метка>). Он передает очередность выполнения операторов на строку, в начале которой стоит метка с двоеточием. Оператор GoTo используется только в паре с «умными» операторами If или Case.

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

Структурное программирование

Программирование начинается с разработки алгоритма, плана работы программы. Укрупненный алгоритм, последовательность шагов обработки данных, называется графом обработки данных. Циклические блоки, проверки с повторами располагают внутри отдельных шагов. В графе обработки отмечаются только крупные точки ветвления. В них цепочка шагов может расщепиться на несколько цепочек обработки данных, чтобы потом снова сойтись в одну цепочку. Но в целом, работа идет последовательно от начала до конца обработки данных.

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

Заметим, что если оператор GoTo работает внутри отдельного сегмента, это не противоречит концепциям структурного программирования.

Оператор условного перехода If…Then

Оператор условного перехода If–Then–Else (Если–Тогда–Иначе) наделяет программы способностью принимать решения. Он является основой создания интеллектуальных программ.

If <условие> Then <True ветка> Else <False ветка> End If

Проверяется условие. Если условие истинное (True), выполняется истинная ветка, если условие ложное (False), выполняется ложная ветка.

Синтаксис оператора очень простой. Между ключевыми словами вставляются фрагменты < > оператора If, поэтому размер фрагмента может быть любым. Термин ветка означает один оператор или группу операторов.

Ключевое слово Else и ложная ветка могут отсутствовать. Тогда оператор If содержит одну истинную ветку, которая выполняется, если условие истинное, или не выполняется, если условие ложное.

If <условие> Then <True ветка> End If

Если истинная ветка состоит из одного оператора, If можно записать без ключевых слов End If

If <условие> Then <True оператор>

В VBA можно создать составной оператор. Это группа операторов, которые записаны в одной строке и разделены двоеточием. Поэтому можно написать истинный составной оператор

If <условие> Then <True оператор1: оператор2: …>

Оператор множественного выбора If–ElseIf содержит несколько истинных веток, каждая со своим условием, и одну ложную ветку, которая может отсутствовать.

If <условие1> Then <True ветка1>

ElseIf <условие2> Then <True ветка2>

ElseIf <условие3> Then <True ветка3>

. . .

[ Else <False ветка> ]

End If

Условия проверяются подряд. Как только найдется истинное условие, выполняется соответствующая истинная ветка, и выполнение оператора прекращается. Если не найдено ни одного истинного условия, выполняется ложная ветка, если она есть.

В операторе If мы советуем ключевые слова If, Else, End If располагать с одинаковым отступом от начала строки, а операторы веток сдвинуть вправо. Правило хорошего стиля программирования: подчиненный оператор располагается в следующей строке правее основного оператора.

Приведем примеры использования оператора If.

В следующем примере переменная tTime получает от функции Time текущее системное время суток в виде дроби: время в часах / 24 часа. Тогда 8 часов = 1/3, 12 часов = 1/2, 18 часов = 3/4 и так далее. В зависимости от текущего времени, программа печатает на экране три сообщения: «Доброе(ый) утро (день, вечер)».

tTime = Time

If tTime < 0.5 Then MsgBox ″Доброе утро″

If tTime >= 0.5 And tTime < 0.75 _

Then MsgBox ″Добрый день″

If tTime >= 0.75 Then MsgBox ″Добрый вечер″

Это пример плохого программирования. Если выполнится первый оператор и будет напечатано «Доброе утро», все равно будут производиться остальные бесполезные проверки. В сложной программе проверки повторяются в циклах миллионы раз, и бесполезные проверки крадут много времени.

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

tTime = Time

If tTime < 0.5 Then MsgBox ″Доброе утро″

Else

If tTime >= 0.75 Then MsgBox ″Добрый вечер″

Else MsgBox ″Добрый день″

End If

End If

Третий вариант запишем с помощью оператора If–ElseIf. Он также оптимальный по времени выполнения, но содержит меньше операторов, и текст программы более понятный, более прозрачный, как говорят программисты.

tTime = Time

If tTime < 0.5 Then MsgBox ″Доброе утро″

ElseIf tTime >= 0.75 Then MsgBox ″Добрый вечер″

Else MsgBox ″Добрый день″

End If

Оператор Case

Оператор Case еще более удобен при анализе нескольких вариантов действий, чем множественный If–ElseIf.

Select Case < проверяемое_выражение >

Case < список_условий1 >

< True ветка1 >

Case < список_условий2 > : < True ветка2 >

. . .

[ Case Else : < ветка по умолчанию > ]

End Select

Варианты Case проверяются подряд на истинность списка условий. Как только найдется первое истинное условие, и выполнится соответствующая True ветка, работа оператора Select Case прекращается. Если не найдено ни одного истинного условия, выполняется ложная ветка Case Else, если она есть.

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

Макрос Discount

Напишем макрос Discount для вычисления дисконтной скидки с использованием оператора Select Case. Опишем алгоритм работы программы. В окне функции InputBox оператор вводит сумму покупки и нажимает кнопку OK или клавишу <Enter>. Если нажата кнопка Cancel или клавиша <Esc>, то функция InputBox вводит пустую строку, работа заканчивается. Если введено не число или отрицательное число, программа сообщает об ошибке и предлагает повторить ввод. Если введена допустимая сумма, программа вычисляет величину скидки в зависимости от суммы покупки и выводит в окне функции MsgBox.

Sub Discount()

Dim summa As Double

Dim disc As Double

Dim str As String

Inp: str = InputBox("Введите сумму покупки: ")

If str = "" Then Exit Sub 'выход при пустом вводе

If Not (IsNumeric(str)) Then

MsgBox "Введено не число"

GoTo Inp 'повторить ввод

End If

summa = CDbl(str)

Select Case summa

Case Is < 0

MsgBox "Сумма должна быть положительной"

GoTo Inp 'повторить ввод

Case 0 To 1000: disc = 0.1

Case 1001 To 2000: disc = 0.2

Case 2001 To 3000: disc = 0.3

Case Is > 3000: disc = 0.4

End Select

MsgBox "Скидка = " & summa * disc

End Sub

В первом операторе If проверяется условие str = "" – ввод пустой строки. Здесь символ = означает сравнение двух объектов, а не оператор присваивания, как было бы в отдельном операторе.

Во втором операторе If функция IsNumeric(str) возвращает логическое значение True (истина, числовое значение 1), если в строке str записано число. Если строка str содержит не число (например, введена буква, или запятая вместо десятичной точки), то функция IsNumeric(str) возвращает логическое значение False (ложь, числовое значение 0).

Логическая операция Not (отрицание) превращает истину в ложь, а ложь в истину. В результате если в строке str содержит не число, условие в операторе If становится истинным, и выполняется истинная ветка: в окне функции MsgBox выводится сообщение "Введено не число", и оператор GoTo возвращает программу на строку с меткой Inp: , повторение ввода суммы покупки.

Если строка str содержит число, функция CDbl(str) преобразует строку в число типа Double (8 байт, вещественное число), и она пересылается в переменную summa.

Большая часть условий – проверка на попадание в интервал значений, заданных с помощью ключевого слова To. Ключевое слово Is (Это) заменяет проверяемое выражение, которое может быть очень длинным.

В заголовке оператора Case

Select Case summa

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

Далее идут ветки Case, они очень похожи на ветки ElseIf, только более простая запись условий. Операторы истинной ветки начинаются в следующей строке и продолжаются до следующего ключевого слова Case или до End Select.

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

В первом условии

Case Is < 0

ключевое слово Is обозначает внутреннюю переменную, в данном случае это значение введенной суммы. Если сумма отрицательная, сообщение на экран и переход на ввод нового значения.

Следующие условия – попадание внутренней переменной в границы

Case 0 To 1000: disc = 0.1

Здесь даже не упоминается внутренняя переменная. После двоеточия записан один оператор истинной ветки.

В последнем Case задана только одна граница, поэтому здесь тоже используется обозначение внутренней переменной Is .




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.