У цьому уроці ми навчимося реалізовувати повторення, для яких зарані відома їх кількість
В нашому реальному житті нам часто доводиться не тільки приймати рішення, що робити, в залежності від обставин, а й, інколи, виконувати одну й ту саму дію декілька разів. Прикладів таких повторюваних дій можна наводити величезну кількість: щоранку, коли ми снідаємо, ми робимо один і той самий рух ложкою, коли йдемо до школи, повторюємо одні й ті самі рухи ногами, а в школі теж маємо повтори: дзвоник → урок → дзвоник → перерва → дзвоник → урок → ... і так далі.
Ви вже знаєте, що такі повторювані процеси називаються циклічними, а сукупності цих взаємопов'язаних процесів, що утворює закінчене коло дій - циклами. Під закінченим колом дій розуміють такий їх перелік, після якого весь цей перелік знову повторюється спочатку.
Так, в останньому прикладі закінченим колом дій є перелік:
Після перерви знову лунає дзвінок і знову починається урок, а потім знову дзвінок і знову перерва і так по колу. Після кроку 4 усе знову повертається до виконання кроку 1 і т.д.
В програмуванні будь-який цикл складається з двох частин:
Розберемося з найочевиднішим і найпростішим типом циклів - цикл з лічильником.
Такі цикли використовуються тоді, коли зарані ВІДОМА КІЛЬКІСТЬ ПОВТОРІВ.
Якщо у вас сьогодні шість уроків, тоді тіло циклу
дзвоник
урок
дзвоник
перерва
повториться шість разів.
Блок-схема циклу з лічильником має такий вигляд:
Пригадаймо, що в середовищі Scratch цикл з лічильником оформлювався спеціальним блоком "Повторити..."
...а скрипт малювання квадрата мав такий вигляд:
Розгляньте уважно цей скрипт, розберіться, де в ньому який компонент і прослідкуйте виконання кожної команди, клікнувши на зеленому прапорці у вбудованому Scratch-проекті.
Аналогічно до Scratch, у Pascal теж можна створити цикл, який буде виконуватися певну кількість разів.
В цілому, структура циклу з лічильником в Pascal має такий вигляд:
for i:=1 to n do //умова циклу
begin
... //тіло циклу
end;
Перший рядок for i:=1 to n do
задає скільки разів буде виконано повторювані дії. Змінна i
тут виступає лічильником кількості повторів ("тіло циклу виконується перший раз, тіло циклу виконується другий раз, тіло циклу виконується третій раз..."), по черзі набуваючи усіх значень від 1 до n. Так, наприклад, якщо в умові циклу ми запишемо for i:=1 to 5 do...
, то це означає, що тіло циклу виконуватиметься 5 разів, а змінна i
по черзі набуватиме значень 1, 2, 3, 4, 5. Лічильник не обов'язково потрібно позначати саме буквою i
, але в усіх випадках в розділі опису змінних var
ця змінна обов'язково повинна мати цілочислений тип integer
(адже номер по порядку не може бути дробовим, не буває, наприклад, три з половиною рази, правда ж!)
Після виконання тіла циклу значення лічильника автоматично змінюється на 1 і програма кожного разу "звіряє" це значення з умовою. Якщо значення лічильника більше за задане число n, тоді тіло циклу більше не виконується, відбувається т.зв. "вихід з циклу" й виконується команда, що розміщена після циклу.
А яким буде значення лічильника i
циклу, заданого умовою for i:=1 to 10 do...
після виходу з циклу?
Правильно, після завершення повторів і виходу з циклу, змінна i
буде мати значення на 1 більше за межове значення кількості повторів, тобто, 11
Між іншим, умова циклу може бути задана й навпаки, в порядку спадання:
for i:=10 downto 1 do...
У цьому випадку відлік іде в зворотному напрямку (10, 9, 8, 7, ...), а по виході з циклу лічильник i
має значення 0. Якщо переплутати початок і кінець відліку й записати for i:=1 downto 10 do...
, тоді цикл не буде виконано жодного разу.
Тут усе просто й складно водночас. Просто, тому що оформлення тіла циклу не потребує якихось особливих позначень і прийомів. Команди тіла циклу перелічуються як і в будь-якому лінійному алгоритмі через крапку з комою в тому порядку, в якому вони повинні виконуватися. Якщо тіло циклу складається лише з однієї команди, то в цьому випадку операторні дужки begin...end
можна не ставити.
Складність же полягає у тому, щоб визначити, а ЩО САМЕ слід записати у тіло циклу. Щоб не помилитися при складанні тіла циклу, слід просто розібратися в тому, ЯКІ САМЕ команди утворюють закінчене коло дій, ЯКІ САМЕ дії будуть повторюватися і ПІСЛЯ ЯКОЇ команди усе треба починати спочатку.
Скласти програму для виведення стількох зірочок, скільки їх "попросить" користувач, увівши з клавіатури їх кількість
Суть програми така: користувач вводить якесь ціле число, а програма виводить стільки зірочок, скільки показує це число, тобто, якщо, наприклад, користувач написав число 10, то програма виводить послідовність з десяти зірочок: **********
.
Для розв'язування задачі треба знайти відповідь на два питання:
Отже, якщо кількість повторів позначимо змінною n
, то маємо, що цикл виконуватиметься n
разів (for i:=1 to n do...
), а в тілі циклу - лише одна дія: write('*')
(саме write
, а не writeln
, бо зірочки нам потрібні у рядок, а не кожна з нового рядка).
Якщо ви скористаєтесь таблицею ASCII і вставите між лапками якийсь інший символ (див. рядок 7), то зможете малювати і його також:
Тепер спробуйте виконати наступну задачу самостійно.
Скласти програму, яка виведе в стовпчик 10 разів слово "Привіт!"
Відповідь:
program hello;
var i:integer;
begin
for i:=1 to 10 do
writeln('Привіт!')
end.
На відміну від попередньої задачі кількість повторень ми вже не запитуємо, тому що ця кількість задана в умові, а, значить, і змінна n
, і попередні "танці" з writeln('Скільки...?')
та readln(n)
нам не потрібні, тому і з тексту програми їх прибрано. А от без змінної i
ми ніякого циклу не "запустимо", тому в розділі опису змінних var
вона обов'язково повинна бути присутня.
Отже, про цикл з лічильником слід запам'ятати:
for i:=a to b do <команди>
, де i
- лічильник кількості повторень команд тіла циклу.begin...end
Програма "просить" користувача ввести своє улюблене слово й ціле число - кількість повторень цього слова, після чого виводить це слово потрібну кількість разів у стовпчик.
Підказки:
Дана задача є комбінацією завдань 28 і 29 та прийому, використаного в завданні 18. Щоб запам'ятати слово, потрібно, зрозуміло, задати саме таку змінну, яка може помістити це слово. Для цього слід використати тип даних string
(var slovo:string;
). Ну, а якщо виводити треба саме це слово, яке "ховається" під змінною slovo
, то в тіло циклу треба записати це так само, як при виведенні числової змінної: writeln(slovo);
. Усе інше - як в завданнях на виведення зірочок і слова "Привіт!". Скомбінуйте ці два завдання й у вас усе вийде! Успіху!