с оператором логического отрицания Not
Оператор логического умножения And всегда находится между двумя операндами. Значение всего выражения будет True (Истина), только если оба из них возвращают True (Истина), иначе – False (Ложь) (Рис.4.5).
Рис.4.5. Результаты вычисления выражений
с оператором логического умножения And
Логическое сложение Or – еще один из наиболее часто встречающихся логических операторов. По написанию он похож на предыдущий и возвращает True (Истина), если хотя бы один из операндов имеет значение True (Истина) (Рис.4.6).
Рис.4.6. Результаты вычисления выражений
с оператором логического сложения Or
Исключающее сложение Xor работает аналогично Or, кроме случая, когда оба операнда имеют значение True (Истина) (Рис.4.7).
Рис.4.7. Результаты вычисления выражений
с оператором исключающего сложения Xor
Оператор логической эквивалентности Eqv возвращает True (Истина), если оба операнда имеют одинаковое значение. Иными словами, его результат противоположен использованию оператора исключающего сложения Xor (Рис.4.8).
Рис.4.8. Результаты вычисления выражений
с оператором логической эквивалентности Eqv
Логическая импликация Imp является единственным оператором, результат выполнения которого зависит от положения операндов. Он всегда равен True (Истина), кроме случая, когда первый операнд True (Истина), а второй – False (Ложь) (Рис.4.9).
Рис.4.9. Результаты вычисления выражений
с оператором логической импликации Imp
4.8. Приоритеты операций
Порядок вычисления сложного выражения, состоящего из нескольких операторов, зависит от их приоритетов (Рис.4.10).
Рис.4.10. Операторы языка Visual Basic
в порядке убывания их приоритета
Если друг за другом следуют несколько операторов с одинаковым приоритетом, то вычисление выражения производится слева направо.
В качестве примера попробуйте разобраться с порядком вычисления следующего выражения:
Form1.Visible = 2 <> 3 And Not 2 ^ 3> 2 +3
Даже на первый взгляд видно, что это сделать непросто, особенно если не заглядывать в таблицу. Совсем другое дело, если добавить в выражение несколько пар круглых скобок, явно указывающих на порядок выполнения операций:
Form1.Visible = (2 <> 3) And (Not ((2 ^ 3)> (2 +3)))
Глава 5. Условные переходы и циклы
В этой главе вы научитесь:
• изменять порядок выполнения операторов программы,
• использовать условные и безусловные переходы,
• вводить циклы там, где это необходимо.
5.1. Передача управления в программе
Операторы программы обычно выполняются последовательно, друг за другом. Тем не менее, часто возникает необходимость перехода к другой части программы в зависимости от выполнения определенного условия, а также повторного выполнения группы операторов некоторое количество раз. Для этого используются специальные инструкции языка Visual Basic, производящие передачу управления:
• условные переходы,
• безусловные переходы,
• циклы,
• вызовы подпрограмм.
Условные переходы проверяют одно или несколько условий и в зависимости от этого осуществляют выполнение того или иного блока операторов из нескольких возможных, либо вообще ни один из блоков не выполняется. Безусловные переходы передают управление безо всякой проверки.
Циклы дают возможность повторения несколько раз подряд части программы. Некоторые типы циклов делают фиксированное число повторений, другие – выполняются до тех пор, пока не будет выполнено заданное условие.
Подпрограммы будут рассматриваться в следующей главе.
5.2. Условный переход If…Then… Else
Наиболее часто встречается инструкция условного перехода If…Then… Else. В упрощенном варианте эта инструкция может располагаться в одну строку, тогда ее синтаксис будет следующим:
If условие Then инструкция [Else инструкция_else]
Ключевое слово If (Если) начинает строку. После этого находится условие, представляющее собой булево выражение, в зависимости от значения которого происходит выполнение последующих инструкций:
• если результат = True (Истина), то выполняется инструкция после Then (Затем),
• если результат = False (Ложь), то выполняется инструкция после Else (Иначе), а при отсутствии ключевого слова Else (Иначе) – ничего не выполняется.
Приведем несколько примеров использования упрощенного варианта условной инструкции If…Then… Else:
If 5
If Form1.Width <> 3800 Then Form1.Width = 3800
If Button = 2 Then PopupMenu mnuSelColor Else PSet (X, Y)
Гораздо более широкие возможности для программиста предоставляет блоковая форма синтаксиса инструкции If…Then… Else, которая допускает проверку не одного, а нескольких условий. В этом случае инструкции располагаются в несколько строк:
If условие Then
[инструкции]
[ElseIf условие-n Then
[инструкции_elseif]…
[Else
[инструкции_else]]
End If
Многое в блоковом синтаксисе похоже на предыдущую форму записи, но есть и отличия: если результатом проверки условия будет False (Ложь), то перед выполнением блока Else (Иначе) возможна проверка дополнительных условий с помощью ElseIf (Иначе Если). Весь блок завершается ключевым словом End If (Конец Если).
Вот пример, где дважды проверяется свойство Value (Значение) элемента управления HScrollBar (Горизонтальная полоса прокрутки). При достижении свойства Value (Значение) минимума (HScroll1.Value = HScroll1.Min) и максимума (HScroll1.Value = HScroll1.Max) выдаются соответствующие сообщения, в противном случае – происходят вычисления с использованием значения этого свойства:
If HScroll1.Value = HScroll1.Min Then
MsgBox «Достигнут минимум!»
ElseIf HScroll1.Value = HScroll1.Max Then
MsgBox «Достигнут максимум!»
Else
varY = varX / HScroll1.Value
End If
Инструкция условного перехода If…Then… Else может содержать внутри себя другие условные инструкции, причем допускается несколько уровней вложенности, например:
If varX> = 1 And varX <= 1000 Then
If varX <500 Then
MsgBox «Значение меньше 500»
ElseIf varX> 500 Then
MsgBox «Значение больше 500»
Else
MsgBox «Значение равно 500»
End If
Else
MsgBox «Исходное значение вне допустимого диапазона!»
End If
5.3. Условный переход Select Case
Условная инструкция Select Case по своим возможностям аналогична If…Then… Else, но, прежде всего, рассчитана на выбор одного варианта не из двух, а из нескольких возможных. Синтаксис инструкции Select Case следующий:
Select Case выражение
[Case список_значений_выражения-n
[инструкции-n]]…
[Case Else
[инструкции_else]]
End Select
Результат выражения, находящегося после ключевых слов Select Case, используется Visual Basic при выборе одного из блоков инструкций Case (Вариант). В начале каждого блока Case (Вариант) находится список допустимых значений. При совпадении одного из них с результатом выражения, выполняется именно этот блок Case (Вариант).
Данный список может содержать один или несколько элементов, разделенных запятыми, каждый из которых может быть:
• значением,
• выражением,
• диапазоном,
• оператором сравнения.
С непосредственными значениями и выражениями мы уже встречались. Диапазон использует ключевое слово To (До) и определяет множество допустимых значений, от минимального до максимального:
выражение_минимум To выражение_максимум
Примеры диапазонов:
1 To 5
varX To varX +20
Оператор сравнения обязательно содержит ключевое слово Is (Есть), которое олицетворяет текущий результат выражения:
Is оператор_сравнения выражение
Данный блок инструкций Case (Вариант) выполняется, если результатом оператора сравнения будет True (Истина). Примеры операторов сравнения:
Is <> 0
Is> varX
Блок инструкций Case Else (Другой вариант) выполняется, если Visual Basic не находит подходящего значения ни в одной из блоков Case (Вариант).
В следующем примере Select Case оценивает значение переменной Mark, которой до этого был присвоен номер школьной оценки в цифровом виде, и расшифровывает ее. Если значение переменной Mark отличается от допустимого (от одного до пяти), то выдается сообщение об этом.
Select Case Mark
Case 1
MsgBox «Единица»
Case 2
MsgBox «Двойка»
Case 3
MsgBox «Тройка»
Case 4
MsgBox «Четверка»
Case 5
MsgBox «Пятерка»
Case Else
MsgBox «Оценка введена неправильно!»
End Select
5.4. Безусловный переход GoTo
Инструкция GoTo выполняет безусловный переход к метке, расположенной в любой части текущей процедуры. Синтаксис безусловного перехода предельно прост:
GoTo метка
Метка является символьным идентификатором одного из операторов программы, используемым для передачи к нему управления. Она представляет собой комбинацию латинских букв и цифр, но должна состоять начинаться с буквы. В конце метки ставится символ двоеточия «:». Вот несколько образцов меток:
L2:
Good_Place:
ThisIsLabel800:
Несмотря на кажущуюся простоту, использование безусловных переходов крайне затрудняет понимание логики работы программы и увеличивает число ошибок. С другой стороны, алгоритмически доказано, что в любой программе можно обойтись без GoTo, применяя вместо этого инструкции If…Then… Else и Do… Loop.
Поэтому применение инструкции GoTo крайне не рекомендуется. Она поддерживается Visual Basic только для совместимости с предыдущими диалектами языка Basic.
5.5 Цикл For…Next
Цикл For…Next повторяет группу операторов программы нужное количество раз. Синтаксис данного цикла следующий:
For счетчик = начало To конец [Step шаг]
[инструкции]
[Exit For]
[инструкции]
Next [счетчик]
В качестве счетчика используется переменная, значение которой увеличивается или уменьшается при каждом выполнении цикла, проходя значения от начала до конца диапазона с заданным шагом.
По умолчанию при каждой итерации цикла переменная счетчика увеличивается на единицу, но с помощью ключевого слова Step (Шаг) это можно изменить. Переход на новую итерацию цикла осуществляется с помощью инструкции Next.
Досрочное завершение цикла возможно с помощью инструкции Exit For, которая иногда бывает необходима, например, при возникновении ошибки.
В случае применения оператора Exit For будет продолжаться выполнение других операторов программы, расположенных после цикла.
Например, следующий цикл подает звуковой сигнал 5 раз:
For i = 1 To 5
Beep
Next i
Инструкция For определяет переменную i в качестве счетчика цикла, а также ее начальное и конечное значение. Next каждый раз увеличивает переменную i на единицу.
Кстати, указание имени счетчика после Next не обязательно и обычно используется для облегчения понимания кода программы. Инструкция Beep единственная в теле цикла. Она производит короткий гудок.
Циклы могут быть многократно вложенными. Приведем пример такого цикла, где внутри одного цикла с переменной i вложен другой цикл с переменной j:
For i = 100 To 0 Step -10
For j = 1 To 20
varY = varY * (i / j)
Next j
If i <20 Then Exit For
Next i
5.6. Цикл For Each…Next
Немного похожий своим написанием на предыдущий, цикл For Each…Next повторяет набор операторов для каждого элемента массива или всех объектов одного семейства. Вот его синтаксис:
For Each элемент In группа
[инструкции]
[Exit For]
[инструкции]
Next [элемент]
Например, чтобы поочередно вывести на экран значения всех элементов массива MyArray, нужно написать следующий цикл:
For Each ArrItem In MyArray
Print ArrItem
Next
5.7. Цикл Do… Loop
Do… Loop – цикл, который выполняется до тех пор, пока не будет выполнено некоторое условие, указанное вначале или в конце цикла.
Он имеет следующий синтаксис (вариант проверки условия в начале):
Do [{While | Until} условие]
[инструкции]
[Exit Do]
[инструкции]
Loop
Допустима также другая форма написания этого цикла (вариант проверки условия в конце) :
Do
[инструкции]
[Exit Do]
[инструкции]
Loop [{While | Until} условие]
Итерации цикла (выполнение этого участка кода программы) будут продолжаются снова и снова, до тех пор, пока не будет выполнено одно из двух условий:
• условие, записанное после ключевого слова While (Пока [истина]), принимает значение False (Ложь),
• условие, записанное после ключевого слова Until (Пока не [истина]), принимает значение True (Истина).
Проверку условий можно делать как в начале, перед выполнением цикла, так и в конце, когда цикл был пройден хотя бы один раз.
Без указания условий цикл Do… Loop будет работать бесконечно. Поэтому для досрочного выхода из цикла можно применять инструкцию Exit Do.
В следующем примере иллюстрируется необходимость проверки условия в начале цикла, чтобы не возникла ошибка деления на ноль:
intDig1 = 5
Do While intDig1> 0
print 100 / intDig1
intDig1 = intDig1 – 1
Loop
5.8. Инструкция With
Инструкция With не является условием или циклом, а упрощает выполнение нескольких последовательных операций над одним объектом, помогая избежать повторного задания его имени.
В следующем примере форма Form1 позиционируется на экране и устанавливается ее размеры.
With Form1
.Left = 3500
.Top = 2500
.Width = 4000
.Height = 3000
End With
Глава 6. Процедуры и функции
В этой главе вы научитесь:
• разбираться в разновидностях подпрограмм,
• создавать собственные подпрограммы,
• использовать встроенные процедуры и функции.
6.1. Разновидности процедур
В предыдущей главе мы познакомились с возможностью изменения последовательности операторов программы с помощью условных инструкций и циклов. Сюда же можно отнести и инструкции вызова процедур.
Процедурой (Procedure) в языке Visual Basic называется именованная часть программы, которая вызывается, выполняет определенные действия и возвращает управление в строку, следующую за точку вызова.
Различают следующие основные разновидности процедур:
• обработки событий,
• общего назначения,
• встроенные.
Процедуры обработки событий (Event Procedures) вызываются самим Visual Basic, когда происходят определенные события, связанные с элементами управления. В главе 2 мы уже составляли текст таких процедур, занимающихся обработкой события Click (Щелчок) кнопок cmdHello и cmdExit.
Процедуры общего назначения (General Procedures) не привязаны ни к каким событиям или объектам. Необходимость в их написании возникает, когда в разных частях программы приходится использовать одну и ту же последовательность операторов. Тогда пишется одна процедура общего назначения, а в нужных точках программы вставляются инструкции вызова этой процедуры. Использование процедур общего назначения улучшает читаемость текста программы, а также уменьшает число ошибок.
Встроенные процедуры (Built-In Procedures) поставляются уже готовыми в комплекте Visual Basic. Они выполняют все наиболее часто требуемые операции, но их внутренняя структура скрыта от программиста. Встроенные процедуры вызываются из основной программы так же, как и процедуры общего назначения. Методы и свойства стандартных объектов, также являются встроенными процедурами, однако они могут использоваться только применительно к этим объектам.
Обобщенный синтаксис инструкции вызова процедуры (Procedure Call) выглядит следующим образом:
имя_процедуры [(список_аргументов)]
Аргументы (Arguments), иначе именуемые параметрами (Parameters), представляют собой выражения, значения которых используются в процедуре и влияют на результаты ее работы. Процедуры, не требующие входных параметров, вызываются без аргументов.
Особенности использования процедур в программе зависит еще и от того, возвращают ли они какие-нибудь значения или нет. По этому признаку все процедуры делятся на две разновидности:
• Sub (Подпрограмма) – не возвращающие значения,
• Function (Функция) – возвращающие значения.
Инструкции вызова процедур Sub (Подпрограмма) пишутся отдельной строкой. Вызов Function (Функция) обязательно должен находиться на месте одного из параметров оператора языка Visual Basic или аргумента другой процедуры, где обычно может располагаться выражение.
Основное различие в синтаксисе вызова процедур различных видов заключается в том, что перечень аргументов процедуры Sub (Подпрограмма) приводится без скобок, а у Function (Функция) – он заключен в круглые скобки.
Примеры вызовов процедур различного типа:
MySub 5, varX +3, varY / varX
Form1.Caption = Now ()
Первой строкой вызывается процедура общего назначения MySub, которой передается три параметра. Во второй строке полученное значение встроенной функции Now без параметров, возвращающей текущую системную дату и время, присваивается свойству Caption (Заголовок) формы Form1.
А теперь перейдем к более подробному рассмотрению процедур общего назначения, которым посвящена данная глава.
6.2. Процедура Sub (Подпрограмма)
Процедура Sub (Подпрограмма) представляет собой последовательность операторов языка Visual Basic, выполняющая определенные действия, не возвращающая значений. Синтаксис объявления подпрограммы следующий:
[{Private|Public}] [Static] Sub имя ([список_аргументов])
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Ключевое слово Private (Частная) указывает на то, что данная процедура видна только внутри текущего модуля, а Public (Общая) делает ее общедоступной.
Другое ключевое слово Static (Постоянный) информирует Visual Basic о необходимости сохранения значений внутренних переменных между вызовами процедуры, хотя от этого они и не становятся видимыми для других подпрограмм.
Процедура Sub (Подпрограмма) может получать входные данные – аргументы, которые перечисляются в круглых скобках. Если аргументы отсутствуют, круглые скобки должны оставаться пустыми.
Необязательная в использовании инструкция Exit Sub (Выход из подпрограммы) позволяет досрочно завершить работу процедуры в тех случаях, когда это вам бывает необходимо.
Пример определения общедоступной процедуры Sub (Подпрограмма) общего назначения, которая выдает нужное количество гудков:
Public Sub Trill (intCount As Integer) ‘ начало процедуры
If intCount <1 Then Exit Sub ‘ если intCount <1, то выходим
For i = 1 To intCount ‘ цикл For… Next от 1 до intCount
Beep ‘ подача звукового сигнала из динамика компьютера
Next ‘ переходим к следующей итерации цикла For… Next