Принятие решений в программе
Логика — лишь одна составляющая «мыслящего» приложения. Вам также понадобятся средства ее практического использования. Приведенные в этом уроке примеры наглядно показывают, как принимаются решения в программах.
Оператор If...Then...Else
Оператор If...Then...Else представляет собой простейшую, но и самую распространенную форму проверки условий в Visual Basic. Его сокращенная форма — оператор If...Then — имеет следующий синтаксис:
If Выражение1 Оператор Выражение 2 Then
' Выполнить некоторые действия
End If
В этом примере Оператор может быть любым из операторов, рассмотренных ранее: AND, OR, =, <>и т. д. Выражение1 и Выражение2 — переменные или константы, допускающие сравнение данным оператором. Например, сравнение строк выполняется следующим образом:
PIN = "123456"
If PIN = "123456" Then
MsgBox "Верное значение PIN"
End If
В этом случае PIN сравнивается с заранее известным значением, "123456". Если условие истинно, на экран выводится сообщение.
Иногда мы реагируем лишь на выполнение условия, но чаще приходится обрабатывать и противоположную ситуацию. Для обработки противоположных ситуаций используется оператор Else. Синтаксис выглядит так:
If Выражение1 Оператор Выражение 2 Then
Выполнить некоторые действия
Else
Выполнить другие действия
End If
Все, что вам придется сделать, — включить секцию Else после первого выполняемого блока. Затем следующий выполняемый блок размещается между ключевыми словами Else и End If. В нем выполняются действия для условия, противоположного проверяемому. В предыдущем примере это выглядело бы так:
PIN = "654321"
If PIN = "123456" Then
MsgBox "Верное значение PIN"
Else
MsgBox "Неверное значение PIN!"
End If
Итак, теперь вы знаете, как обработать условие и исключение из него. Этот полез-ный прием поможет уменьшить количество ошибок в программе. Если вам потребуется вычислить несколько условий, оператор If...Then...Else можно поместить внутри другого оператора (вложенная проверка). Вложенные операторы If...Then позволяют выполнить серию проверок в определенном порядке. Например:
If ValidUserID(UserID) Then
If ValidPassword(UserID, Password) Then
MsgBox "Неверный пароль!"
Else
MsgBox "Пользователь зарегистрирован!"
End If
Else
MsgBox "Неверное имя пользователя!"
End If
Сначала мы проверяем, что пользователь ввел правильное имя. Проверка выполняется функцией ValidUserID(). Если функция возвращает True (правильное имя), программа переходит к проверке пароля. В противном случае она извещает пользователя о том, что он ввел неверное имя.
Если функция ValidPassword() возвращает True, пользователю разрешается войти в систему. В противном случае попытка регистрации завершается неудачей. Вложенные операторы If...Then можно создать и другим способом — с помощью конструкции ElseIf:
If x = 1 Then
Выполнить некоторые действия
ElseIf x = 2 Then
' Выполнить другие действия
End If
Выбор между этими конструкциями — вопрос вкуса и/или привычки. Оба способа работают одинаково хорошо.
Функция IIf
Вместо блока If...Then...Else можно воспользоваться конструкцией непосредственного If, или IIf. Единственное отличие заключается в том, что IIf вычисляет оба возвращаемых выражения. Рассмотрим следующий фрагмент:
Function TasteIt (Food As String) As String
CheckIt = IIf(Food = "Гамбургер". "Нет, спасибо", "Вкусно!")
End Function
Значения второго и третьего параметров, "Нет, спасибо" и "Вкусно!", будут вычислены независимо от того, какое из них будет возвращено функцией IIf.
ПОДСКАЗКА
Помните о том, что функция IIf() вычисляет оба выражения перед тем, как возвращать результат. Это не вызывает особых проблем при однократном выполнении команды, однако при вызове IIf в цикле ваша программа будет работать медленнее.
Функция TasteIt() чрезвычайно проста. Она проверяет, имеет ли переменная Food значение "Гамбургер", и если имеет — возвращает строку "Нет, спасибо". В противном случае возвращается строка "Вкусно!"
В качестве значений, возвращаемых функцией IIf, могут указываться как константы, так и вычисляемые выражения.
Оператор Select Case...End Select
Для принятия более сложных решений (особенно при наличии нескольких условий) можно воспользоваться блоком Select Case...End Select. Его синтаксис прост:
Select Case x
Case Is =3
'Выполнить некоторые действия
Case Is > 17
' Выполнить другие действия
Case Else.
'Действия для случая, когда не выполнено
'ни одно из предыдущих условий
End Select
Для каждого оператора Select Case в программе должен быть соответствующий оператор End Select. Количество секций Case между Select Case и End Select может быть любым.
Для каждого проверяемого условия создается отдельная секция Case. Если вы хотите отдельно обработать ситуацию, когда не выполняется ни одно из условий, создайте секцию Case Else. Она во многом похожа на секцию Else оператора If...Then.
В операторе Select Case можно проверять строковые литералы, переменные и диапазоны значений. Например, следующий фрагмент проверяет, что число принадлежит интервалу от 1 до 10:
Select Case guess
Case 1 to 10
Предположение верно
Case Else
Предположение неверно
End Select
Секция Саsе 1 to 10 выполняется для переменной guess, принадлежащей интер-валу от 1 до 10. Секция Case Else обрабатывает остальные ситуации.
Оператор Select Case...End Select применяется и для строк. Например, в вашей про-грамме может присутствовать следующий фрагмент:
Select Case x
Case Is = "3"
Выполнить некоторые действия
Case Is > "17"
Выполнить другие действия
Case Else
Действия для случая, когда не выполнено
ни одно из предыдущих условий
End Select
Программный код, выполняемый при выполнении условия, находится в соответствующей секции Case. Секция Case может содержать несколько команд (см. пример с угадыванием чисел). Обратите внимание: для завершения секции Case не используется оператор End. Становится понятно, почему так важно структурировать программный код с помощью символов табуляции и пробелов — это позволяет визуально сгруппировать взаимосвязанный код. Такой подход не только упрощает чтение программы, но и снижает вероятность ошибок.
ПОДСКАЗКАО написании структурированных программ рассказано в уроке 12, «Отладка приложений».
При проверке строковых значений следует помнить о том, что пользователь может вводить данные в верхнем, нижнем или смешанном регистрах. Следовательно, ваша программа должна обрабатывать возможные ситуации. Для этого необходимо решить две задачи. Во-первых, вы должны удалить из строки все ведущие и завершающие пробелы. Иногда пользователь случайно вводит пробелы до или после данных. Чтобы удалить их, следует передать строку функции Trim$(). Во-вторых, текст необходимо преобразовать к одному регистру, верхнему или ниж нему. Для этого можно воспользоваться функцией UCase$() или LCase$(,).Boз-можные варианты выглядят так:
If Trim$(UCase$(txtInput.Text)) = "АДМИНИСТРАТОР" Then
' Выполнить некоторые действия
End If
If Trim$(LCase$(txtInput.Text)) = "администратор" Then
' Выполнить некоторые действия
End If
Оба оператора If...Then приводят к одному результату. Обратите внимание: строка в правой части условия должна находиться в том же регистре, к которому преобразуется выражение в левой части.