Цикли типу Do – Loop While
Щоб виконати тіло циклу хоча б один раз, необхідно використовувати другу форму оператора типу Do While. У даному випадку умова міститься наприкінці циклу, після ключових слів Loop While. Таке розміщення умови вказує на програму, що вона повинна спочатку виконати оператори циклу, а потім перевірити умову на істинність. Нижче наведено фрагмент коду, визначальним чи число простим (просте число ділиться без залишку тільки одиницю і саме собою).
Dim N as Long ‘задане число
Dim D as Long 'ділитель
Dim Sim as Boolean 'прапор простого числа
N = txtN 'зчитування числа з текстового поля txtN
S = True 'число є простим
D = 2 'початкове значення дільника
Do 'початок циклу
If N mod D = 0 Then S = False Якщо число N ділиться без залишку на D,
Що число N непросте
D = D + 1 'збільшення дільника на одиницю
Використовуючи цю форму оператора типу Do While, будьте особливо уважні, оскільки тіло циклу виконується вперше без перевірки зазначеної умови. Якщо тіло циклу містить оператори , які можуть виконуватися з помилками, краще використовувати оператор циклу з передумовою.
Увага! Не вставляйте умову одночасно в початок і кінець циклу, після ключових, слів Do While та Loop While, оскільки це викликає помилку в момент запуску програми.
Цикли типу Do Until
Цикли типу Do Until працюють аналогічно до розглянутих вище циклів Do While за одним винятком. Тіло циклу типу Do Until буде виконуватися тільки якщо умова буде помилковим,тоді як цикли типу Do While виконуються тільки у разі істинності умови. Таким чином, як тільки умова стає дійсною, цикл типу Do Until припиняє свою роботу. Так само як і дляЦикл типу Do While, існує дві форми циклів типу Do Until. Вони відрізняються місцем розташування умови - в заголовку циклу (в операторі Do Until), або наприкінці циклу (в операторі Loop Until). Якщо умова знаходиться на початку циклу в операторі Do, воно перевіряється перед виконанням циклу. Якщо ж умова міститься наприкінці циклу, в операторі Loop, воно перевіряється після виконання циклу. Таким чином, в останньому випадку цикл буде виконаний хоча б один раз, тоді як у першому випадку він може жодного разу не виконуватися.
Нижче наведений фрагмент коду зчитує значення позитивного цілого числа з текстового поля txtN, розкладає це число на прості множники і додає ці множники до списку lstMul.
Dim N as Integer ‘задане число
Dim D as Integer 'ділитель
N = txtN 'зчитування числа з текстового поля txtN
D = 2 'початкове значення дільника
Do 'початок циклу
Do While N mod D = 0 'доки залишок від розподілу N на D дорівнює нулю
N = N \ D 'цілочисленний поділ N на D
lstMul.AddItem D ‘додавання D до списку
Loop ‘кінець оператора циклу
D = D + 1 'збільшення дільника на одиницю
Loop Until N = 1 вийти з циклу, якщо N = 1
Наведений фрагмент коду містить два цикли, вкладені один в одного. Зовнішній цикл (Do … Loop Until N = 1) є циклом із постумовою. Він виконується принаймні один раз і виконується до тих пір, поки N не стане рівним одиниці. Умова (N = 1) є умовою виходу із циклу. Зовнішній цикл містить внутрішній цикл та оператор збільшення дільника D на одиницю.
Внутрішній цикл (Do While N mod D = 0…Loop) є циклом із передумовою. Він перевіряє, чи ділиться число N на D націло і, якщо ділиться, то ділить два числаодин на одного і додає значення дільника D до списку lstMul. Ці операції продовжуються доти, доки число N не перестане ділитися на число D.
Якщо N = 180, воно двічі буде поділено на 2, двічі на 3, жодного разу на 4 і один раз на 5. Після цих операцій N стане рівним одиниці, і фрагмент коду завершить роботу. В результаті список міститиме рядки зі значеннями 2, 2, 3, 3, 5. Не важко бачити, що ці числа є простими та їх добуток дорівнює 180.
У наступному фрагменті коду в процедурі перевірки введених даних програма пропонує користувачеві ввести число у вікні введення InputBox, поки він цього не зробить.
Private Sub txtN_Validate (Cancel As Boolean)
Do Until IsNumeric ( txtN ) 'доки txtN – не число
'пропонує у вікні введення ввести число та передає його в поле txtN
txtN = InputBox ( "Введіть число", "Помилка", 5)
Loop ‘кінець оператора циклу
Цикли типу While-Wend
Порада. Рекомендуємо при наборі тексту програми робити відступи для операторів, розташованих усередині циклу або будь-якої іншої конструкції (наприклад, у блоці If...Then...Else або між службовими словами For...Next). Це покращить сприйняття програми. Для створення відступу на початку рядка натисніть клавішу Таb, Після введення поточного оператора та натискання клавіші Enter для переходу на наступний рядок, Visual Basic автоматично помістить курсор прямо під попереднім оператором, дотримуючись таким чином рівня відступу (або вкладеності) операторів. Для зміщення кількох рядків вправо виділіть їх та натисніть клавішу Tab, для зміщення вліво Shift+Tab. Намагайтеся завжди виділяти за допомогою відступів початкові та кінцеві оператори блоку коду, як це зроблено у всіх прикладах цієї книги.
Перерахованіцикли
Visual Basic передбачає ще один варіант циклу, що починається з ключових слів For Each. Це так званий тип циклу, оскільки він використовується для обробки кожного елемента деякого набору об'єктів. Набори об'єктів можуть зберігатися у вигляді колекцій.
Як один з прикладів колекцій можна навести колекцію Printers. Це вбудована колекція Visual Basic, де у вигляді об'єктів зберігаються всі встановлені у системі принтери. У наведеному нижче фрагменті програми цикл типу For Each використовується для виведення значення властивості DeviceName всіх системних принтерів.
Dim objPrinter As Printer
For Each objPrinter In Printers
Цикли типу For Each можна використовувати для обробки елементів управління у формі, як показано нижче на прикладі.
For Each ctrl In frmMain 'для кожного елемента управління у формі frmMain
If Left ( ctrl.Name , 3 ) = "txt" Then ‘якщо ім'я елемента управління починається з "txt"
'Встановити колір фону елемента управління такий самий, як і у форми frmMain
ctrl.Locked = True ‘заблокувати елемент керування
End If ‘кінець умовного оператора
Next ctrl ‘перехід до наступного елемента керування
Наведений фрагмент коду звертається до всіх елементів управління у формі frmMain і якщо ім'я елемента управління починається з підстроки “txt” (усі текстові поля, якщо ви дотримуєтеся угоди про стандартні префікси в іменах елементів управління), то колір фону елемента управління встановлюється таким самим, як та у форми frmMain. Крім того, всі текстові поля блокуються (користувач не зможе змінити вміст полів).