Оператор циклу з параметром (FOR) використовують, якщо заздалегіть відомо, скільки разів потрібно виконувати деякі оператори.
Існують задачі, коли наперед не відомо, скільки разів потрібно виконувати деякі оператори, але відома умова, при якій цикл виконується, або умова, при якій цикл завершується.
Коли спочатку потрібно перевірити умову, а потім виконувати тіло циклу, використовується оператор циклу WHILE.
Якщо спочатку потрібно виконати тіло циклу, а потім перевіряти умову, використовується оператор циклу REPEAT.
Загальний вигляд | Приклад |
---|---|
{оператори до циклу} WHILE B DO Begin S1; S2;...; Sn End; {оператори після циклу} B – умова продовження циклу. S1; S2;...; Sn оператори, що виконуються у циклі. |
a:=6; WHILE a>0 do Begin Writeln(a); a:=a-1; End; a>0 – умова продовження циклу. Writeln(a); a:=a-1; - оператори, що виконуються у циклі. |
Написаний вище оператор WHILE на блок-схемі відображається так:
Дано натуральне число n. Чи є воно степенем числа 2?
Щоб з’ясувати, чи є число степенем числа 2, потрібно ділити це число на 2 (тобто виконувати оператор n:=n div 2), поки це можна виконувати без остачі (тобто, якщо вірна умова n mod 2=0). Тобто, спочатку ми перевіряємо умову, чи ділиться число n на 2 і, якщо ділиться, виконуємо ділення. Тому в цій задачі потрібно використовувати оператор циклу WHILE.
У результаті одного чи декількох ділень числа на 2 ми отримаємо n=1, якщо число є степенем числа 2 (бо ділення на 2 завжди можливе), або n<>1, якщо число не є степенем числа 2.
Ввід | Вивід |
---|---|
8 | yes |
12 | no |
var n:word; begin read(n); while n mod 2=0 do n:=n div 2; if n=1 then writeln('yes') else writeln('no'); end. |
Оператор | n | Пояснення |
---|---|---|
read(n) | 8 | Введення числа |
while n mod 2=0 do | Перевірка умови 8 mod 2=0. Умова вірна, тому виконується тіло циклу. | |
n:=n div 2 | 4 | Виконується ділення числа 8 на 2 та перехід на наступний виток циклу |
while n mod 2=0 do | Перевірка умови 4 mod 2=0. Умова вірна, тому виконується тіло циклу. | |
n:=n div 2 | 2 | Виконується ділення числа 4 на 2 та перехід на наступний виток циклу |
while n mod 2=0 do | Перевірка умови 2 mod 2=0. Умова вірна, тому виконується тіло циклу. | |
n:=n div 2 | 1 | Виконується ділення числа 2 на 2 та перехід на наступний виток циклу |
while n mod 2=0 do | Перевірка умови 1 mod 2=0. Умова не вірна, тому виконується оператор, що стоїть після циклу. | |
if n=1 then | Перевірка умови n=1. Умова вірна, тому виконується оператор, що стоїть після then | |
writeln('yes') | Вивід на екран 'yes', тобто число 8 є степенем числа 2. |
Оператор | n | Пояснення |
---|---|---|
read(n) | 12 | Введення числа |
while n mod 2=0 do | Перевірка умови 12 mod 2=0. Умова вірна, тому виконується тіло циклу. | |
n:=n div 2 | 6 | Виконується ділення числа 12 на 2 та перехід на наступний виток циклу |
while n mod 2=0 do | Перевірка умови 6 mod 2=0. Умова вірна, тому виконується тіло циклу | |
n:=n div 2 | 3 | Виконується ділення числа 6 на 2 та перехід на наступний виток циклу |
while n mod 2=0 do | Перевірка умови 3 mod 2=0. Умова не вірна, тому виконується оператор, що стоїть після циклу | |
if n=1 then | Перевірка умови n=1. Умова не вірна (бо n=3), тому виконується оператор, що стоїть після else | |
writeln('no') | Виведення на екран 'no', тобто число 12 не є степенем числа 2 |
Загальний вигляд | Приклад |
---|---|
{оператори до циклу} REPEAT S1; S2;...; Sn Until B; {оператори після циклу} B – умова завершення циклу. S1; S2;...; Sn оператори, що виконуються у циклі. |
a:=6; REPEAT Writeln(a); a:=a-1; Until a<=0; a<=0 – умова завершення циклу. Writeln(a); a:=a-1; - оператори, що виконуються у циклі. |
Написаний вище оператор REPEAT на блок-схемі відображається так:
У циклі вводяться цілі числа. Умова закінчення вводу – введення числа 0. Знайти суму додатних чисел.
Спочатку потрібно ввести число з клавіатури, зробити з ним потрібні дії, а потім перевірити, якщо введене число =0, то цикл потрібно завершити. Тому у цій задачі потрібно використовувати оператор циклу repeat.
Ввід | Вивід |
---|---|
8 -3 4 -2 0 | 12 |
Var a,s:integer; begin s:=0; repeat read(a); if a>0 then s:=s+a; until a=0; writeln(s); end. |
Оператор | a | s | Пояснення |
---|---|---|---|
s:=0; | 0 | Початкове значення суми | |
read(a) | 8 | Введення першого числа | |
if a>0 | Перевірка першого числа. Умова вірна, тому виконується оператор, що стоїть після then. | ||
s:=s+a | 8 | Накопичення суми | |
until a=0 | Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу. | ||
read(a) | –3 | Введення другого числа | |
if a>0 | Перевірка другого числа. Умова невірна, тому оператор, що стоїть після then, не виконується, і число у суму не накопичується. | ||
until a=0 | Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу. | ||
read(a) | 4 | Введення третього числа | |
if a>0 | Перевірка третього числа. Умова вірна, тому виконується оператор, що стоїть після then. | ||
s:=s+a | 12 | Накопичення суми | |
until a=0 | Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу. | ||
read(a) | –2 | Введення четвертого числа | |
if a>0 | Перевірка четвертого числа. Умова невірна, тому оператор, що стоїть після then, не виконується, і число у суму не накопичується. | ||
until a=0 | Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу. | ||
read(a) | 0 | Введення п’ятого числа | |
if a>0 | Перевірка п’ятого числа. Умова невірна, тому оператор, що стоїть після then, не виконується, і число у суму не накопичується | ||
until a=0 | Перевірка умови завершення циклу. Умова вірна, тому цикл завершується і виконується оператор, що стоїть після циклу. | ||
writeln(s) | Вивід суми додатних чисел на екран |