Цикли у Visual Basic (продовження)

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.

  1. Нехай зображення, яке рухається екраном в попередніх задачах, через деякий час зупиниться.

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 і так далі до тих пір, поки камінь не впаде на землю.

 

Бажаємо успіхів!

=)))

Цикли у Visual Basic (теорія)

  1. Циклічні програми.

Ідею циклу можна пояснити на прикладі руху об’єктів по екрану. Візьмемо гру в повітряний бій. Літачок по екран повинен рухатись. Але в списках операторів більшості мов програмування немає команди руху.

Тут постає питання – а що ж таке рух? Розглянемо ілюзію руху, яка виникає на екрані кінотеатру. Якщо ви тримали колись в руках кіноплівку, то помічали, що вона складається з багатьох нерухомих кадрів, на яких зображення кожного разу трішки змінюється. Демонструючи ці кадри з великою швидкістю, ми створюємо ілюзію руху. Так само утворюється рух на екрані комп’ютера.

Запишемо алгоритм руху літака по екрану зліва направо.

  1. Задаємо комп’ютеру позицію літака в лівій частині екрану.
  2. Зображуємо літак.
  3. Переглядаємо
  4. Змінюємо позицію літака на міліметр вправо
  5. Переходимо до команди 2.

 

Кожна з цих команд легко програмується на будь-якій мові програмування. Кожен комп’ютер, виконавши чергову команду, переходить до наступної. Виконавши команду 2, комп’ютер переходить до команди 3. Але ми можемо змінити порядок, що ми і зробили в пункті 5. Таким чином деякі команди повторюються багатократно.

Така багатократно виконувана послідовність називається циклом.

Можна сказати, що цикл – це один із засобів змусити комп’ютер довго працювати за допомогою короткої програми.

В короткому проміжку часу після виконання команди 2 літак буде з’являтись на екрані і на команді 3 зникати, але цього достатньо, щоб людське око його побачило.  Завдяки циклу літак буде «мигати» кожного разу в іншому місці, а так як зміна кадрів відбувається з високою швидкістю, нам буде здаватись, що відбувається плавний рух.

Але не потрібно думати, що цикли застосовуються лише при оформленні рухомих об’єктів. Вони пронизують все програмування.

2. Оператор  переходу GoTo. Мітки.

Поглянемо, як реалізувати в Visual Basic. Допустимо, що ми хочемо щоб комп’ютер нескінченно повторював виконання такого фрагменту.:

 

Debug.Print «Це «;

Debug.Print «тіло «;

Debug.Print «циклу»;

Debug.Print »       «;

в результаті чого ми у вікні виведення результатів побачили б:

Це тіло циклу      Це тіло циклу   Це тіло циклу   Це тіло циклу   …

Якби оператори Visual Basic можна було б писати українською мовою, то конструкція повторення виглядала б так:

мітка m1: Debug.Print  «Це » ;
Debug.Print  «тіло » ;
Debug.Print  «циклу» ;
Debug.Print  »       » ;
йти (повернутися) до оператора, поміченого міткою m1

Тут ми бачимо новий оператор «йти», робота якого полягає в «перескакуванні» до виконання оператора Debug.Print  «Це » , поміченого міткою m1.

А ось так цей фрагмент виглядає на Visual Basic:

Private Sub Command1_Click()

m1: Debug.Print «Це «;

Debug.Print «тіло «;

Debug.Print «циклу»;

Debug.Print »       «;

GoTo m1

End Sub

Тут GoTo — оператор безумовного переходу, перекладається, як «йти до», m1 — мітка.

Мітка — це довільне ім’я. Оператор GoTo можна писати в будь-яких місцях процедури. Мітку можна ставити перед будь-яким оператором процедури, змушуючи таким чином комп’ютер переходити до потрібного рядка. Мітка повинна закінчуватись двокрапкою.

Зациклення. Якщо запустити цю програму, то через деякий час виникне проблема виходу з цієї програми. Кнопки не реагують на мишу і клавіатуру. Відбулося зациклення.  Для переривання роботи програми можна скористатися комбінацією Ctrl-Break. Програма перериває свою роботу, але не закінчує, вона знаходиться в режимі переривання.

Група операторів, які виконуються багатократно називається тілом циклу. У нас це всі оператори, починаючи з Debug.Print  «Це »  та закінчуючи GoTo m1.

 

Завдання 1: Визначити без комп’ютера, що буде друкувати програма:

n = 10

k = 0

Debug.Print «Рахуємо зайців»

m5: Debug.Print n;

n = n + k

GoTo m1

n = n + 1

m1:      Debug.Print «зайців»

k = k + 1

GoTo m5

Debug.Print «Порахували зайців»

Давайте переглянемо програму в покроковому режимі (F8).

 

Задача: Нескінченно друкувати  200  205  210  215   220   225   …

Програма:

Private Sub Command1_Click()

n = 200

m1:   Debug.Print n

n = n + 5

GoTo m1

End Sub

 

Завдання 2-4:

Написати програми для виконання таких завдань:

  1. Нескінченно друкувати літеру А:    ААААААААААА…..
  2. Нескінченно друкувати 10000   9999   9998   9997   9996 ……
  3. Нескінченно друкувати 100   50   25   12.5…. с 8 десятковими знаками.

 

Рух об’єктів по екрану

Вам вже доводилось змушувати рухатись кнопки по екрану. Спробуємо тепер досягти плавного руху об’єкту. Створіть проект з великою формою та додайте на нього елемент керування Image. Помістіть його в лівій частині форми. Надайте йому картинку  (властивість Picture).

Напишемо програму, яка б рухала зображення плавно направо:

Dim x As Double

Private Sub Command1_Click()

x = Image1.Left   ‘комп’ютер визначає, звідки починати рух

m1: x = x + 1      ‘комп’ютер збільшує горизонтальну координату на 1

Image1.Left=x ‘зображення стає на нове місце

GоTo m1

End Sub

Якщо рух виходить сильно повільним, то треба збільшити крок – x=x+2. Якщо сильно швидким – зменшити (x=x+0.3)

 

Завдання 5:   Створіть програму, яка буде переміщати зображення наліво, вгору, вниз.

Поки що ми не можемо ніяк впливати на рух, а можемо лише зупиняти комп’ютер з клавіатури. Як запрограмувати зупинку програми в певному місці?

Домашня робота №5. Розгалуження в Pascal.

«Розгалуження в Паскаль»

1.  Чи істинний простий логічний вираз х > 10, якщо:

а) х=0 (відповідь: ні); б) х=2; в) х=10; г) х=5; д) х=15?

2. Чи буде хибним вираз х >= 10, якщо:

а) х=1 (відповідь: так); б) х=3; в) х=10; г) х=12; д) х=25?

3. Усно. Який результат (m = ?) виконання програми Ех1, якщо ввести значення k так: а) 3; б) 4 ; в) 0;  г) 2; д) -2?

program Exl;

var k, m: integer; begin

write(‘Введіть к’);

readln(k);

m := 7;

if k > 2 then m := k*k;

if k < 2 then m := k+5;

writeln(m);

end.

 

4. Запишіть умову того, що число а є:

а) парне; б) ділиться без остачі на 3; в) не ділиться без остачі на 3; г) непарне.

5. Ціну товару позначено змінною с. Яка умова того, що ціна:

а) не перевищує 20 грн;  б) більша від 10 грн;  в) 12 грн.?

6. Уведіть два числа. Виведіть на екран менше число. Складіть блок-схему алгоритму і програму.

7. Уведіть два числа і більше замініть добутком цих чисел. Складіть блок-схему алгоритму і програму.

8. Уведіть ціле число з діапазону 2..5. Виведіть його словом. Складіть програму.

9. Уведіть число — номер дня тижня. Виведіть слово — назву цього дня. Складіть програму.

10. Написати програму розв’язання квадратного рівняння.

11. Задача про оптову покупку. Один диск коштує 10 грн, а блок з 10 дисків — 90 грн. Як оптимально виконати покупку дисків на суму S (S>100) грн? Уведіть S, виведіть кількість блоків та окремих дисків.

 

Таблиця варіантів

в-ту

Номери завдання

1

1(в), 2(б), 3(а), 4(а), 5(а), 6, 10

2

1(б), 2(д), 3(б), 4(б), 5(б), 7, 11

3

1(в), 2(г), 3(г), 4(в), 5(в), 8, 10

4

1(г), 2(в), 3(в), 4(г), 5(а), 9, 11

5

1(д), 2(б), 3(д), 4(в), 5(б), 6, 10

6

1(г), 2(в), 3(а), 4(б), 5(в), 7, 11

7

1(б), 2(д), 3(г), 4(а), 5(а), 8, 10

8

1(в), 2(г), 3(д), 4(г), 5(б), 9, 11

9

1(г), 2(в), 3(б), 4(а), 5(в), 6, 10

10

1(д), 2(б), 3(в), 4(б), 5(а), 7, 11

11

1(г), 2(д), 3(а), 4(в), 5(б), 8, 10

12

1(б), 2(д), 3(д), 4(г), 5(в), 9, 11

13

1(в), 2(г), 3(в), 4(д), 5(а), 6, 10

14

1(г), 2(в), 3(г), 4(в), 5(б), 7, 11

15

1(д), 2(б), 3(б), 4(г), 5(в), 8, 10

16

1(б), 2(в), 3(а), 4(а), 5(а), 9, 11