Цикли з умовою. Структура операторів
Оператор циклу з параметром (FOR) використовують, якщо заздалегіть відомо, скільки разів потрібно виконувати деякі оператори.
Існують задачі, коли наперед не відомо, скільки разів потрібно виконувати деякі оператори, але відома умова, при якій цикл виконується, або умова, при якій цикл завершується.
Коли спочатку потрібно перевірити умову, а потім виконувати тіло циклу, використовується оператор циклу WHILE.
Якщо спочатку потрібно виконати тіло циклу, а потім перевіряти умову, використовується оператор циклу REPEAT.
Цикл з передумовою WHILE
Загальний вигляд | Приклад |
---|---|
{оператори до циклу} 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; - оператори, що виконуються у циклі. |
Порядок виконання
- Спочатку перевіряється умова B.
- Якщо умова вірна:
- виконуються оператори S1; S2; ...; Sn;
- виконується перехід до заголовку циклу (пункт 1) для перевірки умови.
- Якщо умова не вірна, тіло циклу пропускається і виконується оператор, що йде після End.
Особливості виконання оператору
- Тіло циклу WHILE (оператори S1; S2; ...; Sn) виконується, якщо умова B - вірна. Цикл WHILE закінчується, якщо умова B не вірна.
- Умова перевіряється перед виконанням тіла циклу. Тому можливі випадки, коли цикл не виконається жодного разу (якщо у прикладі, перед циклом присвоїти a:= -6, то тіло циклу не виконається ні разу).
- У тілі циклу повинен бути оператор (у прикладі a:=a-1), що впливає на умову. Якщо такого оператору немає, то можливе зациклення (якщо у прикладі, замість a:=a-1 написати a:=a+1).
Написаний вище оператор WHILE на блок-схемі відображається так:
Приклад 1
Дано натуральне число 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=8
Оператор | 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=12
Оператор | 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
Загальний вигляд | Приклад |
---|---|
{оператори до циклу} 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; - оператори, що виконуються у циклі. |
Порядок виконання
- Спочатку виконується тіло циклу (оператори S1; S2; ...; Sn).
- Потім перевіряється умова B.
- Якщо умова вірна, цикл завершується, виконується оператор, що йде після Until.
- Якщо умова невірна, виконується перехід на початок, і тіло циклу повторюється.
Особливості виконання оператору
- Тіло циклу REPEAT (оператори S1; S2; ...; Sn) виконується, якщо умова B не вірна. Цикл REPEAT закінчується, якщо умова B вірна. У циклі while все навпаки!
- Умова перевіряється після виконанням тіла циклу. Тому цикл repeat завжди виконується хоча б один раз.
- У тілі циклу повинен бути оператор (у прикладі a:=a-1), що впливає на умову. Якщо такого оператору немає, то можливе зациклення (якщо у прикладі, замість a:=a-1 написати a:=a+1).
Написаний вище оператор REPEAT на блок-схемі відображається так:
Приклад 2
У циклі вводяться цілі числа. Умова закінчення вводу – введення числа 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) | Вивід суми додатних чисел на екран |
Немає коментарів:
Дописати коментар