Цикл з параметром. Інструкція for
Інструкція циклу for реалізує алгоритмічну структуру цикл з параметром (або цикл з лічильником). Цикл for застосовується в тому випадку, коли в програмі, перш виконання інструкцій циклу, стає відомим (або заздалегідь визначено) кількість кроків цього циклу. У блок-схемі інструкція for зображується наступним чином:
синтаксис:
Якщо в тілі циклу одна інструкція, то <> можна опустити. Змінна-параметр циклу (лічильник) може бути будь-якого числового типу. Це робить цикл for C ++ таким же універсальним, як і цикл типу while. У розділі модифікації найчастіше використовується операція Постфіксний або префіксного инкремента (або декремента), але може використовуватися будь-який вираз з привласненням, що змінює значення параметра циклу. Цикл працює наступним чином:
- На початку відбувається опис і ініціалізація змінної-лічильника
- Далі перевірка умови: якщо вираз має значення true. відбудеться ітерація
- Після виконання інструкцій тіла циклу проводиться модифікація величини лічильника
Примітка. в C ++ є правилом робити опис змінної-лічильника в заголовку циклу. Але це не обов'язково, тим більше, якщо планується ініціювати кілька змінних в розділі ініціалізації так, як це реалізовано в програмі 9.2. Однак, використання опису змінної-лічильника в заголовку циклу призводить до опису локальної змінної, знищуваної автоматично при завершенні роботи циклу. Тому, без крайньої необхідності, опис змінної-лічильника поза циклом for проводити не слід.
В процесі роботи циклу for не рекомендується змінювати операнди у виразах заголовка циклу - це призведе до різного роду помилок! Але самі значення змінних (або констант), в тому числі змінні значення (лічильник), використовувати можна. Розглянемо класичний приклад.
Програма 9.1 Дано натуральне число N. Вивести все подільники цього числа.
Використання інструкції continue в циклі for
При використанні інструкції continue в циклі for необхідно враховувати особливості роботи цього циклу:
- Інструкції, такі після continue. будуть пропущені
- Потім відбувається модифікація лічильника
- Перехід до виконання наступної ітерації (інакше, перевірки умови)
Покажемо це на прикладі:
Примітка. Зверніть увагу: хоча висновок чисел за умовою пропущений, але інкрементація лічильника виконується. Цей приклад наведено всього-лише для ілюстрації, програмувати цикл так не слід! Це завдання краще вирішити наступним чином:
Кілька виразів в розділі ініціалізації і модифікації
Як ми вже відзначили раніше в заголовку інструкції for повинно бути три розділи. Вирази, що знаходиться в цих розділах, можна опускати, але не можна опускати ";". Зрештою, можна залишити тільки;. Тема у вигляді:
є заголовком «нескінченного» циклу. (Вихід з циклу повинен програмуватися всередині тіла циклу).
C ++ підтримує кілька виразів в розділах ініціалізації і модифікації в заголовку інструкції for. При цьому умова продовження циклу має бути одне!
Наприклад. Постановка завдання: Обчислити факторіал числа, що не перевищує 20.
програма 9.2
Примітка. зверніть увагу, що потік виводу в рядку 12 не відноситься до тіла циклу! (В кінці заголовка -;). Таким чином, даний цикл в тілі має порожню інструкцію, а всі вирази обчислюються в заголовку. Програма 9.2 правильно обчислює факторіал числа від 0 до 20.
Цикл for заснований на діапазоні (range-based for)
Для перебору елементів масиву або контейнера доводиться виконувати однотипні дії, при цьому використовувати громіздкий код. Для спрощення роботи з контейнерами в C ++ існує спеціальна форма циклу for - range-based for (цикл for заснований на діапазоні або діапазонний for).
синтаксис:
Використання range-based for на прикладі C-масиву:
програма 9.3
Щоб елементи масиву можна було змінювати - змінна s повинна бути посилальної змінної (як в прикладі вище). Якщо змінна не є посиланням, то дані будуть копіюватися. Для автоматичного виведення типу в цьому циклі використовується специфікатор auto. range-based for має обмеження на роботу з динамічними масивами: він не підтримує зміну розміру масиву, так як містить фіксований покажчик кінця масиву. При роботі з масивами, що мають фіксований розмір, діапазонний for є прекрасною і безпечною альтернативою звичайному for.
Вкладені цикли for
Так само, як і інші інструкції циклів, for підтримує структуру вкладених циклів. Застосування вкладених циклів for для організації введення і виведення двовимірних масивів виглядає набагато компактніше, ніж при використанні циклу while.
Однак, при вирішенні задач обходу таких масивів, необхідно уникати застосування умовної інструкції if. Найчастіше, завдання можна реалізувати більш раціонально, шляхом маніпуляції індексами (змінними циклу i і j). Тобто, поставити в залежність зміна одного індексу, від значення величини іншого. Розглянемо два приклади.
Програма 9.4 Дана квадратна матриця розміру n, елементи якої рівні 0. Заповнити елементи, що лежать нижче і на самій головній діагоналі одиницями.
Програма 9.5 Скласти програму заповнення масиву числами трикутника Паскаля і виведення цього масиву. Трикутник Паскаля має вигляд:
У цьому трикутнику на вершині і з боків стоять одиниці (в програмі 9.5 трикутник «покладено на бік» - сторони трикутника: перший стовпець і головна діагональ). Кожне число дорівнює сумі двох чисел, розташованих над ним. Рядки трикутника симетричні щодо вертикальної осі і містять біномінальні коефіцієнти.
- Чи може бути замінена в програмі інструкція циклу for на інструкцію циклу while? Чи завжди це можна зробити?
- Коли зручніше застосовувати для організації циклів інструкцію for? while?
- Чи можливі в заголовку інструкції for такі вирази:
- Мінлива i - параметр зовнішнього циклу, а j - вкладеного. Чи доступна буде мінлива j в зовнішньому циклі? i у вкладеному циклі?
Домашня робота
- Зад. 29. Напишіть програму, в якій вводяться натуральні числа a і b. а на дисплей виводяться всі прості числа в діапазоні від a до b (ідея алгоритму Програма 8.5)
- Зад. 30. Досконалим називається число, яке дорівнює сумі всіх своїх дільників, менших його самого (наприклад, число 6 = 1 + 2 + 3). Напишіть програму, яка вводить натуральне число N і визначає, чи є число N досконалим.
- Напишіть програму, яка виводить на екран квадратну числову таблицю розміру n x n. має наступний вигляд при n = 10.