Принятие решений в программе

Логика — лишь одна составляющая «мыслящего» приложения. Вам также понадобятся средства ее практического использования. Приведенные в этом уроке примеры наглядно показывают, как принимаются решения в программах.

Оператор 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 приводят к одному результату. Обратите внимание: строка в правой части условия должна находиться в том же регистре, к которому преобразуется выражение в левой части.

Наши рекомендации