Оператори циклу використовують для здійснення багаторазового повторення деякої послідовності дій. Кожен цикл складається з тіла циклу, тобто операторів, що виконуються декілька разів. Один прохід циклу називається ітерацією. У мові C++ існують три оператори циклу: while, do while, for.
Оператор циклу з передумовою while виконується, якщо умова перевіряється до початку циклу, і має вигляд:
while (вираз-умова) оператор;
де оператор — тіло циклу, що може бути представлено простим або складеним оператором.
Реалізується оператор while таким чином: якщо значення виразу-умови не дорівнює нулю («істина»), то виконується тіло циклу, а в протилежному випадку, тобто коли значення виразу дорівнює нулю («неправда»), — цикл не працює і керування передається наступному за циклом while оператору. Цикл з передумовою може не виконуватися жодного разу.
Як вираз-умова часто використовуються відношення. Наприклад, наступна послідовність операторів обчислює суму квадратів перших n натуральних чисел:
int і=0, sum=0;
while (і < n) sum += ++і * і;
Якщо у виразі-умові необхідно порівняти покажчик з нульовим значенням (з порожнім покажчиком), то наступні записи оператора while рівнозначні:
while (point != NULL) . . .
while (point) . . .
while (point != 0) . . .
Оператор while зручно застосовувати у випадках, коли кількість ітерацій заздалегідь не відома.
Оператор циклу з післяумовою do while звичайно застосовується у випадках, коли тіло циклу виконується хоча б один раз, і має таку форму запису:
do оператор while (вираз-умова);
У процесі виконання оператора do while спочатку здійснюється вхід до тіла циклу і виконується оператор, що являє собою тіло циклу (цей оператор може бути простим або складеним); далі перевіряється вираз і, якщо він правдивий («істина»), — цикл повторюється, а коли вираз помилковий («неправда») — здійснюється вихід з циклу.
Оператор циклу з параметром for має форму запису вигляд:
for ([вир1; вир2; вирЗ]) оператор;,
де вир1 — вираз ініціювання, що використовується для встановлення початкового значення параметра, це вираз присвоювання;
вир2 — вираз умови, що визначає умову повторення циклу;
вирЗ — вираз ітерації, який визначає крок зміни параметра, що керує циклом, після кожного виконання.
Вирази вир1, вир2 та вирЗ — необов’язкові параметри, які розділяються символом «;».
Оператор циклу for реалізується таким чином:
- виконується вираз ініціювання (виконання цієї нотації може бути здійснено до оператора for);
- обчислюється вираз-умова;
- якщо умовний вираз приймає значення «істина» — виконуються оператори циклу;
- обчислюється вираз ітерації;
- знову перевіряється умова;
- як тільки умова прийме значення 0 («неправда»), керування передається оператору, що розташований за оператором циклу for.
Оскільки в операторі for перевірка виразу-умови відбувається перед циклом, то у випадку помилкової умови цикл може жодного разу не виконуватися.
Оператор for може використовувати декілька змінних, що керують циклом, а будь-які вирази можуть бути відсутніми, наприклад:
int n, у; for (int к = 0, n = 20; к <= n; k++, n--) y = k * n; або int = і; for (; і < 4; i++) .....................
Останній фрагмент має два вирази ініціювання і два вирази ітерації. Спочатку відбувається присвоювання значень змінним k = 0 і n = 20, далі здійснюється порівняння k <= n і, якщо ця умова має значення «істина», то буде виконуватися тіло циклу, а потім вираз k++ і n–, якщо ж умова не виконується, то цикл припиняє свою роботу.
Операторам циклів с параметром for слід віддати перевагу при організації циклів з лічильниками.
Приклад 5.1. Обчислити значення функції y = ax2-sinx, якщо а = 10.5; х є [-1; 2]; hx = 0,5. Скласти програми з використанням різних операторів циклу.
Розглянемо перший варіант програми (див. Р5_1_1.СРР) з використанням оператора циклу з передумовою while:
// Р5_1_1.СРР — вычисление функции у = ах2 - sinx //......... с использованием оператора цикла while #include <iostream.h> #include <math.h> #include <conio.h> main ( ) { float a = 10.5, x, y; x = -1 ; while (x <= 2) { у = a *pow(x,2) - sin(x); // у = a* x* x- sin(x); cout << "x= " << x << " y= " << у << endl; x += 0.5; } getch (); //задержка экрана }
Другий варіант програми (див. Р5__1_2.СРР) із застосуванням оператора циклу з післяумовою do while має вигляд:
// Р5_1 _2.СРР — вычисление функции у = ах2 - sinx //......... - использованием оператора цикла do while #include <iostream.h> #include <math.h> #include <conio.h> main ( ) { float a(10.5), x(-1), y; do { у = a *pow(x,2) - sin(x); cout << "х= " << x << " у= " << у << endl; x += 0.5; } while (x <= 2); getch (); //задержка экрана }
Третій варіант програмної реалізації (див. Р5_1_З.СРР) при кладу з використанням оператора циклу з параметром for мае такий вигляд:
// Р5_1_З.СРР — вычисление функции у = ах2 - sinx //----- —с использование оператора цикла for #include <iostream.h> #include <math.h> #include <conio.h> main ( ) { float a = 10.5, x, y; for (x = -1; x <= 2; x+= 0.5) { у = a *pow(x,2) - sin(x); cout << "x= " << x << " у= " << у << endl; } getch (); }
Приклад 5.2. Обчислити значення функції z при різних значенняx а і b, якщо х є [1; 4],hx = 0,5; у є [4; 12], hy = 2.
Розглянемо один з варіантів програмної реалізації цього прикладу, що відповідає алгоритму, зображеному на рис. 5.1.
// Р5_2. СРР — использование операторов do while и for #include <iostream.h> #include <math.h> #include <conio.h> main ( ) { float x, y, z; int a, b; сin >> a >> b; x=1; cout.precision(4); do { cout << " x = " << x << endl; for (y = 4; у <= 12; у += 2) { if( x < 3) z = pow(a,x) + sqrt(x + y); else z = a*exp(x) + log(b + y); cout << "у = " << у << " z = " << z << endl; } x += 0.5; } while (х <= 4); getch (); }
Функція z, згідно з умовою, залежить від двох аргументів х і у, що змінюються. У цьому випадку спочатку фіксується значення однієї змінної (наприклад, х) і перебираються всі значення іншої (тобто у), потім береться друге значення першої змінної і знову перебираються всі значення іншої, і так доти, поки не будуть використані всі значення першої змінної.
У програмі присутні два цикли: зовнішній цикл (do while), у якому змінює свої значення змінна х, і внутрішній (for), де перебираються всі значення змінної у. Обидва ці цикли можна було б організувати за допомогою яких завгодно операторів циклу.
Процес розгалуження при обчисленні функції за першою або другою формулами здійснюється умовним оператором if.