загрузка...
загрузка...
На головну

Цикл з передумовою

Тоді, коли число повторень тіла циклу заздалегідь невідоме, а задається лише деяка умова виконання циклу, використовуються цикли з умовою, а саме цикл з передумовою та цикл з післяумовою. У цьому параграфі розглянемо перший з них.

Оператор циклу з передумовою має вигляд:

While<умова>Do<тіло циклу>

або

Поки<умова>виконати<тіло циклу>

Виконання оператора циклу з передумовою починається з перевірки умови, записаної після слова While. Якщо вона виконується, то виконується тіло циклу, потім знову перевіряється умова і т. д. Якщо під час чергової перевірки з'ясується, що умова не виконується, то тіло циклу виконуватися не буде. Керування перейде до оператора, записаного після циклу.

Примітка

1. Якщо тіло циклу складається з кількох операторів, то вони об'єднуються операторними дужками Begin-End.

2. У тілі циклу обов'язково має бути оператор, що впливає на істинність умови, інакше станеться зациклювання: оператори тіла циклу будуть повторюватися «вічно».

Приклад №1

Підрахувати кількість цифр заданого натурального числа n.

Розв'язування

Раніше ми виділяли цифри двоцифрових та трицифрових чисел. В цьому ж випадку ми не знаємо скільки цифр має число. Тому, поки число не стане рівне 0, будемо виконувати таку послідовність команд: збільшувати лічильник кількості цифр числа на одиницю, а число зменшувати в 10 разів (за допомогою цілочисельного ділення позбавлятимемось останньої цифри числа).

Program Example;

Var m, n, k: integer;

Begin

Write('Введіть натуральне число:');

Readln(n);

m:=n; {копіюємо введене число}

k:=0; {змінна-лічильник кількості цифр}

While m<>0 Do

Begin

k:=k+1; {збільшуємо лічильник цифр}

m:=m div 10 {відкидаємо останню цифру}

End;

Writeln('У числі ', n,'-', k, ' цифр')

End.

Роботу цієї програми цікаво спостерігати в покроковому режимі виконання (трасуванні), спостерігаючи зміну значень m і k.

Приклад №2

Підрахувати суму цифр заданого натурального числа n.

Розв'язування

Щоб розв'язати цю задачу, досить зробити незначні зміни в попередній програмі. Потрібно, як і раніше відділяти останню цифру числа, але перед цим її потрібно запам'ятовувати в додаткову змінну (наприклад, а) і додавати до суми S.

Фрагмент програми: Whilem<>0Do

Begin

a:=m mod 10;

s:=s+a;

m:=m div 10

End;

Питання для самоконтролю

1. В яких випадках використовується цикл з передумовою та які особливості його запису?

2. У даному фрагменті програми обчислення кількості цифр числа а знайдіть помилку та виправте її.

ck:=0;

While a>=0 Do

Begin

ck:=ck+1;

a:=a div 10

End;

3. Дано послідовність операторів:

a:=1; b:=1;

While a+b<8 Do

Begin a:=a+1; b:=b+2End;

s:=a+b;

Скільки разів буде повторене тіло циклу? Якими будуть значення змінних а, b і s після виконання цієї послідовності операторів?

4. Якими будуть значення змінних а і b після виконання послідовності операторів:

a:=1; b:=1;

while a<=3 Do a:=a+1; b:=b+1;

5. Знайдіть значення змінної s після виконання таких операторів:

а)s:=0; i:=0;

While i<5 Do i:=i+1; s:=s+100 div i;

б)s:=0; i:=0;

While i>1 Do

Begin s:=s+100 div і; i:=i-1 End;

6. Яким умовам повинно задовольняти значення змінної k, щоб такі цикли були нескінченними:

а)While c<0 Do c:=c+k;

б)While k<>0 Do k:=k+1;

в)While k<>0 Do k:=k+2;

Задачі

1) Знайти кількість парних цифр натурального числа.

2) Скільки разів дана цифра зустрічається у цілому числі?

3) Знайдіть найбільшу цифру цілого числа.

4) Знайдіть старшу цифру числа.

5) Поміняти першу і останню цифри числа місцями.

6) Скласти програму для перевірки, чи є задане натуральне число паліндромом.

1.10. Цикл з післяумовою

Для програмної реалізації циклічних алгоритмів із невідомим числом повторень є ще один оператор - оператор циклу з післяумовою, що має такий вигляд:

Repeat < оператори >; Until<умова зупинки циклу>; Повторювати < оператори >; ДокиНе<умова зупинки циклу>;

Цей оператор відрізняється від циклу з передумовою тим, що перевірка умови проводиться після чергового виконання тіла циклу. Це забезпечує виконання тіла циклу хоча б один раз.

Зверніть увагу на те, що даний оператор циклу допускає наявність кількох операторів у тілі циклу тому службові слова Begin i Endне потрібні.

Порядок виконання циклу з післяумовою такий: виконується послідовність операторів, що складають тіло циклу, після чого перевіряється умова, записана після службового слова Until. Якщо умова виконується, то цикл завершується. У протилежному випадку оператори тіла циклу виконуються ще раз, після чого знову перевіряється виконання умови.

Приклад

Скласти програму для планування купівлі в магазині товарів на суму, що не перевищує задану величину.

Розв'язування

Позначимо через x та k ціну та кількість товару, через p - задану граничну суму, через s - вартість покупки. Початкове значення загальної вартості покупки s дорівнює нулю. Значення граничної суми вводиться з клавіатури. Необхідно повторювати запит ціни й кількості вибраного товару, визначати його вартість, додавати її до загальної вартості та виводити результат на екран доти, поки вартість не перевищить граничну суму p.

Рrogram Exemple;

Var x,k,p,s:integer;

Begin

Write('Гранична сума--');

Readln(P);

S:=0;

Repeat

Write('Введіть ціну товару та його кількість:');

Readln(x,k);

S:=s+k*x;

Writeln(' вартість покупки дорівнює ',s)

Until s>p;

Writeln('вартість покупки перевищила граничну суму!');

End.

Питання для самоконтролю

1. В яких випадках використовується цикл з післяумовою та які особливості його запису?

2. У чому подібність і відмінність циклів з умовами?

3. Виберіть правильну відповідь.

При виконанні оператора повторення Repeat

а) спочатку обчислюється логічний вираз, і в залежності від результату виконуються або не виконуються оператори тіла циклу;

б) спочатку виконуються оператори тіла циклу, потім обчислюється логічний вираз, результат якого впливає на повторне виконання операторів.

4. Визначити значення змінної s після виконання таких операторів:

s:=0; i:=1;

Repeat

s:=s+5 div і;

i:=i-1

Until i<=1;

5. Що буде надруковано в результаті виконання такої послідовності операторів:

i:=1;

repeat

write(i,' ');

i:=i+2

until i>19;

6. Визначити значення змінних s та і після виконання таких операторів:

S:=0; i:=1;

repeat

S:=S+i;

i:=i+1

until i>10;

1.11. Підготовка до оцінювання теми
«Циклічні конструкції»

1) У заданих фрагментах програм обчислюється сума натуральних чисел з інтервалу від 1 до N. Прокоментуйте особливості використання кожного циклу.

S:=0; for i:=1 to N do S:=S+і; writeln('S=',S); і:=1; S:=0; while і<=N do begin S:=S+і; і:=і+1 end; writeln('S=',S); і:=1; S:=0; repeat S:=S+і; і:=і+1 until і>N;

2) Проаналізуйте роботу даних фрагментів програм. Яке значення матиме змінна а в кожному випадку при р=12345. Сформулюйте умову задачі до кожного фрагменту.

Whіlе р<>0 Dо Веgіn а:=а+р mоd 10; р:=р div 10 Еnd; Whіlе р<>0 Dо Веgіn а:=а*10+р mоd 10; р:=р div 10 Еnd;

3) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=2; i:=0;

while i<5 do i:=i+1; s:=s+1/i; ________

2) s:=5; i:=1;

while i>1 do begin s:=s+1/i; i:=i-1 end; ________

3) s:=1; i:=1;

while i<4 do begin i:=i+1; s:=s*i end; ________

4) s:=1; i:=6;

while i>=3 do begin s:=s+i; i:=i-1 end; ________

а) 18 б) 2.2 в) 0 г) 5 д) 10 е) 48

4) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=4; i:=1;

repeat s:=s+1/i; i:= i-1 until i<=1; _________

2) s:=2; i:=1;

repeat s:=s+1/(i+1); i:=i+3 until i>=5; _________

3) s:=1; i:=1;

repeat i:=i+1; s:=s+i until i>3; _________

4) s:=2; i:=5;

repeat i:=i-1; s:=s+1/i until i<=4; _________

а) 2.25 б) 2.7 в) 7 г) 10 д)5

5) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=0; for i:=10 downto 6 do s:=s+1; _________

2) s:=0; for i:=8 to 3 do s:=s+1; _________

3) s:=1; for i:=2 downto 10 do s:=s+1; _________

4) s:=1; for i:=5 to 9 do s:=s+1; _________

a) 6 б) 1 в) 5 г) 2 д) 0 е) 40

6) Практичне завдання Дано натуральне число N:

· знайти добуток його цифр;

· чи містить дане число цифру А (А вводиться з клавіатури)?

1.12. Алгоритм Евкліда

Для обчислення найбільшого спільного дільника (НСД) двох чисел уже більше 20-ти століть відомий алгоритм, запропонований давньогрецьким математиком Евклідом- алгоритм Евкліда. Визначити НСД можна двома способами, які відрізняються швидкістю виконання.

1-й спосіб. Порівнюються два числа і більше з них замінюється різницею цих чисел. Це повторюють до того часу, поки числа не стануть рівними. Отриманий результат і є шуканим НСД двох чисел. Фрагмент програми для цього способу може мати вигляд:

Write ('Введіть число А= ');

Readln (А);

Write ('Введіть число В= ');

Readln (В);

While А<>В do

If A>B Then A:=A-B Else B:=B-A;

Writeln ('НСД=',A);

 
 

2-й спосіб. Для обчислення НСД двох чисел більше з них замінюється остачею від ділення більшого числа на менше до того часу, доки одне з чисел не стане рівним 0. Тоді інше число і є НСД двох чисел. З використанням циклу Repeat, фрагмент програми матиме такий вигляд:

Write ('Введіть число А= ');

Readln (А);

Write ('Введіть число В= ');

Readln (В);

Repeat

If A>B Then A:=A mod B Else B:=B mod A

Until (A=0) or (B=0);

Writeln ('НСД=', A+B);

Цикли While і Repeat в даних фрагментах можна замінювати один одним, але при цьому потрібно звертати особливу увагу на складання умов виконання та зупинки циклів.

Два числа, найбільший спільний дільник яких дорівнює одиниці, називаються взаємнопростими.

Питання для самоконтролю

1. У чому полягає метод знаходження НСД двох цілих чисел з використанням різниць?

2. У чому полягає метод знаходження НСД двох цілих чисел з використанням остач від ділення?

3. Проаналізуйте знаходження НСД для А=18, В=3. Яким способом НСД знаходиться швидше?

4. Які числа називаються взаємнопростими? Наведіть приклади.

Задачі

1) Знайти НСД трьох чисел.

Примітка. НСД(a, b, c)=НСд (НСд (a, b), c).

2) Перевірити, чи є два даних числа взаємнопростими.

3) Знайти найменше спільне кратне (НСК) чисел n i m, використовуючи співвідношення .

1.13. Вкладені цикли

Якщо при розв'язуванні задач, потрібно щоб змінювалась не одна змінна, а кілька, то один цикл розміщується всередині іншого. Такі конструкції називають вкладеними циклами.

Розглянемо роботу вкладених циклів на прикладах.

Приклад №1

Написати програму, яка друкує таблицю множення за схемою Піфагора для заданого проміжку цілих чисел. Наприклад:

 

Розв'язування

Program Tabliczka;

Var i,j,k,w: integer;

Begin

Write('Введіть кількість стовпчиків: ');

ReadLn(k);

Write('Введіть кількість рядків: ');

ReadLn(w);

Write(' *');

For j:=1 to k do Write(j:4);

WriteLn;

For i:=1 to w do

Begin

Write(i:2);

For j:=1 to k do Write(i*j:4);

WriteLn

End

End.

Приклад №2

Якщо додати всі цифри якогось числа, потім усі цифри знайденої суми і далі повторювати цей процес, ми одержимо одноцифрове число (цифру), яке називають цифровим коренем даного числа. Наприклад, цифровий корінь числа 34 697 дорівнює 2 (3+4+6+7=29; 2+9=11; 1+1=2). Складемо програму для обчислення цифрового кореня натурального числа.

Розв'язування

Програма, що обчислює цифровий корінь даного числа, може виглядати так:

Program Example;

Var n,k,s:integer;

Begin

Write('Введіть число:');

Readln(n);

s:=n;

While s>9 Do {поки число багатоцифрове...}

Begin

k:=s; s:=0; {обчислити суму його цифр}

Repeat

S:=s+k mod 10;

K:=k div 10

Until k=0

End;

Writeln('Цифровий корінь числа ',n,' = ',s);

End.

Приклад №3

Знайти всі натуральні числа a, b і c з інтервалу від 1 до 20, для яких виконується рівність: .

Розв'язування

Program Example;

Var

a,b,c:integer;

Begin

for a:=1 to 20 do

for b:=1 to 20 do

for c:=1 to 20 do

if sqr(a)+sqr(b)=sqr(c) then

Writeln('a=',a,' b=',b,' c=',c)

End.

Питання для самоконтролю

1. Для чого в програмі з прикладу №1 оператор Write(' *')?

2. Проаналізуйте роботу програми з прикладу №2 для n=5, n=56.

3. Замініть в програмі з прикладу №2 цикл Repeat на цикл While.

4. Проаналізуйте, скільки разів за весь час роботи програми з прикладу №3 виконуватиметься кожен цикл.

5. проаналізуйте, скільки разів за весь час роботи програми з прикладу №3 виконуватиметься перевірка умови в умовному операторі.

Задачі

1) Що буде надруковано після виконання такого фрагменту програми при n=6?

a:=1;b:=1;

for i:=0 to n do

Begin

For j:=1 To b Do write('*');

Writeln;

c:=a+b; a:=b; b:=c

End;

Розв'язок якої задачі реалізовано в цьому фрагменті?

2) Знайти всі такі трійки натуральних чисел х, у і z з інтервалу від 1 до 20, для яких виконується рівність
х22=z2.

3) Знайти цілі числа із проміжку віл 1 до 200, у яких рівно 5 дільників.

1.14. Дійсний тип даних

До дійсного (real) типу належить підмножина дійсних чисел, які можуть бути подані у форматі з плаваючою комою і з фіксованою кількістю цифр. Дійсні числа в АЛГО мають порядок від Е+320 до Е-320.

Число з фіксованою кількістю цифр зображається десятковим дробом (дробова частина може бути й нульовою). Дробова частина відокремлюється від цілої за допомогою крапки.

Наприклад: 127.3; 25.0; - 45.004; 0.77.

Число з плаваючою комою має вигляд mЕp, де m - мантиса яка може бути цілим або дійсним числом з фіксованою крапкою, а р - порядок числа який має тип integer. Як мантиса, так і порядок можуть містити знаки "+" або "-". Наприклад:

Математичний запис Запис із плаваючою комою
0,000009 9Е-6
0,62*104 0.62Е+4
-10,8*1012 -1.08Е13
20*10-3 2Е-2

До даних дійсного типу застосовуються математичні операції: «+», «-», «*», «/». Результати цих операцій теж матимуть тип real.

Є багато стандартних функцій для роботи з дійсними числами. Перерахуємо ті, що найчастіше використовуються:

Sqrt(x) - квадратний корінь з х (x має бути не від'ємним цілим або дійсним числом);

Trunc(x) - ціла частина від х;

Round(x) - округлення до найближчого цілого числа.

До даних дійсного типу застосовують і відомі вам функції Abs(x) та Sqr(x).

Цікавою є функція, яка може вибирати випадкові значення із заданого діапазону. Вона має назву Random або Випадковеіможе використовуватись з аргументом або без:

Random

Random (x)

Якщо функцію Випадкове вживати без аргумента, то результатом є дійсне випадкове число в діапазоні [0, 1]. У варіанті з фактичним параметром, яким може бути вираз дійсного або цілого типу, результат має такий самий тип, як аргумент, а його значення належить до діапазону [0,x]. Зрозуміло, що комп'ютер випадково нічого не робить. "Випадкові" числа генеруються за спеціальним алгоритмом на основі деякого цілого числа. Це число утворюється автоматично з показників системного годинника у момент запуску програми на виконання, тому під час кожного виконання програми генерується інша послідовність випадкових чисел.

При запису команди присвоювання потрібно пам'ятати, що змінній дійсного типу можна надати значення виразу цілого типу, але не навпаки. Якщо у виразі використовуються дані цілого і дійсного типів, то результат матиме дійсний тип.

Приклад: Var a,b:integer;

c:real;

допустимі такі записи команди присвоїти:

c:=Sqrt(a);

c:=2*b;

c:=c+a;

c:=a/b.

Виводити дані дійсного типу можна за заданим формату й без нього. Якщо під час виведення даних дійсного типу не зазначений формат, то число виводиться з плаваючою крапкою - мантиса і порядок. На число відводиться 17 позицій. При цьому в цілій частині мантиси присутня тільки одна значуща цифра. Змінити стандартну форму виведення можна, використовуючи формат: Write(x:m:n), де х - значення дійсного типу, що виводиться; m - загальна кількість позицій для виведення числа (включно зі знаком числа, цілою частиною, крапкою та дробовою частиною); n - кількість позицій для виведення дробової частини.

Приклад

Надрукувати таблицю значень функції y=х2 на відрізку [0,5] із кроком 0.5.

Розв'язування

Для перебору всіх значень з відрізка в даному випадку безпосередньо використати цикл із параметром неможливо, оскільки крок зміни значення параметра - дійсне число. Тому застосуємо цикл While.

Program Еxample;

Var i:real;

Begin

i:=0;

While i<=5 do

Begin

Writeln(i:2:1,' ',sqr(i):4:3);

і:=i+0.5

End

End.

Питання для самоконтролю

1. Що таке дійсний тип даних та для чого він використовується?

2. Як задаються значення змінних з плаваючою комою?

3. Як вказують формат виведення дійсних чисел?

4. Які стандартні функції використовуються для роботи з дійсними числами?

5. Вкажіть неправильно записані оператори присвоєння, якщо:

var a, b:Real; c:Integer;

а) a := b * c; б) c := Sqrt(c);

в) a := c mod a; г) c := Abs(a + b);

д) a := c mod a; е) c := Trunc(a + b).

6. Обчисліть значення виразів, якщо:

var a, b:Real; c:Integer;

Begin

...

a := 3.15; b := -6; c := 15;

...

end.

а) c := c + 1; б) a := a - c /100;

в) b := b + c div 2 - 1; г) b := Trunc(a) + c;

д) a := Trunc(a) + Abs(b) + c;

Задачі

1) Дано дійсні додатні числа a, b, c, x, y. З'ясувати, чи пройде цеглина з ребрами a, b, c у прямокутній отвір зі сторонами x, y. Просувати цеглину дозволяється тільки так, щоб кожне з її ребер було перпендикулярне або паралельне кожній зі сторін отвору.

2) Задаються коефіцієнти квадратного рівняння ax2+bx+c=0. Скласти програму для обчислення його коренів.

3) Дано три дійсні числа a, b, c. Знайти середнє арифметичне цих чисел.



  1   2   3   4   5   6   7   8   9   10   11   12   13   Наступна

Середовище програмування АЛГО | G, alfa, test17, x2y, _h1, | Початок | Рядковий тип даних | Рrоgram Ехаmple; | Процедури для оформлення та виведення тексту | Програма-годинник | Практичне завдання | Початок | Початок |

загрузка...
© um.co.ua - учбові матеріали та реферати