
Операторы циклов
Воператорах циклов последовательность операторов повторяется заданное число раз или согласно условию.
ВVB существуют три вида циклов:
• |
счетные циклы: |
|
For…To … Next, For Each … in … Next; |
• |
циклы с предусловиями: |
|
Do While...Loop, Do Until...Loop, While…Wend; |
• |
циклы с постусловиями: |
|
Do...Loop While, Do...Loop Until. |
Счетный цикл циклически выполняет набор операторов заданное число раз. Синтаксис первого счетного цикла следующий:
For счетчик = начало To конец [Step шаг] [операторы1]
[Exit For] [операторы2] Next [счетчик]
Счетчик – это числовая переменная (целого, вещественного типа или типа Date, Variant, Currency), которая автоматически увеличивается или уменьшается после каждого повтора на величину шага. Начальное значение счетчика равно параметру начало, а конечное – параметру конец. Если часть Step шаг не указана, то шаг изменения счетчика считается равным 1. Значение шага может быть положительным или отрицательным целым, или вещественным числом.

Пример. Вычислить сумму конечного ряда
S = ∑sin(ia) |
=sin(a)+ sin(2a)+ sin(3a)+K+ sin(100a) |
|||||||
100 |
|
|
|
|
|
|
|
|
i =1 |
i |
2 |
3 |
100 |
|
Private Sub Command1_Click()
Dim a As Double, i As Byte, s As Double a = Text1
s = 0
For i = 1 To 100
s = s + Sin(a * i) / i Next
Text2 = s
End Sub
Private Sub Form_Load()
Text1 = ""
Text2 = ""
Caption = "Сумма конечного ряда"
End Sub

Далее в цикле для каждого значения i, который меняется от 1 до 100 с шагом 1, вычисляются члены последовательности и накапливаются в ячейке s. После цикла значение ячейки s выводится в текстовое поле.
Пример. Определить площадь заштрихованной фигуры.
Для нахождения площади сложной фигуры используем метод Монте-Карло, который основан на случайном розыгрыше некоторого события и проверке его принадлежности некоторой области или диапазону. В нашем случае случайными событиями будут сгенерированные координаты точек в пределах прямоугольника, охватывающего заштрихованную область, при этом сама заштрихованная область определяется уже известным нам способом на основе логических операций. Для подсчета количества точек, попавших в область, будем использовать переменную-счетчик. Площадь заштрихованной области определим по приближенной формуле: R≈S×C/N, где S – площадь прямоугольника; C – количество точек, попавших в область (счетчик); N
– общее число сгенерированных точек.
Private Sub Command1_Click()
Dim x As Single, y As Single, N As Long, С As Long Dim a As Boolean, b As Boolean
N = InputBox("Число точек генерации", _
"Метод Монте-Карло",100000) C = 0 'С – счетчик точек, попавших в область
'N – общее число сгенерированных точек 'x,y – координата точки в пределах фигуры
For i& = 1 To N x = Rnd * 10 – 5 y = Rnd * 4 - 2
a = x ^ 2 / 25 + y ^ 2 / 4 <= 1
b = x ^ 2 + y ^ 2 >= 4 'a и b – это области If a And b Then C = C + 1
Next
R! = 10 * 4 * C / N

'S=10*4 – площадь прямоугольника
'R – площадь искомой области
Print vbCrLf & Space(5) & "S = " & R
End Sub
Private Sub Form_Load()
Caption = "Площадь фигуры" Command1.Caption="Запуск" : Image1.BorderStyle = 1 Image1.Picture = LoadPicture("C:\1.bmp")
End Sub
Второй счетный цикл For Each … Next позволяет
повторить выполнение группы операторов для каждого элемента массива и коллекции объектов. Данный оператор имеет следующий синтаксис.
For Each элемент In группа [операторы]
Next [элемент]
Элемент – это переменная, которая представляет элемент коллекции или массива объектов. Группа
– это имя массива или имя коллекции объектов. Операторы выполняются только один раз для каждого элемента группы. В этом операторе не требуется заранее знать, сколько элементов содержится в массиве или коллекции. В следующем фрагменте кода показано, как можно изменить свойство BackColor у всех меток (Label) и у всех полей с именем Text1, образующих массив объектов, лежащих на форме.
Private Sub Command1_Click()
Dim x As Object, i As Integer For Each x In Me.Controls
'Me - это активная форма, Me.Controls - обращение к ' коллекции объектов, размещенных на форме
If TypeName(x) = "Label" Then x.BackColor = vbRed
End If
Next x
For Each x In Text1 If x.Index = i Then
x.BackColor = CLng(Rnd * 16777215) i = i + 1
End If
Next x
End Sub

Операторы циклов с условиями Do…Loop имеют четыре синтаксические конструкции. В них все <Операторы1> выполняются заданное количество раз в зависимости от условия, а все <Операторы2> только один раз.
Часть Do While <условие> определяет повтор
<Операторов1> цикла, продолжающийся пока условие истинно, а часть Do … Until <условие> –
до истинности условия.
Например, в 1-й синтаксической конструкции: C = 100
Do While C > 0
………….
C = C –1 Loop
При C=100, условие цикла выполнится (имеет значение True), и произойдет вход в цикл. В нем выполняются какие-либо действия, и уменьшается значения C на 1. Далее вновь происходит проверка условия, и операторы повторно выполняются (всего они выполнятся 100 раз), пока C>0. Когда же это условие становится ложным (то есть становится C=0), то цикл прекращается.
При использовании 2-й конструкции:
C = 100
Do Until C = 0
………….
C = C –1 Loop
цикл будет выполняться до выполнения условия C = 0, то есть пока условие равно False, а когда оно станет True, цикл прекратится.
Пример. Найти сумму и количество членов бесконечного ряда с точностью ε =10^-4:
∞ |
1 |
|
1 |
|
1 |
|
1 |
|
|
S =∑ |
=1+ |
+ |
+ |
+KK |
|||||
n |
2 |
4 |
8 |
||||||
n=0 |
2 |
|
|
|
|
Private Sub Command1_Click()
Const e As Double = 0.0001
Dim S As Double, n As Integer, y As Double y = 1
'Присвоим y значение большее e для того, 'чтобы войти в цикл
Do While y >= e |
'можно также записать Do Until y < e |
y = 1 / 2 ^ n |
|
S = S + y : |
n = n + 1 |
Loop |
|
Text1 = n : |
Text2 = S |
End Sub |
|
Private Sub Form_Load()
Caption = "Сумма бесконечного ряда"
Command1.Caption=”Вычислить”
End Sub

Синтаксические конструкции циклов 3 и 4 очень похожи на первые два, за исключением того, что условие в них не проверяется до тех пор, пока цикл не выполнится хотя бы один раз.

Пример. Найти с точностью ε=10^-5 количество членов бесконечного
ряда S с промежуточным выводом результата поиска.
•Вычисления будем продолжать до тех пор, пока не выполнится условие =|cos(1)-S|≤ε.
Итерационный процесс вычисления погрешности показан на рисунке.
∞ |
|
n |
= cos(1) |
S =1+∑(− |
1) |
||
= |
(2n)! |
|
|
n 1 |
|
|
|

Так как каждый член последовательности зависит от
факториала, что, несомненно, замедлит вычислительный процесс, то для его ускорения получим рекуррентную формулу, связывающую два соседних члена последовательности общим шагом. Для этого запишем n-й и n+1 члены последовательности и определим шаг (t):
U n = |
(−1)n |
U n+1 = |
(−1)n+1 |
t = |
U |
|
−1 |
|||
|
, |
|
, |
n |
= |
|
, |
|||
(2n)! |
(2n +2)! |
U n+1 |
(2n +1)(2n +2) |
откуда U = −U n . n+1 (2n +1)(2n +2)
Из последнего выражения следует, что очередной член последовательности определяется на основе предыдущего, умножением его на величину шага, который сам зависит от n. Лишь после вычисления Un+1 должно следовать увеличение счетчика n на единицу для вычисления очередного члена.
Private Sub Command1_Click()
s! = 1 |
' Первый член последовательности |
n% = 1 |
' Начальное значение счетчика |
u! = -1 / 2 ' 2-ой член последовательности |
|
s = s + u |
' Заносим его в ячейку суммы |
y! = Cos(1) |
' Точное решение – предел суммы |
s1$ = CStr(n) & vbCrLf
s2$ = CStr(u) & vbCrLf
s3$ = CStr(s) & vbCrLf
s4$ = CStr(y) & vbCrLf Do
u = -u/(2 * n + 1)/(2 * n + 2) s = s + u
n = n + 1
s1$ = s1 |
+ CStr(n) & vbCrLf |
s2$ = s2 |
+ CStr(u) & vbCrLf |
s3$ = s3 |
+ CStr(s) & vbCrLf |
s4$ = s4 |
+ CStr(y) & vbCrLf |
Loop Until Abs(y - s) < 0.00001 |
'можно также записать Loop While Abs(y - s)>=1E-5
Text1 = s1 |
: |
Text2 = s2 |
Text3 = s3 |
: |
Text4 = s4 |
End Sub
Private Sub Form_Load()
Text1 = "" |
: |
Text2 = "" |
Text3 = "" |
: |
Text4 = "" |
Caption = "Сумма бесконечного ряда"
Command1.Caption = "Вычисление"
Command2.Caption = "Выход"
End Sub

Private Sub Command2_Click()
End
End Sub
Чтобы получить результат, как на рисунке, необходимо текстовые поля Text1, Text2, Text3, Text4 настроить в режиме конструирования с помощью свойств MultiLine=True и ScrollBars=Vertical.
Константа vbCrLf проставляет в конце строки символы возврата каретки (перевода курсора на начало строки) и перевода строки (перевода курсора на следующую строку) для формирования новой строки многострочного варианта вывода текстового сообщения. Таким образом, она программным способом формирует процесс нажатия на клавишу Enter.
Всинтаксических конструкциях рассмотренных циклов есть операторы безусловного выхода Exit For и Exit Do, позволяющие передать управление оператору, находящемуся за циклом.
Например, в следующем фрагменте кода накаплива-
ется сумма случайных чисел до тех пор, пока она не станет больше 100, тогда произойдет выход из бесконечного цикла и печать значений s и n:
Do While True s = s + Rnd
n = n + 1
If s > 100 Then Exit Do Loop
Text1 = s & " , n= " & n
Цикл While…Wend является разновидностью оператора Do … Loop с синтаксисом 1. Он применялся в ранних версиях VB и имеет следующий синтаксис:
While <условие> <Операторы>
Wend 'У этого цикла нет Exit Do и условия в конце
Пример. Подсчитать 100 раз сумму случайных чисел и распечатать ее только тогда, когда она окажется кратной трем, иначе повторять процесс бесконечно. Случайные числа определить из диапазона от –50 до 50.
Согласно условию задачи в программе должны быть реализованы два цикла. Первый (внешний) цикл продолжается до тех пор, пока сумма, накапливаемая во втором (внутреннем) цикле, не станет кратной 3. Проще всего выход из внешнего цикла организовать с помощью специальной логической переменной (f), которая вначале имеет значение False, а когда сумма становится кратной 3, ее значение изменится на True и программа завершится.
Private Sub Command1_Click()
Dim S As Long, n As Integer, f As Boolean, i As Integer
'Инициализируем генератор случайных чисел, чтобы при
'каждом новом запуске программы получалось новое число
Randomize f = False While Not f
S = 0 'Сумма сбрасывается в цикле, если она не кратна 3
For i = 1 To 100
n = Rnd * 100 – 50
S = S + n Next i
If S Mod 3 = 0 Then f = True |
' Проверка на выход |
Wend |
|
Text1 = S |
|
End Sub |
|