четвер, 11 січня 2018 р.

Цикли з умовою.

Цикли з умовою. Структура операторів

Оператор циклу з параметром (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; - оператори, що виконуються  у циклі.

Порядок виконання

  1. Спочатку перевіряється умова B.
  2. Якщо умова вірна:
    • виконуються оператори S1; S2; ...; Sn;
    • виконується перехід до заголовку циклу (пункт 1) для перевірки умови.
  3. Якщо умова не вірна, тіло циклу пропускається і виконується оператор, що йде після End.

Особливості виконання оператору

  1. Тіло циклу WHILE (оператори S1; S2; ...; Sn) виконується, якщо умова - вірна. Цикл WHILE закінчується, якщо умова B не вірна.
  2. Умова перевіряється перед виконанням тіла циклу. Тому можливі випадки, коли цикл не виконається жодного разу (якщо у прикладі, перед циклом присвоїти a:= -6, то тіло циклу не виконається ні разу).
  3. У тілі циклу повинен бути оператор (у прикладі 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.

Результат роботи програми

ВвідВивід
8yes
12no

Програма

 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 24Виконується ділення числа 8 на 2 та перехід на наступний виток циклу
while n mod 2=0 doПеревірка умови 4 mod 2=0. Умова вірна, тому виконується тіло циклу.
n:=n div 22Виконується ділення числа 4 на 2 та перехід на наступний виток циклу
while n mod 2=0 doПеревірка умови 2 mod 2=0. Умова вірна, тому виконується тіло циклу.
n:=n div 21Виконується ділення числа 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 26Виконується ділення числа 12 на 2 та перехід на наступний виток циклу
while n mod 2=0 doПеревірка умови 6 mod 2=0. Умова вірна, тому виконується тіло циклу
n:=n div 23Виконується ділення числа 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; - оператори, що виконуються у циклі.

Порядок виконання

  1. Спочатку виконується тіло циклу (оператори S1; S2; ...; Sn).
  2. Потім перевіряється умова B.
    • Якщо умова вірна, цикл завершується, виконується оператор, що йде після Until.
    • Якщо умова невірна, виконується перехід на початок, і тіло циклу повторюється.

Особливості виконання оператору

  1. Тіло циклу REPEAT (оператори S1; S2; ...; Sn) виконується, якщо умова B не вірна. Цикл REPEAT закінчується, якщо умова B вірна. У циклі while все навпаки!
  2. Умова перевіряється після виконанням тіла циклу. Тому цикл repeat завжди виконується хоча б один раз.
  3. У тілі циклу повинен бути оператор (у прикладі a:=a-1), що впливає на умову. Якщо такого оператору немає, то можливе зациклення (якщо у прикладі, замість a:=a-1 написати a:=a+1).
Написаний вище оператор REPEAT на блок-схемі відображається так:

Приклад 2

У циклі вводяться цілі числа. Умова закінчення вводу – введення числа 0. Знайти суму додатних чисел.
Спочатку потрібно ввести число з клавіатури, зробити з ним потрібні дії, а потім перевірити, якщо введене число =0, то цикл потрібно завершити. Тому у цій задачі потрібно використовувати оператор циклу repeat.

Результат роботи програми

ВвідВивід
8 -3 4 -2 012

Програма

 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+a8Накопичення суми
until a=0Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу.
read(a)–3Введення другого числа
if a>0Перевірка другого числа. Умова невірна, тому оператор, що стоїть після then, не виконується, і число у суму не накопичується.
until a=0Перевірка умови завершення циклу. Умова не вірна, тому виконується перехід на наступний виток циклу.
read(a)4Введення третього числа
if a>0Перевірка третього числа. Умова вірна, тому виконується оператор, що стоїть після then.
s:=s+a12Накопичення суми
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)Вивід суми додатних чисел на екран

Немає коментарів:

Дописати коментар