Оператори циклу в мові Сі

Оператори циклу в мові Сі

Циклом називається блок коду, який для виконання завдання потрібно повторити кілька разів.

Кожен цикл складається з

  • блоку перевірки умови повторення циклу
  • тіла циклу


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

У мові Сі наступні види циклів:

  • while - цикл з передумовою;
  • do. while - цикл з умовою поста;
  • for - параметричний цикл (цикл з заданим числом повторень).

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

Загальна форма запису


Якщо Умова виконується (вираз, що перевіряє Умова. Не дорівнює нулю), то виконується БлокОперацій. укладений у фігурні дужки, потім Умова перевіряється знову.
Послідовність дій, що складається з перевірки Умови та виконання БлокаОперацій. повторюється до тих пір, поки вираз, що перевіряє Умова. не стане хибним (рівним нулю). Пристрій виходить з циклу, і проводиться виконання операції, що стоїть після оператора циклу.

Приклад на Сі. Порахувати суму чисел від 1 до введеного k

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k; // оголошуємо цілу змінну key
int i = 1;
int sum = 0; // початкове значення суми дорівнює 0
printf ( "k =");
scanf ( ".". k); // вводимо значення змінної k
while (i <= k) // пока i меньше или равно k
sum = sum + i; // додаємо значення i до суми
i ++; // збільшуємо i на 1
>
printf ( "sum =. \ n". sum); // вивід значення суми
getchar (); getchar ();
return 0;
>


результат виконання

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

Приклад нескінченного циклу

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

Наприклад, якщо в наведеному вище коді програми ввести k = -1, то отримаємо результат

Цикл з умовою поста do. while

Загальна форма запису

do БлокОперацій;
> While (Умова);


Цикл do. while - це цикл з умовою поста, де істинність виразу, який перевіряє Умова перевіряється після виконання Блоку Операцій. укладеного у фігурні дужки. Тіло циклу виконується до тих пір, поки вираз, що перевіряє Умова. не стане хибним, тобто тіло циклу з умовою поста виконається хоча б один раз.

Використовувати цикл do. while краще в тих випадках, коли повинна бути виконана хоча б одна ітерація, або коли ініціалізація об'єктів, що беруть участь в перевірці умови, відбувається всередині тіла циклу.

Приклад на Сі. Перевірка, що користувач ввів число від 0 до 10

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
#include // для використання функції system ()
int main () int num; // оголошуємо цілу змінну для числа
system ( "chcp 1251"); // переходимо на українську мову в консолі
system ( "cls"); // очищаємо екран
do printf ( "Введіть число від 0 до 10:"); // запрошення користувачеві
scanf ( ".". num); // введення числа
> While ((num <0) || (num> 10)); // повторюємо цикл поки num<0 или num>10
printf ( "Ви ввели число.". num); // виводимо введене значення num - від 0 до 10
getchar (); getchar ();
return 0;
>

Параметричний цикл for

Загальна форма запису

for (Ініціалізація; Умова; Модифікація)
БлокОперацій;
>

for - параметричний цикл (цикл з фіксованим числом повторень). Для організації такого циклу необхідно здійснити три операції:

  • Ініціалізація - присвоювання параметру циклу початкового значення;
  • Умова - перевірка умови повторення циклу, найчастіше - порівняння величини параметра з деяким граничним значенням;
  • Модифікація - зміна значення параметра для наступного проходження тіла циклу.


Ці три операції записуються в дужках і розділяються крапкою з комою; ;. Як правило, параметром циклу є целочисленная змінна.
Ініціалізація параметра здійснюється тільки один раз - коли цикл for починає виконуватися.
Перевірка Умови повторення циклу здійснюється перед кожним можливим виконанням тіла циклу. Коли вираз, що перевіряє Умова стає хибним (рівним нулю), цикл завершується. Модифікація параметра здійснюється в кінці кожного виконання тіла циклу. Параметр може як збільшуватися, так і зменшуватися.

Приклад на Сі. Порахувати суму чисел від 1 до введеного k

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k; // оголошуємо цілу змінну key
int sum = 0; // початкове значення суми дорівнює 0
printf ( "k =");
scanf ( ".". k); // вводимо значення змінної k
for (int i = 1; i<=k; i++) // цикл для переменной i от 1 до k с шагом 1
sum = sum + i; // додаємо значення i до суми
>
printf ( "sum =. \ n". sum); // вивід значення суми
getchar (); getchar ();
return 0;
>

результат виконання

У записі циклу for можна опустити одне або кілька виразів, але не можна опускати крапку з комою, що розділяють три складові циклу.
Код попереднього прикладу можна представити у вигляді

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k; // оголошуємо цілу змінну key
int sum = 0; // початкове значення суми дорівнює 0
printf ( "k =");
scanf ( ".". k); // вводимо значення змінної k
int i = 1;
for (; i<=k; i++) // цикл для переменной i от 1 до k с шагом 1
sum = sum + i; // додаємо значення i до суми
>
printf ( "sum =. \ n". sum); // вивід значення суми
getchar (); getchar ();
return 0;
>

Параметри, що знаходяться в виразах в заголовку циклу можна змінити при виконанні операції в тілі циклу, наприклад

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k; // оголошуємо цілу змінну key
int sum = 0; // початкове значення суми дорівнює 0
printf ( "k =");
scanf ( ".". k); // вводимо значення змінної k
for (int i = 1; i<=k; ) // цикл для переменной i от 1 до k с шагом 1
sum = sum + i; // додаємо значення i до суми
i ++; // додаємо 1 до значення i

>
printf ( "sum =. \ n". sum); // вивід значення суми
getchar (); getchar ();
return 0;
>

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

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k; // оголошуємо цілу змінну key
printf ( "k =");
scanf ( ".". k); // вводимо значення змінної k
for (int i = 1, j = 2; i<=k; i++, j+=2) // цикл для переменных
printf ( "i =. j =. \ n". i, j); // виводимо значення i і j
>
getchar (); getchar ();
return 0;
>

вкладені цикли

У Сі допускаються вкладені цикли, тобто коли один цикл знаходиться всередині іншого:

for (i = 0; i<
for (j = 0; j ; // блок операцій Цікла2
>
// блок операцій циклу1;
>

Приклад. Вивести числа від 0 до 99, по 10 в кожному рядку

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () for (int i = 0; i<10; i++) // цикл для десятков
<
for (int j = 0; j <10; j++) // цикл для единиц
printf ( "% 2d". i * 10 + j); // виводимо обчислене число (2 знакоместа) і пробіл
>
printf ( "\ n"); // в зовнішньому циклі переводимо рядок
>
getchar (); // scanf () не використовувався
return 0; // тому консоль можна утримати одним викликом getchar ()
>

Рекомендації по вибору циклу

При виборі циклу необхідно оцінити необхідність перевірки умови при вході в цикл або по завершенні проходження циклу.
Цикл з умовою поста зручно застосовувати у випадках, коли для перевірки умови потрібно обчислити значення виразу, яке потім буде розміщено в тілі циклу (див. Вище приклад введення числа від 0 до 10).
Цикл c передумовою використовується в разі якщо всі змінні, які беруть участь у вираженні, перевіряє умови, проініціалізовані заздалегідь, але точне число повторень циклу невідомо чи передбачається складна модифікація змінних, що беруть участь у формуванні умови повторення циклу.
Якщо цикл орієнтований на роботу з параметром, для якого заздалегідь відомо кількість повторень і крок зміни, то більш привабливим є параметричний цикл. Дуже зручно використовувати параметричний цикл при роботі з масивами для перебору елементів.

Оператори переривання і продовження циклу break і continue

У тілі будь-якого циклу можна використовувати оператори переривання циклу - break і продовження циклу - continue.

Оператор break дозволяє вийти з циклу, але не завершити його.
Оператор continue дозволяє пропустити частину операторів тіла циклу і почати нову ітерацію.

Приклад на Сі. Вивести числа від 0 до 99 нижче головної діагоналі

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () for (int i = 0; i<10; i++) // цикл для десятков
<
for (int j = 0; j <10; j++) // цикл для единиц
if (j> i) // якщо число одиниць більше числа десятків в числі
break; // виходимо з вкладеного циклу і переходимо до нового рядка
printf ( "% 2d". i * 10 + j); // виводимо обчислене число (2 знакоместа) і пробіл
>
printf ( "\ n"); // в зовнішньому циклі переводимо рядок
>
getchar (); // scanf () не використовувався
return 0; // тому консоль можна утримати одним викликом getchar ()
>

Приклад на Сі. Вивести числа від 0 до 99 виключаючи числа, що закінчуються на 5 або 8

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () for (int i = 0; i<10; i++) // цикл для десятков
<
for (int j = 0; j <10; j++) // цикл для единиц
if ((j == 5) || (j == 8)) // якщо число одиниць в числі одно 5 або 8,
continue; // переходимо до наступної ітерації циклу
printf ( "% 2d". i * 10 + j); // виводимо обчислене число (2 знакоместа) і пробіл
>
printf ( "\ n"); // в зовнішньому циклі переводимо рядок
>
getchar (); // scanf () не використовувався
return 0; // тому консоль можна утримати одним викликом getchar ()
>

При вкладених циклах дії операторів break і continue поширюється тільки на саму внутрішню структуру, в якій вони містяться.

Оператор безумовного переходу goto

Загальна форма запису

goto мітка;
.
Мітка. операція;

Приклад на Сі. Вивести всі цілі числа від 5 до 0.

#define _CRT_SECURE_NO_WARNINGS // для можливості використання scanf
#include
int main () int k = 5;
M1: if (k <0) // если k<0,
goto M2; // переходимо на мітку M2 (виходимо з програми)
printf ( ".". k); // виводимо значення k
k--; // зменшуємо k на 1
goto M1; // переходимо на мітку M1 (повторюємо операції вище)
M2: getchar ();
return 0;
>

Використання оператора goto в програмах на Сі без крайньої необхідності не рекомендується, оскільки це може спричинити за собою ряд помилок, пов'язаних з поганою Новомосковскемостью коду програми. Використання операторів циклу дозволяє практично повністю виключити необхідність використання оператора goto.