You are on page 1of 25

Циклічні програми

Лекція №6
Три способи організації циклів

Оператор циклу з повторенням for 

Оператор циклу з передумовою while 

Оператор циклу з післяумовою do/while


Стандартний формат циклу for:
for (ініціалізація; умова; зміна) оператор;
Оператор for має три головні складові:
Ініціалізація - переважно передбачає використання оператора
присвоювання, який необхідний для визначення початкового значення
змінної (параметра) циклу.
Умова - це логічний вираз, що визначає умову/умови виконання
циклу.
Зміна - це спосіб зміни значення/значень параметра/параметрів
циклу на кожному кроці його виконання.
Ці складові розділяються символом «;».
Цикл for виконується допоки умова «істина». Коли умова набуває
значення «хибно», виконання програми продовжується з наступного за
циклом for оператора.
Відсутність однієї зі складових оператора for визначається порожнім
елементом <;>
Приклад 1.

#include <stdio.h>
int main(void)
{
    int x;
for(x=1; x<=100; x++) printf("%d˽", x);
printf(“\n”);
system("PAUSE");
}  
Результат: ????????
1 2 3 … 100
Алгоритм виконання оператора for:
1. Спочатку виконується блок ініціалізації.
2. Далі перевіряється виконнання умови.
3. Якщо умова виконується, тобто набуває значення
true, виконується тіло циклу.
4. Після цього відбується зміна значення (значень)
параметра (параметрів) циклу.
5. Якщо ж на деякому кроці виконнаня циклічного
оператора умова не виконується, то відбувається
вихід з оператора циклу, тобто завершення його
виконання, і перехід до виконання наступних після
нього дій.
Приклад 2. Сформулювати умову задачі за наведеним кодом програми.
for(x=100; х!=65; х-=5)
{
z = sqrt(х);
printf("The square root of %d,˽%f", x, z) ;
}
Результат: ???????

Приклад 3. Сформулювати умову задачі за наведеним кодом програми.


int х=10, y;
for (у=10; у! =х; ++у) printf ("%d ˽", у); //*
printf(“\n%d", у);

Результат у=???????
˽
10
УВАГА! У циклі for перевірка умови виконується на самому початку, а це означає, що тіло цикла
може взагалі не виконатися, якщо початкова умова хибна. Розглянемо оператор,
помічений //*, у таких варіантах: 1) 10
11
2) 10
1) for (у = 10; у==х; ++у) printf ("%d ˽", у); 11
2) for (у = 10; у==х; у++) printf ("%d ˽", у); 3)
3) for (у = 10; у!=х; у++) printf ("%d ˽", у); 10
Зміна значень змінної у у наступних
операторах циклу

1) for (у = 10; у==х; ++у) printf ("%d ˽", у);


Збільш поточне значення у на наступне і
візьми його.
2) for (у = 10; у==х; у++) printf ("%d ˽", у);
Візьми поточне значення у і збільш його на
наступне.
Приклад 4. Сформулювати умову задачі за наведеним кодом програми.
for(x=1; x<=10; x++);
printf("%d ", x);
Результат: х=???????
11
Приклад 5. Сформулювати умову задачі за наведеним кодом програми.
for (сh = 'a'; ch != 'p';) scanf ("%c", &ch);
Результат: ????????
Цикл виконуватиметься до того часу, допоки з клавіатури не буде
введено символ ‘p’!
Приклад 6. Сформулювати умову задачі за наведеним кодом програми.
for(; ;);
Результат: ???????
Нескінечний цикл!
Оператор послідовного обчислення
Оператор «,» вказує на необхідність
виконання деякої послідовності операцій.
Значення всього виразу, що складається зі
списка виразів, розділених комами, дорівнює
остаточному значенню послідовного виразу в
цьому списку.
Наприклад, після виконання фрагмента
програми
y = 15;
x = (y-=5, 50/y);
отримається результат х=5.
Оператор послідовного обчислення можна використовувати й в
інших ситуаціях.
1. Будь-який вираз з операцією присвоєння, взятий в круглі
дужки, матиме значення, що дорівнює змінній у лівій частині
операції присвоювання.
Наприклад, вираз (а=7+2) має значення 9, а відповідно
логічний вираз ((а=7+2)<10) завжди матиме значення «істина».
2.Наступна конструкція:
((сh = getch( )) == 'i')
дозволяє вводити значення змінної сh і видавати результат
«істина» тоді і тільки тоді , коли буде введено символ 'i'.
Приклад фрагмента коду: Яку роль в циклі відіграє змінна х?
int x; char ch;
for (x=1; x<=10; x++) printf("%i ",(ch=getch())=='i');
printf("\n"); 0 1 1 0 0 0 1 0 1 0
Запитання. Як пояснити виконання
наступного оператора розгалуження?

if (a=x+y) printf(“%d\n”,x);
else printf(“%d\n”,y);

Чому компілятор не видає синтаксичної


помилки?
3.В дужках можна записувати і декілька операторів присвоєння,
що утворюють оператор послідовного обчислення. Обчислення
здійснюються зліва направо і весь вираз набуде значення останнього
обчисленого виразу.
Наприклад, вираз
z = (х = у, у = getch( ));
виконуватиметься у такому порядку:
• значення змінної у присвоїться змінній х;
• потім вводитиметься символ з клавіатури, якого набуде змінна у.
Результат: змінна z отримає значення змінної у.
Проаналізувати обчислення виразу (z = х = у, у = getch( ));
Приклад фрагмента кода:
int x=1,y=2,z=3; Було натиснено клавішу “4”
z=x=y, y=getch(); x=2 y=4 z=2
Було натиснено клавішу “f”
printf("x=%i y=%c z=%i ",x,y,z);
x=2 y=f z=2
printf("\n"); Чому “4” і “f”?
Якщо у фрагменті кода зробити зміни:
int x=1,y=2,z=3;
z=x=y, y=getch();
printf("x=%i y=%d z=%i ",x,y,z);
printf("\n");
то буде виведено результат:

Було натиснено клавішу “4”


x=2 y=52 z=2
Було натиснено клавішу “f”
x=2 y=102 z=2
4. Операція послідовного обчислення
застосовується для побудови виразів циклу
for і дозволяє паралельно змінювати
значення декількох керуючих змінних.
Приклад.
for (z=10, b=20; z<=b; z++, b--) printf("%d,˽%d; ˽",z,b);
Змінні z і b ініціалізуються і модифікуються з
використанням списка виразів, розділених
комами.
Результат:
10, 20; 11, 19; 12, 18; 13, 17; 14, 16; 15, 15
Особливості використання константних
величин для організації циклів
const int n=2; int m=3;
int i,j;
for (i=1; i<=n; printf("%d˽",i),i++); 1 ˽ 2
printf(“\n%d\n”,i); 3
for (j=1; j<=m; printf("%d ˽",j),j++); 1 ˽2 ˽3
printf(“\n %d\n”,j); 4
n++; m++; // чи можна так записувати?
const int n=2; int m=3;
int i,j;
for (i=1; i<=n; i++,printf("%d˽",i));
2˽3
printf(“\n %d\n”,i);
for (j=1; j<=m; ++j,printf("%d ˽“,j)); 3
printf(“\n %d\n”,j); 2 ˽3 ˽4
4

Що зміниться під час виконання такого


оператора:
for (i=1; i<=n; i++) printf("%d˽",i);
const int n=2, m=3;
int i,j;
for (i=1; i<=n; printf("%d˽",i++)); 1˽2
printf(“\n %d\n”,i); 3
for (j=1; j<=m; printf("%d ˽",++j)); 2 ˽3 ˽4
printf(“\n %d\n”,j); 4

Що змінилося?
Цикл з передумовою
Загальний вигляд:
while (умова) оператор;

Приклад 7.

char ch;
ch = '\0‘; // ініціалізація ch в значення “порожнє”
while (ch!='A') ch = getchar ();

Обробляється операція введення з клавіатури,


допоки не буде введено символ «А».
Приклад 8.
Конструкцію цикла
for ( i=0; i<N; i++, printf(“%i˽“,i));
можна записати і таким чином:
i=0;
while (i<N) i++, printf(“%i˽“,i); //чи коректний запис?
Увага! У тілі цикла з передумовою записано
послідовний оператор ”,”, аналогічний оператору:
{i++; printf(“%i˽“,i);}
Приклад 9.
int working;
working = 1; // істина
while (working)
 {
  working=<process1>;
   if (working)
      working=<process2>;
   if (working)
      working=<process3>;
 }

Коли перерветься виконання циклу?


Приклад 10.

while ((ch = getchar()) != 'А');

Чи розглядався подібний приклад для іншої


конструкції циклу?

for (; (ch = getchar()) != 'А'););


Цикл з післяумовою

Загальний вигляд:
do
{
послідовність операторів;
}
while (умова);

За наявності одного оператора фігурні дужки


не обов’язкові.
Приклад 11.1.
int i=0;
do
{
1 2 3 4 5 6 7 8 9 10
i++;
printf("%i˽",i);
}
while (i<10);
printf("\n");

Приклад 11.2.
int i=0;
do i++, printf("%i ˽",i); // використано один послідовний оператор
while (i<10);
printf("\n");
Приклад 12.

do
scanf ("%d", &num);
while (num > 100);

Здійснюється читання чисел з клавіатури


допоки одне з них не стане менше або рівне
100
Приклад 13.

char ch;
printf("1. Check Spellirig\n");
printf("2. Correct Spelling Errors\n");
printf("3. Display Spelling Errors\n");
printf("    Enter your choice: ");
do {
ch = getche(); // читання з клавіатури з виведенням у веденого символа
switch(ch)
{
case '1' :  check_spelling (); break;
case '2' :  correct_errors (); break;
case '3' : display_errors(); break; // обов’язково?
}
}
while(ch=='1' || ch=='2' || ch=='3');

Зациклювання програми допоки не буде здійснено коректний вибір.

You might also like