4. Вихід з циклу за допомогою IF
Отже, як нам запрограмувати завершення роботи циклу? Для цього треба застосувати оператор GoTo всередині оператора If.
Задача: За допомогою циклу надрукувати:
Початок рахунку 3 5 7 9 11 13 15 ….. 329 331 333 Кінець рахунку
Для зручності наладки програми змінимо завдання:
Початок рахунку 3 5 7 9 Кінець рахунку
Ось різні варіанти програми. Перший – найпростіший, а іншими ми будемо користуватися в майбутньому. Всі 4 варіанта виконують одні й ті ж дії, дуже схожі, але трохи відрізняються. Ось в цих відмінностях нам і потрібно розібратися.
Створимо проект з 4 кнопками та виконаємо в покроковому режимі всі 4 варіанти:
1 ВАРІАНТ (Do …. Loop While) |
2 ВАРІАНТ (Do …. Loop Until) |
Private Sub Command1_Click() Debug.Print «Початок рахунку»; f = 3 m: Debug.Print f; f = f + 2 If f <= 9 Then GoTo m Debug.Print «Кінець рахунку « End Sub |
Private Sub Command2_Click() Debug.Print «Початок рахунок»; f = 3 m1: Debug.Print f; f = f + 2 If f > 9 Then GoTo m2 Else GoTo m1 m2: Debug.Print «Кінець рахунку» End Sub |
В якому порядку виконуються оператори першого варіанту? Тут оператор GoTo m виконується три рази. На четвертий раз умова f<=9 стане неправильною і тому виконується не GoTo m, а наступний за If оператор Debug.Print «Кінець рахунку», тобто програми виходить з циклу і закінчує свою роботу.
3 ВАРІАНТ (Do While …. Loop) |
4 ВАРІАНТ (Do Until …. Loop) |
Private Sub Command3_Click() Debug.Print «Початок рахунку»; f = 3 m1: If f <= 9 Then GoTo m3 Else GoTo m2 m3: Debug.Print f; f = f + 2 GoTo m1 m2: Debug.Print «Кінець рахунку» End Sub |
Private Sub Command4_Click() Debug.Print «Початок рахунку»; f = 3 m1: If f > 9 Then GoTo m2 Else GoTo m3 m3: Debug.Print f; f = f + 2 GoTo m1 m2: Debug.Print «Кінець рахунку» End Sub |
Задача: Надрукувати пари чисел — 1 1001 2 1002 3 1003 ………….. 100 1100.
Програма:
Private Sub Command1_Click()
f = 1
m: s = f + 1000
Debug.Print f; s
f = f + 1
If f <= 100 Then GoTo m
End Sub
Завдання 6-10:
6. А. Надрукувати 1 2 3 4 . . . 99 100
Б. Надрукувати 100 99 . . . 3 2 1.
В. Надрукувати 1 2 3 4 . . . 99 100 99 . . . 3 2 1.
7. Обчислити та надрукувати з 6-ма десятковими знаками квадрати цілих чисел. 0.000 0.001 0.002 0.003 . . . 0.999 1.000.
8. Для х=2700, 900, 300, 100 . . . і т.д. обчислити та надрукувати y = x/4 + 20 та z=2y+0.23 до тих пір, поки yz не стане менше 1/x.
- Нехай зображення, яке рухається екраном в попередніх задачах, через деякий час зупиниться.
10. Зображення, пройшовши трохи зліва направо, повертає вниз та, пройшовши небагато шляху, через деякий час зупиняється.
5. Оператори циклу Do
Цикли настільки широко використовуються в програмах, що у програмістів давно з’явилась потреба написати спеціальний оператор циклу, який не використовуватиме оператор GoTo. Останній незручний хоча б тим, що у програмістів, які пишуть великі програми, багато часу йде на пошук поглядом міток в тексті програми.
До того ж GoTo порушує струнку ідеологію так званого «структурного програмування», коли порядок дій задається не стрибками по програмі, а ланцюжком вкладених один в одного операторів. Тобто, зараз широко використовувати оператор GoTo неправильно, так як і не оголошувати змінні (начебто і працює, але є ймовірність виникнення помилки)
Оператори циклу в Visual Basic поділяються на 2: Do и For. Оператори виду Do зустрічаються в 5 варіантах:
1 ВАРІАНТ |
2 ВАРІАНТ |
3 ВАРІАНТ |
4 ВАРІАНТ |
5 ВАРІАНТ |
Do …. Loop |
Do …. Loop While |
Do …. Loop Until |
Do While …. Loop |
Do Until …. Loop |
5.1 Оператор Do …. Loop
Спробуємо створити з використанням 1-го виду оператора Do програму розв’язку задачі про друк чисел 3 5 7 9 з попередніх завдань. Для того, щоб точно визначити роботу цього варіанта оператора Do, наведемо її паралельно зі зміненим варіантом програми розв’язку з того ж прикладу.
1 ВАРІАНТ |
1 ВАРІАНТ ОПЕРАТОРА Do |
Private Sub Command1_Click() |
Private Sub Command0_Click() |
Debug.Print «Початок рахунку»; |
Debug.Print «Початок рахунку»; |
f = 3 |
f = 3 |
m: |
Do |
Debug.Print f; |
Debug.Print f; |
f = f + 2 |
f = f + 2 |
GoTo m |
Loop |
End Sub |
End Sub |
Do можна перекласти, як «Виконуй», а розуміти можна просто як мітку. Loop можна перекласти, як «Петля» або «Повернення назад», а розуміти можна як «Повертайся до мітки Do».
Порядок роботи обох програм абсолютно однаковий, так що можна вважати слово Do заміною мітки m, а слово Loop вважати заміною оператора GoTo m. Обидві програми нескінченно друкують 3 5 7 9 11… Переривається цикл лише з клавіатури. Толку поки в цьому варіанті ми бачимо мало (поки що).
Синтаксис оператора Do …. Loop:
Do
оператори
оператори …
Loop
Рядки операторів між Do та Loop називаються тілом циклу.
5.2 Оператор Do …. Loop While
Складемо з використанням варіанта 2 оператора Do програму розв’язку про друк чисел 3 5 7 9 з попередніх завдань. Для того, щоб точно визначити роботу цього варіанта оператора Do, наведемо її паралельно з першим варіантом програми.
2 ВАРІАНТ |
2 ВАРІАНТ ОПЕРАТОРА Do |
Private Sub Command1_Click() |
Private Sub Command5_Click() |
Debug.Print «Початок рахунку»; |
Debug.Print » Початок рахунку»; |
f = 3 |
f = 3 |
m: |
Do |
Debug.Print f; |
Debug.Print f; |
f = f + 2 |
f = f + 2 |
If f <= 9 Then GoTo m |
Loop While f <= 9 |
Debug.Print «Кінець рахунку» |
Debug.Print » Кінець рахунку « |
End Sub |
End Sub |
While перекладається «Поки».
Отже, Loop While f <= 9 розуміти потрібно так, «Повертатися до мітки Do, поки f <= 9″.
Отже конструкцію Loop While f <= 9 можна вважати заміною оператора If f <= 9 Then GoTo m.
Синтаксис оператора Do …. Loop While:
Do
оператори
оператори …
Loop While умова продовження роботи циклу
5.3 Оператор Do …. Loop Until
3 ВАРІАНТ |
3 ВАРІАНТ ОПЕРАТОРА Do |
Private Sub Command2_Click() |
Private Sub Command6_Click() |
Debug.Print «Початок рахунку»; |
Debug.Print «Початок рахунку»; |
f = 3 |
f = 3 |
m1: |
Do |
Debug.Print f; |
Debug.Print f; |
f = f + 2 |
f = f + 2 |
If f > 9 Then GoTo m2 Else GoTo m1 |
Loop Until f > 9 |
m2: Debug.Print «Кінець рахунку» |
Debug.Print «Кінець рахунку» |
End Sub |
End Sub |
Until перекладається «До тих пір, поки». Отже, Loop Until f > 9 розуміємо, як «Повертайся до мітки Do до тих пір, поки не виконається умова f > 9».
Синтаксис оператора Do …. Loop Until:
Do оператори
Оператори …
Loop Until условие завершения работы цикла
5.4 Оператор Do While …. Loop
4 ВАРІАНТ |
4 ВАРІАНТ ОПЕРАТОРА Do |
Private Sub Command3_Click() |
Private Sub Command7_Click() |
Debug.Print «Початок рахунку»; |
Debug.Print «Початок рахунку»; |
f = 3 |
f = 3 |
m1: If f <= 9 Then GoTo m3 Else GoTo m2 |
Do While f <= 9 |
m3: Debug.Print f; |
Debug.Print f; |
f = f + 2 |
f = f + 2 |
GoTo m1 |
Loop |
m2: Debug.Print «Кінець рахунку» |
Debug.Print «Кінець рахунку» |
End Sub |
End Sub |
Do While f <= 9 розуміємо так: «Поки f <= 9 виконуй оператори до оператора Loop».
Синтаксис оператора Do While …. Loop:
Do While умова продовження роботи циклу
оператори
оператори …
Loop
5.5 Оператор Do Until …. Loop
4 ВАРІАНТ |
4 ВАРІАНТ ОПЕРАТОРА Do |
Private Sub Command4_Click() |
Private Sub Command8_Click() |
Debug.Print «Початок рахунку»; |
Debug.Print «Початок рахунку»; |
f = 3 |
f = 3 |
m1: If f > 9 Then GoTo m2 Else GoTo m3 |
Do Until f > 9 |
m3: Debug.Print f; |
Debug.Print f; |
f = f + 2 |
f = f + 2 |
GoTo m1 |
Loop |
m2: Debug.Print «Кінець рахунку» |
Debug.Print «Кінець рахунку» |
End Sub |
End Sub |
Do Until f > 9 розуміємо так: «Виконуй оператори, що записані нижче до Loop, до тих пір, поки не виконається умова f>».
Синтаксис оператора Do Until …. Loop:
Do Until умова завершення роботи циклу
оператори
оператори …
Loop
Задача: Комп’ютер пропонує користувачу ввести слово, після чого роздруковує слово, додавши до нього знак оклику. Потім знову пропонує ввести слово і так до тих пір, поки людина не надрукує «Досить». Роздрукувавши його зі знаком оклику, комп’ютер друкує «Досить, так досить» і закінчує роботу.
Візьмему рядкову змінну, в яку буде записуватись слово, введене з клавіатури. Назвемо її Slovo.
Dim Slovo As String
Private Sub Command1_Click()
Do
Slovo = InputBox(«Введіть слово»)
MsgBox(Slovo & «!»)
Loop Until Slovo = «Досить»
MsgBox(«Досить так досить»)
End Sub
Завдання 11: Змінимо задачу. Нехай комп’ютер перед тим, як роздрукувати кожне слово додає його порядковий номер.
Завдання 12-13: Виконати з використанням оператора Do завдання 7 та 10 з попереднього переліку.
Завдання 14: якщо камінь кинути горизонтально зі 100-метрової вежі зі швидкістю v=20м/с, то його відстань від вежі по горизонталі s буде виражатися формулою s=vt, где t – час польоту каменя в секундах. Висота над землею h буде виражатись формулою h=100 – 9.81t2/2. Обчислювати та друкувати t, s та h для t = 0, 0.2, 0.4, 0.6 і так далі до тих пір, поки камінь не впаде на землю.
Бажаємо успіхів!
=)))