3.6 Оператор циклу for
Оператор for забезпечує циклічне повторення деякого оператора певну кількість разів. Оператор, який повторюється, називається тілом циклу. Повторення циклу звичайно здійснюється з використанням деякої змінної (лічильника), яка змінюється при кожному виконанні тіла циклу. Повторення завершується, коли лічильник досягає заданого значення.
Синтаксис оператора:
for([ініціалізація];[перевірка_умови];[нове_значення])
оператор тіла циклу;
Звернемо увагу на те, що кожен з трьох виразів може бути відсутнім, але крапку з комою « ; » не можна упускати. Перший вираз служить для ініціалізації лічильника, другий - для перевірки кінця циклу, а третій вираз - для зміни значення лічильника. Формально роботу циклу можна описати такими кроками:
1. Якщо перший вираз (ініціалізація) присутній, то він обчислюється.
2. Обчислюється вираз умови (якщо він присутній). Якщо умова набуває значення 0, тобто вона є фальш, тоді цикл припиняється, у протилежному випадку він буде продовжений.
3. Виконується тіло циклу.
4. Якщо присутній вираз зміни лічильника, то він обчислюється.
5. Надалі перехід до пункту під номером 2.
Поява у будь-якому місці циклу оператора continue призведе до негайного переходу до пункту 4.
Приклад використання циклу for:
/* друк парних чисел у проміжку від 500 до 0 */
int main(void)
{
long p;
for(p=500;p>=0;p-=2)
cout << p << endl;
}
Для того, щоб продемонструвати гнучкість даного різновиду циклу, розглянемо інші варіанти цієї ж програми. У першому випадку представимо весь перелік обчислень лише в одному операторі for, за яким слідує порожній оператор:
#include
int main(void)
{
long p;
for(p=500;p>=0;cout << p << endl);
system ("pause");
}
Другий варіант використовує оператор continue:
int main(void)
{
long p;
for(p=500;p>=0;p--)
if (p%%2 == 1)
continue;
else
cout << p << endl;
}
Програміст обирає, який з варіантів використати - надати перевагу більш стислому викладанню або навіть взагалі скористатися іншим оператором. Цікаво, що різновид циклу for можна звести до циклу while наступним чином:
for(вираз1;вираз2;вираз3)
оператор;
/* далі - аналогічний цикл while */
вираз1;
while (вираз2)
{ оператор;
вираз3; }
Інша справа - чи є в такій заміні необхідність? Не завжди гнучкість переважає стислість та навпаки. Справа за конкретною ситуацією. Зрештою, вибір циклу може бути й справою смаку конкретного програміста - саме йому вирішувати, які оператори застосувати для вірного запису того чи іншого алгоритму.
Приклад 1. Суму цілих чисел з проміжку від 1 до 15 можна обчислити одним із способів:
1) int n = 1, S = 0;
for (; n < 16; n++) S += n;
2) for (int n = 1, S = 0; n < 16; n++) S+=n;
3) for (int n = 1, S = 0; n< 16; S+=n++);
4) for (int n = 1, S = 0; n< 16; S+=n, n++);
У результаті виконання команд змінній S буде присвоєно значення 120. Зауважимо, що у способах 2,3,4 змінні S i n ініціалізовано (оголошено) безпосередньо у команді циклу for.
Приклад 2. Кількість і добуток усіх парних цілих чисел із проміжку від 4 до 11 можна обчислити так:
int n, D, kil;
for (D = 1, kil = 0, n = 4; n <= 11; n += 2)
{ D*=n; kil++; }