Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Конструкция If . . . Then . . . Else

Конструкция If... Then

Конструкция If... Then применяется, когда необходимо выполнить один или группу операторов в зависимости от некоторого условия. Синтаксис этой конструкции позволяет задавать ее в одной строке или в нескольких строках программы:

If условие Then выражение

If условие Then

выражение

End If

Обычно условие является простым сравнением, но оно может быть любым выражением с вычисляемым значением. Это значение интерпретируется как False (Ложь), если оно нулевое, а любое ненулевое рассматривается как True (Истина). Если условие истинно, то выполняются все выражения, стоящие после ключевого слова Then. Для условного выполнения одного оператора можно использовать как синтаксис для одной строки, так и синтаксис для нескольких строк (блоковую конструкцию).

Следующие два оператора эквивалентны:

If anyDate < Now Then anyDate = Now

If anyDate < Now Then

anyDate = Now

End If

Заметим, что синтаксис оператора If... Then для одной строки не использует оператор End If. Чтобы выполнить последовательность операторов, если условие истинно, следует использовать блоковую конструкцию If... Then... End If.

If anyDate < Now Then

anyDate = Now

Timer.Enabled = False ' Запретить таймер.

End If

Если условие ложно, то операторы после ключевого слова Then не выполняется, а управление передается на следующую строку (или строку после оператора End If в блочной конструкции).

Конструкция If... Then... Else

определяет несколько блоков операторов, один из которых будет выполняться в зависимости от условия:

If условие1 Then

выражение1

ElseIf условие2 Then

выражение2

...

Else

выражение-n

End If

При выполнении сначала проверяется условие1. Если оно ложно, VBA проверяет следующее условие2 и т. д., пока не найдет истинного условия. Найдя его, VBA выполняет соответствующий блок операторов и затем передает управление инструкции, следующей за оператором End if. В данную конструкцию можно включить блок оператора Else, который VBA выполняет, если не выполнено ни одно из условий.

Конструкция If... Then... ElseIf в действительности всего лишь специальный случай конструкции If... Then... Else. Заметим, что в данной конструкции может быть любое число блоков ElseIf, или даже ни одного. Блок Else можно включать независимо от присутствия или, наоборот, отсутствия блоков ElseIf.

Рассмотрим пример вычисления функции

Sub пример1()

Dim a As Single, b As Single, x As Single

Dim z As Double

Call read("A1", a)

Call read("B1", b)

Let x = CSng(InputBox("введи x", "Ввод данных", 0))

If x <= a Then

z = Sin(x)

ElseIf x >= b Then

z = Tan(x)

Else: z = Cos(x)

End If

Call out("C1", z)

End Sub

Заметим, что можно добавить любое число блоков Elself в конструкцию If... Then. Однако количество блоков Elself может стать настолько большим, что конструкция If... Then станет очень громоздкой и неудобной. В подобной ситуации следует применять другую конструкцию принятия решения - Select Case.

56. Конструкция Select Case

Конструкция Select Case является альтернативой конструкции If... Then... Else в случае выполнения блока, состоящего из большого набора операторов. Конструкция Select Case предоставляет возможность, похожую на возможность конструкции If... Then... Else, но в отличие от нее она делает код более читаемым при наличии нескольких вариантов выбора.

Конструкция Select Case работает с единственным проверяемым выражением, которое вычисляется один раз при входе в эту конструкцию. Затем VBA сравнивает полученный результат со значениями, задаваемыми в операторах Case конструкции. Если найдено совпадение, выполняется блок операторов, ассоциированный с оператором Case:

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

[Case список_выражений1

[блок_операторов1]]

[Case список_выражений2

[блок_операторов2]]

...

[Case Else

[блок_операторовn]]

End Select

Каждый список выражений является списком из одного или более значений. Если в одном списке больше одного значения, они отделяются запятыми. Каждый блок операторов содержит несколько операторов или ни одного. Если окажется, что вычисленному значению проверяемого выражения соответствуют значения из нескольких операторов Case, то выполняется блок операторов, ассоциированный с первым оператором Case из всех найденных соответствий. VBA выполняет блок операторов, ассоциированный с оператором Case Else (заметим, что он необязателен), если не найдено ни одного соответствия проверяемого значения выражения и значений из всех списков операторов Case.

Рассмотрим пример вычисления функции

Sub пример2()

Const pi2 = 1.57

Dim x As Single

Dim z As Double

Let x = CSng(InputBox("введи x", "Ввод данных", 0))

Select Case x

Case -pi2

z = Sin(x)

Case 0

z = Cos(x)

Case pi2

z = Tan(x)

Case Else

MsgBox "Неверные исходные данные!"

Exit Sub

End Select

Call out("D1", z)

End Sub

Заметим, что конструкция Select Case вычисляет выражение только один раз при входе в нее, а в конструкции If... Then... Else вычисляются различные выражения для каждого оператора Elself. Конструкцию If... Then... Else можно заменить конструкцией Select Case, только если оператор If и каждый оператор Elself вычисляют одно и то же выражение.

 

Организация циклов

Условные операторы (операторы выбора) и оператор безусловного перехода GOTO позволяют в зависимости от необходимости выполнять один блок операторов, обходя при этом другой. Однако часто при написании программ нужно решить задачу другого плана — многократно выполнять один и тот же блок операторов. Программная конструкция, позволяющая организовать многократное выполнение блока операторов, называется циклом.

Цикл можно организовать при помощи условного оператора и оператора GOTO. Для этого, например, в процедуре можно объявить целочисленную переменную, которая будет служить счетчиком. Перед входом в группу операторов, подлежащих многократному выполнению (такая группа операторов называется телом цикла), счетчику присваивается значение 0. Затем следуют операторы тела цикла, среди которых необходимо обязательно разместить оператор, увеличивающий значение счетчика на 1. Завершает всю конструкцию условный оператор, в котором проверяется значение счетчика. Если оно еще не превышает заранее заданного предельного значения, то при помощи оператора GOTO осуществляется переход к первому оператору тела цикла. Операторы тела цикла выполнятся еще раз, и так будет продолжаться до тех пор, пока значение счетчика не превысит заданный предел.

Однако, как уже говорилось выше, оператор безусловного перехода GOTO является своего рода операторным изгоем и применять его благопристойным программистам не рекомендуется. Кроме того, Visual Basic содержит четыре удобных в использовании оператора цикла: FOR... NEXT, FOR EACH... NEXT, DO... LOOP и WHILE... WEND. Некоторые из этих операторов имеют несколько вариантов синтаксиса и позволяют организовать какие угодно циклы, так что вам нет необходимости пользоваться неправильным оператором GOTO. Далее в этом разделе будут описаны все упомянутые конструкции.

Оператор цикла FOR... NEXT повторяет группу операторов указанное количество раз. Ниже приведен его полный синтаксис.

FOR счетчик = начало ТО конец [STEP шаг ]
[операторы]
[EXIT FOR]
[операторы]
NEXT [счетчик]

где:

счетчик — обязательный элемент; переменная числового типа, используемая в качестве счетчика цикла; переменная не может быть типа Boolean и не может быть элементом массива.

начало и конец — обязательные элементы; выражения, задающие начальное и конечное значение счетчика цикла.

шаг — необязательный элемент; если он используется, то указывается после ключевого слова STEP; этот элемент задает величину приращения счетчика, то есть при каждом прохождении цикла счетчик будет увеличиваться на шаг, пока не достигает значения 1 конец; приращение шаг может быть как положительным, так«и отрицательным; значение 0 задает бесконечный цикл (в этом случае нужно предусмотреть свой собственный вариант выхода из цикла); если шаг не указан, то приращение считается равным 1.

операторы — блок операторов, составляющих тело цикла; ни один из операторов тела цикла не должен менять значение счетчика цикла (это может привести к непредсказуемым последствиям);

EXIT FOR — необязательная конструкция; если присутствует, то при получении управления осуществляет переход за пределы оператора FOR... NEXT (прерывает выполнение оператора цикла); при помощи конструкции EXIT FOR можно запрограммировать альтернативный вариант выхода из цикла (например, при достижении какоголибо условия, в том числе для выхода из бесконечных циклов); используется в сочетании с условными операторами.

Конструкция NEXT служит для завершения оператора цикла. После ключевого слова NEXT можно указать переменную цикла счетчик, ту же самую, что и в заголовке цикла (после ключевого слова FOR). Это делать не обязательно, но настоятельно рекомендуется. Иначе вы обязательно запутаетесь, особенно при использовании вложенных циклов.

Ниже приведено несколько примеров использования оператора цикла FOR... NEXT.


  1. В приведенном в этом примере цикле вычисляются значения 11 точек параболы, соответствующие значениям абсциссы от -5 до 5. При помощи функции MsgBox эта информация выдается на экран. Обратите внимание на то, как при помощи операции конкатенации в одну строку собирается текстовая информация и значения числовых переменных.

  2. В этом примере вычисляется произведение нечетных чисел из первой десятки (нечетный факториал). Шаг приращения задан явно и равен 2.

  3. В этом примере проиллюстрирован вариант наиболее частого использования вложенных циклов — инициализация массивов. Во вложенном цикле (по переменной J) происходит инициализация элементов массива для конкретного значения I для всех значений J. Затем во внешнем цикле переменная I увеличивается на 1, и для всех значений J при новом значении I инициализируются элементы массива. Так задаются начальные значения для всех без исключения элементов массива А.

Оператор цикла FOR EACH... NEXT выполняет блок операторов, составляющих тело цикла, для всех элементов массива или набора (коллекции). Синтаксис этого оператора следующий:

FOR EACH элемент IN группа
[операторы]
[EXIT FOR]
[операторы]
NEXT [элемент]

где:
элемент — переменная, используемая для итерации по элементам массива или коллекции (набора). Для итерации по элементам набора, элемент может быть переменной типа Variant или объектной переменной соответствующего типа, а для итерации по элементам массива — только переменной типа Variant.
группа — имя массива или коллекции (набора).

Остальные элементы оператора аналогичны соответствующим элементам оператора FOR... NEXT который описывался выше. Ниже приводится пример, иллюстрирующий наиболее часто встречающийся способ использования оператора FOR EACH... NEXT.

В этом примере оператор цикла FOR EACH NEXT используется для итерации по элементам набора открытых в данный момент форм. Переменная цикла MyForm объявлена как переменная объектного типа FORM. Коллекция всех открытых форм называется FORMS. Таким образом, в приведенном выше примере в операторе цикла проверяется свойство Caption всех открытых в данный момент форм. Если среди открытых форм есть форма, имеющая подпись (Caption) Форма2, то на экран выдается соответствующее сообщение и цикл прерывается.

Наиболее гибким и удобным в семействе операторов цикла является оператор DO... LOOP. Существует два варианта синтаксиса этого оператора.

DO [{WHILE | UNTIL} условие ] 'Первый вариант
[ операторы ]
[EXIT DO]
[ операторы ]
LOOP

DO 'Второй вариант
[ операторы ]
[EXIT DO]
[ операторы ]
LOOP [{WHILE | UNTIL} условие ]

Элемент условие может быть любым выражением числового или строкового типа, но обычно это выражение логического типа. Для первого варианта оператора DO... LOOP условие вычисляется до первого выполнения операторов тела цикла. Если выражение условие сразу имеет значение False (Ложь) (и при этом указано ключевое слово WHILE), то операторы тела цикла не выполняются ни разу, а управление передается на следующий оператор. Если выражение условие принимает значение True (Истина), то тело цикла будет выполняться до тех пор, пока условие не станет равно False (Ложь). Для экстренного выхода из цикла служит конструкция EXIT DO.

Второй вариант оператора DO... LOOP отличается от первого только тем, что выражение условие проверяется после выполнения операторов тела цикла. Таким образом, при использовании второго варианта оператора DO... LOOP, операторы цикла выполняются как минимум один раз.

Ключевые слова WHILE и UNTIL, используемые в этом операторе, являются взаимоисключающими. То есть вы можете указать либо WHILE, либо UNTIL. Если указано ключевое слово WHILE, то операторы тела цикла будут выполняться до тех пор, пока значением выражения условие является True (Истина). В случае использования ключевого слова UNTIL операторы тела цикла выполняются до тех пор, пока значением выражения условие не станет True (Истина).

Далее приводится несколько примеров использования обоих вариантов оператора DO... LOOP.


  1. В этом примере оператор цикла DO... LOOP используется для подсчета произведения нечетных чисел из первой десятки (как и в примере с оператором FOR...NEXT). Обратите внимание на тот факт, что теперь вам самим нужно заботиться об инициализации переменной цикла (X) и об ее правильном приращении в теле цикла.

  2. В этом примере вычисляется сумма чисел от -10 до 0. Поскольку в операторе используется ключевое слово UNTIL, то тело цикла будет выполняться до тех пор, пока числовая переменная X не станет положительной (либо равной 0). Если переменной X задать положительное значение до цикла, то операторы тела цикла не выполнятся ни разу.

  3. В этом примере, как и в предыдущем, вычисляется сумма чисел от -10 до 0. Однако здесь цикл организован подругому. Переменной цикла является переменная Check типа Boolean. Перед входом в цикл этой переменной присваивается значение True (Истина). Операторы тела цикла выполняются как минимум один раз, так как условное выражение, управляющее циклом, расположено в конструкции LOOP. Поскольку в этой конструкции использовано ключевое слово UNTIL, то цикл будет выполняться до тех пор, пока переменная Check не получит значение False (Ложь). Если об этом не позаботиться, то мы получим бесконечный цикл, который подвесит все наше приложение. В этом примере выход из цикла осуществляется при достижении переменной X значения 0.

В заключение обзора операторов цикла следует упомянуть об операторе WHILE... WEND. Он имеет следующий синтаксис:

WHILE условие
[ операторы ]
WEND

Как видите, этот оператор достаточно прост. Перед очередным выполнением операторов тела цикла проверяется значение условия. Если условие истинно, то выполняется тело цикла, иначе управление передается оператору, следующему за оператором WHILE... WEND. В целом оператор WHILE... WEND не рекомендуется использовать. Он считается устаревшим и оставлен только для совместимости с ранними версиями Basic. Все возможности, предоставляемые этим оператором, с лихвой перекрываются возможностями более гибкого и удобного оператора DO... LOOP.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...