You are on page 1of 28

1

Урок № 5
Вкладені
цикли

Зміст
1. Вкладена конструкція................................................. 3
2. Практичні приклади................................................... 7
Приклад 1...............................................................................7
Приклад 2...............................................................................9
Приклад 3.............................................................................11
3. Використання інтегрованого відладчика
Microsoft Visual Studio.............................................. 16
Поняття налагодження.
Необхідність використання відладчика......................16
Виконання програми по кроках.....................................17
Точка зупину.......................................................................20
«Розумна» точка зупину...................................................22
4. Домашнє завдання.................................................... 26

Додаткові матеріали уроку прикріплені до даного PDF-файлу.


Для доступу до матеріалів, урок необхідно відкрити в програмі
Adobe Acrobat Reader.

2
1. Вкладена конструкція

1. Вкладена конструкція
У минулих уроках ви познайомилися з конструкцією
під назвою цикл і варіантами реалізації циклу в мові С++.
Як ви вже встигли помітити, цикл є однією з основопо-
ложних конструкцій програмування. З його допомогою
виконується величезна кількість завдань. Також ви вже
зіткнулися з тим, що в цикл можна вкладати конструкції
логічного вибору, як-от if і switch. Однак не будемо зупиня-
тися на досягнутому і спробуємо вкласти в цикл подібний
до нього оператор, тобто інший цикл. Такі конструкції
називаються вкладеними циклами. За своєю структурою
такі цикли нагадують коробки різного розміру. Їх можна
вкладати одна в одну, тобто в коробку більшого розміру
можна помістити меншу коробку. Зрештою, щоб подиви-
тися внутрішню коробку, доведеться спочатку відкрити
всі зовнішні.

Малюнок 1

3
Урок № 5

Саме за таким принципом і працюють вкладені ци-


кли. На першій ітерації зовнішнього циклу запускається
внутрішній, і він виконується до свого повного завер-
шення. Тільки після цього управління знову передається
на зовнішній цикл. На другій же ітерації знову запуска-
ється внутрішній цикл. І так доти, доки повністю не
завершиться зовнішній цикл. Давайте тепер спробуємо
розібратися в цьому на прикладі. Необхідно створити
програму, яка виводитиме будинок на екран. Так що для
цього потрібно?
По-перше, будинок складається з цеглин. Для виводу
одної цегли ми будемо використовувати оператор cout <<
«|###|»; Щоправда, такий будинок стоятиме не на одній
цеглині, а на кількох. Тому потрібен цикл, який виведе на
екран перший рядок із десяти цегл. Для цього ми можемо
використовувати вже звичну конструкцію циклу for:

for (int j = 0; j < 10; j++)


{
cout << "|###|";
}
cout << endl;

Перший ряд уже готовий.

Малюнок 2

По-друге, як бачимо, навіть одного ряду цегли не-


достатньо. Припустимо їх потрібно сім. Тобто вивід

4
1. Вкладена конструкція

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


цього написану нами конструкцію циклу треба вкласти
ще в одну.

for (int i = 0; i < 7; i++)


{
for (int j = 0; j < 10; j++)
{
cout << "|###|";
}
cout << endl;
}
cout << endl;

Малюнок 3

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


даху для цього будинку.
Принцип роботи програми, що реалізує вкладений
цикл, будується на тому, що внутрішній цикл спрацьовує
щоразу на всіх ітераціях зовнішнього циклу від почат-
ку до кінця. Іншими словами, поки програма не вийде
з вкладеного циклу (поки не закрита внутрішня коробка),
виконання зовнішнього не продовжиться.

5
Урок № 5

Нижче зображена схема роботи вкладених циклів.

Малюнок 4

Як бачите, усе просто. Незважаючи на це, вкладені


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

6
2. Практичні приклади

2. Практичні приклади
Приклад 1
Постановка задачі
Написати програму, яка виводить на екран таблицю
множення.
Код реалізації:

#include <iostream>
using namespace std;

int main()
{
for (int i = 1; i<10; i++)
{
for (int j = 0; j<10; j++)
{
cout << i*j << "\t";
}
cout << "\n\n";

}
return 0;
}

Коментар до коду
1. Керуючі змінні зовнішнього і внутрішнього циклів
виконують функції множників.
2. Керуюча змінна i створюється й ініціалізується зна-
ченням 1.

7
Урок № 5

3. Програма перевіряє умову i<10, через те, що 1 менше


за 10, умова є істинною, і програма входить у зовніш-
ній цикл.
4. Керуюча змінна j створюється й ініціалізується зна-
ченням 1.
5. Програма перевіряє умову j<10, через те, що 1 менше
за 10, умова є істинною, і програма входить у вну-
трішній цикл.
6. Здійснюється показ на екран множення i на j - 1.
7. Здійснюється зміна керуючої змінної j.
8. Знову перевіряється умова j<10, через те, що 2 мен-
ше за 10, умова є істинною, і програма знову входить
у внутрішній цикл.
9. Здійснюється показ на екран множення i на j - 2
10. Здійснюється зміна керуючої змінної j.
Дії з 5 по 7 повторюються доти, доки j не стає рівним
10, при цьому поточне значення i(1) множиться на кожне
значення j (від 1 до 9 включно), результат виводиться на
екран. Виходить рядок таблиці множення на 1.

Малюнок 5

8
2. Практичні приклади

Потім програма виходить із внутрішнього циклу і пе-


реводить екранний курсор на два рядки вниз. Після цього
здійснюється збільшення змінної i на одиницю і знову вхід
у внутрішній цикл. Тепер уже для виведення ланцюжка
множення на 2.
Таким чином, зрештою на екрані з'являється вся та-
блиця множення (мал. 5).

Приклад 2
Постановка задачі
Вивести на екран прямокутник із символів 20 на 20.
Код реалізації

#include <iostream>
using namespace std;
int main()
{
int str;
int star_count;
int length = 20;
str = 1;
while (str <= length)
{
star_count = 1;
while (star_count <= length)
{
cout << "*";
star_count++;
}

cout << "\n";


str++;
}

9
Урок № 5

cout << "\n";


return 0;
}

Коментар до коду
1. Керуюча змінна зовнішнього циклу — str контролює
кількість рядків у прямокутнику.
2. Керуюча змінна внутрішнього циклу  — star_count
контролює кількість символів у кожному рядку.
3. length — довжина сторони прямокутника.
4. Після відтворення кожного рядка, зовнішній цикл
здійснює перехід на наступний рядок прямокутника.
5. Результат такий:

Малюнок 6

10
2. Практичні приклади

Примітка. Зверніть увагу, що, незважаючи на те,


що кількість рядків відповідає кількості символів
у рядку, на дисплеї не квадрат! Це пов,язано з тим,
що висота та ширина символу різні.
От і все! Тепер ви маєте повну інформацію про цикли,
їхні різновиди і принципи роботи. Але, перш ніж викону-
вати домашнє завдання, треба ознайомитися зі ще одним
розділом уроку. Цей розділ допоможе вам не тільки писати
програми, а й аналізувати їхню роботу.

Приклад 3
Одним із часто використовуваних прикладів вкладених
циклів є таблиці. Коли необхідно проаналізувати всі рядки
й у кожному рядку переглянути його осередки. Зовнішній
цикл буде перебирати рядки від першого до останнього.
А внутрішній — усі осередки кожного такого рядка. Дуже
часто ми стикаємося з таблицями на роботі, навчанні. Їх
зручно використовувати, коли необхідно систематизувати
великий обсяг даних. Це можуть бути турнірні таблиці,
таблиці відстаней між містами тощо.
У програмуванні такі таблиці розділяють на прямо-
кутні та квадратні.
0 1 2 3 0 1 2
0 + + + + 0 № № №
1 + + + + 1 № № №
2 + + + + 2 № № №
Прямокутна таблиця Квадратна таблиця
(різна кількість рядків (однакова кількість рядків
і стовпців) і стовпців)

11
Урок № 5

Початковий код: Початковий код:

for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)


{ {
for (int j = 0; for (int j = 0;
j < 4; j++) j < 3; j++)
{ {
cout << " + "; cout << " # ";
} }
cout << endl; cout << endl;
} }
cout << endl; cout << endl;

Малюнок 7 Малюнок 8

Менше з тим, у квадратних таблицях виділяють ще


два поняття: головна й побічна діагональ.
0 1 2 3 0 1 2
0 + + + + 0 № № №
1 + + + + 1 № № №
2 + + + + 2 № № №

i == j — головна діагональ; N — кількість рядків або


i> j — область під головною стовпців
діагоналлю; i + j == N - 1 — побічна діа-
i <j — область над головною гональ;
діагоналлю; i + j> N - 1 — область під
побічної діагоналлю;
i + j <N - 1 — область над
побічної діагоналлю;

12
2. Практичні приклади

Початковий код: Початковий код:

int N = 4; int N = 4;
// N — розмірність // N — розмірність
// таблиці // таблиці
for (int i = 0; for (int i = 0;
i < N; i++) i < N; i++)
{ {
for (int j = 0; for (int j = 0;
j < N; j++) j < N; j++)
{ {

// головна діагональ // побічна діагональ


if (i == j) if (i + j == N-1)
cout << " + "; cout << " + ";
else else
cout << " = "; cout << " = ";
} }
cout << endl; cout << endl;
} }
cout << endl; cout << endl;

Малюнок 9 Малюнок 10

Використовуючи ці знання, у майбутньому нам не-


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

13
Урок № 5

До того ж, тепер ми можемо нарешті добудувати дах


будинку, який будували на початку уроку. Спочатку зга-
даємо, що 1 ряд будинку складався з 10 цеглин:

Малюнок 11

Тому ширина даху має складатися з такої самої кіль-


кості. Тепер намалюємо таблицю 10х10 і зафарбуємо
осередки з дахом.

|===| |===|

|===| |===| |===| |===|

|===| |===| |===| |===| |===| |===|

|===| |===| |===| |===| |===| |===| |===| |===|

|===| |===| |===| |===| |===| |===| |===| |===| |===| |===|

14
2. Практичні приклади

Як бачимо, дах знаходиться під головною та побічною


діагоналлю.

for (int i = 0; i < 10; i++)


{
for (int j = 0; j < 10; j++)
{
// область під головною та
// під побічною діагоналями
if (i + j >= 9 && i >= j)
cout << "|===|";
else
cout << " ";
}
cout << endl;
}

У результаті з'єднання цієї частини коду і попередньої


можемо побачити цілком готовий будинок.

Малюнок 12

15
Урок № 5

3. Використання
інтегрованого відладчика
Microsoft Visual Studio
Поняття налагодження.
Необхідність використання відладчика
Як ви вже знаєте, є два види помилок програми.
Помилка на етапі компіляції — помилка синтакси-
су мови програмування. Такі помилки або друкарські
помилки контролюються компілятором. Програма,
яка містить таку помилку, просто не запуститься на
виконання, і компілятор вкаже, у якому рядку коду
сталася помилка.
Помилка на етапі виконання — помилка, що приводить
до некоректної роботи програми або до повної зупинки
останньої. При цьому треба враховувати, що така помил-
ка компілятором не контролюється. Лише в рідкісних
випадках компілятор може видати попередження про
якусь некоректну інструкцію, і загалом у таких ситуаціях
програмісту доводиться виплутуватися самому.
Саме про помилки на етапі виконання й піде мова.
Найчастіше, щоб виявити таку помилку, необхідно про-
йти якийсь фрагмент програми по кроках, так, ніби
програма виконується. Безумовно, при цьому бажано
чітко прорахувати, яке значення в певний момент часу
знаходиться в конкретних змінних. Можна, звичайно,

16
3. Використання інтегрованого відладчика Microsoft Visual Studio

зробити такий підрахунок на аркуші паперу, аналізуючи


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

Виконання програми по кроках


Припустимо, що ми збираємося проаналізувати такий
код:

#include<iostream>
using namespace std;

int main()
{
int a = 0, b = 0;
cout << "Enter a number" << endl;
cin >> a;
cout << "Enter a number" << endl;
cin >> b;
double c = a / b;
cout << "Result " << c << endl;

return 0;
}

Спочатку створіть проєкт і наберіть цей код. Ском­


пілюйте його і переконайтеся, що немає синтаксичних
помилок. Тепер розпочинаємо. Натисніть на клавіатурі
функціональну клавішу F10. Поруч із першим виконува-
ним рядком коду у вас на екрані з’явиться жовта стрілка.

17
Урок № 5

Малюнок 13

Саме ця стрілка вказує, який рядок коду зараз «ви-


конується». Для переходу на наступний крок програми
знову натисніть F10. І ви потрапите в наступний рядок:

Малюнок 14

18
3. Використання інтегрованого відладчика Microsoft Visual Studio

Зверніть увагу на те, що в нижній частині екрана у


вас розташовується набір вкладок для аналізу змінних:

Малюнок 15

Autos — ця вкладка призначена для перегляду значень


змінних, які існують у момент виконання поточного рядка
коду. Вписати на цій вкладці щось від себе не можна — це
автоматична функція. Якщо вкладка Autos прихована, для
її показу потрібно використовувати комбінацію клавіш
Ctrl+D+A.

Малюнок 16

Watch — призначена якраз для тих випадків, коли не-


обхідно самому вибрати змінну для перегляду. Ви просто
вписуєте в поле Name назву змінної, і вона відобража-
ється незалежно від виконуваного коду. Тепер просто
натискаючи F10, «пройдіться» по коду і подивіться, як
будуть змінюватися дані у вкладках.
Примітка. Якщо ви хочете зупинити відладчик
раніше, ніж завершиться аналіз коду, натисніть
клавіші Shift+F5.

19
Урок № 5

Примітка. Ви, напевно, помітили, що відладчик


починає аналіз із першого рядка програми. Якщо
хочете запустити відладчик з певного рядка про-
грами, встановіть курсор у необхідний рядок і на-
тисніть клавіші Сtrl+F10.

Точка зупину
Розглянемо ситуацію, коли ми маємо виконати від-
різок коду і, зупинившись у певному місці, запустити
відладчик. Для цього використовується так звана точка
зупину.
Встановіть курсор у рядок double c = a / b; і натисніть
клавішу F9. Поруч із рядком з’явилася червона точка, це
і є точка зупину.

Малюнок 17

20
3. Використання інтегрованого відладчика Microsoft Visual Studio

Тепер натисніть F5, програма запуститься, виконається


до того моменту, де встановлена точка зупину і перейде
в режим відладчика.

Малюнок 18

Зверніть увагу на стан консолі (вікна програми). Тут


відображається все, що встигло відбутися:

Малюнок 19

Далі йде звичайна робота відладчика. Переміщайте


жовту стрілку за допомогою F10 і стежте, що відбувається

21
Урок № 5

зі змінними. Крім того, заглядайте у вікно консолі, усі


зміни, що відбуваються в коді, будуть відображатися
й там.

Малюнок 20

Після виконання наступного оператора можемо пе-


реконатися в тому, як змінюються змінні і простежити
за проміжним етапом виконання програми з метою ви-
явлення помилок.

Малюнок 21

Як бачимо, у цьому прикладі були допущені логічні


помилки з типами даних, тому що при виконанні опера-
ції з однотипними даними результатом обчислення буде
такий самий тип даних (у нашому випадку це int і тільки
після присвоєння стане double).

«Розумна» точка зупину


Ми щойно запустили аналіз програми з певного місця.
Давайте розглянемо тепер приклад із циклом:

22
3. Використання інтегрованого відладчика Microsoft Visual Studio

Малюнок 22

Зауважимо, що відладчик спрацював відразу після


того, як почалося виконання тіла циклу, тобто на першій
ітерації. Це незручно в разі, якщо ітерацій велика кількість,
і кілька з них вам треба пропустити. Іншими словами —
ви хочете почати аналіз, наприклад, з 5-ї ітерації циклу.
Розв,язати проблему просто — зробити точку зупину
«розумною».
Для цього на самій точці клацаєте правою кнопкою
миші й у меню вибираєте Conditions...

Малюнок 23

23
Урок № 5

Перед вами з'явилося віконце Breakpoint Settings...


Нас цікавить кнопка Conditional Expression.

Малюнок 24

Також нам необхідно вписати умову, при якій запу-


ститься відладчик. Наша умова i==5. Вибираємо is true —
тобто зупинитися, коли умова стане істинною.

Малюнок 25

Натискаємо кнопку Close. Крім цього, при наведенні


курсором миші на breakpoint, можемо переконатися в
його налаштуванні:

Малюнок 26

24
3. Використання інтегрованого відладчика Microsoft Visual Studio

Коли все готово, натискаємо F5 і дивимося, що ста-


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

Малюнок 27

Примітка. Зняти точку зупину можна простим


натисканням F9 у тому рядку, де точка розта-
шовується.
Сьогодні ми розповіли не про всі можливості відлад-
чика. Ми ще торкнемося цієї теми в майбутньому при
вивченні функцій. А зараз настійно рекомендуємо вам
потренуватися працювати з відладчиком, наприклад, на
всіх прикладах уроку і на своєму домашньому завданні.
Успіхів!

25
Урок № 5

4. Домашнє завдання
1. Написати програму, яка для чисел у діапазоні від A
до B визначала кількість їхніх дільників. Наприклад,
A = 10, B = 15.
Дільники для числа 10 — 1 2 5 10;
Дільники для числа 11 — 1 11;
Дільники для числа 12 — 1 2 3 4 6 12;
Дільники для числа 13 — 1 13;
Дільники для числа 14 — 1 2 7 14;
Дільники для числа 15 — 1 3 5 15.
2. Створити програму, яка виводить на екран прості числа
в діапазоні від 2 до 1000. (Число називається простим,
якщо воно ділиться тільки на 1 і на саме себе без за-
лишку; причому числа 1 і 2 за прості не вважаються).
3. Написати програму, яка виводить на екран  — таку
фігуру:

* * *
* * *
* * *
* * * * * * *
* * *
* * *
* * *

26
4. Домашнє завдання

Ширина й висота фігури запитуються в користувача


як додатне, непарне число.
4. На валізі стоїть тризначний код. Він складається з цифр,
які не повторюються. Напишіть програму, яка виведе
всі можливі такі комбінації цифр. А також визначте,
скільки часу знадобиться для відкриття валізи в гір-
шому випадку, якщо на один такий набір витрачається
3 секунди.
5. Наприкінці травня фірма формує звіт по заробітній
платі 12 співробітників за весняний квартал. Написа-
ти програму, яка запитуватиме суму заробітної плати
кожного співробітника за Березень, Квітень і Май.
Необхідно визначити:
■■ виплату по кожному співробітнику за квартал;
■■ загальну виплату по всім співробітникам за квартал.

27
Урок № 5
Вкладені цикли

© Тетяна Лапшун
© Компьютерна Академія «Шаг», www.itstep.org

Усі права на захищені авторським правом фото, аудіо та відеотвори,


фрагменти яких використані в матеріалі, належать їхнім законним влас-
никам. Фрагменти творів використовуються з ілюстративною метою
в обсязі, виправданому поставленим завданням, в межах навчального
процесу і в навчальних цілях Відповідно до ст. 1274 ч. 4 ГК РФ і ст. 21 і 23
Закону України «Про авторське право й суміжні права». Обсяг і спосіб
цитованих творів відповідає прийнятим нормам, не завдає шкоди
нормальному використанню об'єктів авторського права і не обмежує
законні інтереси автора та правовласників. Цитовані фрагменти творів
на момент використання не можуть бути замінені альтернативними,
що незахищені авторським правом аналогами, і як такі відповідають
критеріям сумлінного і чесного використання.
Усі права захищені. Повне або часткове використання матеріалів
заборонено. Узгодження використання творів або їхніх фрагментів
проводиться з авторами і правовласниками. Узгоджене використання
матеріалів можливе лише за умов згадування джерела.
Відповідальність за несанкціоноване копіювання і комерційне вико-
ристання матеріалів визначається чинним законодавством України.

You might also like