Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 (8).doc
Скачиваний:
22
Добавлен:
12.05.2015
Размер:
571.39 Кб
Скачать

Оператори циклу.

Оператори циклу дозволяють описати повторюваний процес. Дії, які повторюються, прийнято називати тілом циклу. Кількість повторень тіла циклу має бути яким-небудь способом задана, інакше цикл буде нескінченним.

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

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

Будь-який оператор циклу складається з двох частин:

  • заголовка циклу, що визначає число ітерацій циклу;

  • тіла циклу, що містить послідовність виконуваних операторів (у більшості випадків задається як один складений оператор).

Оператор арифметичного циклу. Служить для кодування арифметичних циклів, тобто циклів, число повторень яких відомо заздалегідь.

Основним способом організації циклу є використання спеціальної змінної – лічильника (параметра) циклу. Для організації циклу слід передбачити задання початкового значення лічильника циклу, яке буде змінюватися під час повторення циклу, його кінцевого значення та кроку зміни цієї змінної перед кожним новим повторенням. Блок-схема, що відповідає циклу з параметром, представлена на рис. 4.

Рис.4. Блок-схема арифметичного циклу

Тут i - параметр циклу, i0 - початкове значення параметра, iT - кінцеве значення параметра, iS - крок приросту параметра. Циклічна гілка блок-схеми виконується для всіх i, починаючи з i0 і закінчуючи iT  з кроком iS  (тобто для i0 , i0+iS , i0+2iS , i0+3iS , ...). Як тільки i вийде за межі інтервалу [i0 ,iT], повторення перериваються і програма виходить з циклу.

При цьому для більшості мов програмування прийнято наступну угоду: початкове і кінцеве значення параметра циклу не можна перевизначати в тілі циклу і після завершення циклу це значення є не визначеним, тобто використовувати його для подальших обчислень не можна.

У мові С/С++ оператор арифметичного циклу (циклу з параметром) має формат:

for ( [вираз_1]; [вираз_2]; [вираз_3]) // заголовок циклу

оператор; // тіло циклу

де for – зарезервоване слово, вираз_1 - ініціалізація параметра циклу, вираз_2 - умова повторення циклу, вираз_3 – задання кроку зміни параметра циклу.

Механізм його реалізації: тіло циклу (оператор) повторно виконується для кожного значення лічильника циклу при його послідовній (із заданим кроком) зміні від свого початкового значення до кінцевого. Наприклад,

for (i=1; i<=20; i++) printf(”%3d”, i);

x=3;

for (i=x+2; i>=0; i- -) printf(”%3d”, i).

Часто у мовах програмування даний оператор називають оператором FOR. Особливості його реалізації у мові С/C++:

  • допускається задання кроку для зміни параметра циклу

for (int i=1; i<=n; i+=2) { … };

  • у заголовку циклу допускається оголошення типу параметра циклу

for (int i =1; i<=n; i+= 2) { … };

  • можливе використання декількох параметрів циклу

for (n = 0,k = 5; n<k; n++,k--) { … };

Алгоритмічні мови програмування, зокрема, Pascal і С/С++, накладають певні обмеження на використання лічильника (параметра) циклу:

  • він може бути тільки порядкового типу;

  • забороняється явна зміна його значення у тілі циклу (наприклад, оператором присвоювання).

Слід зазначити, що параметр циклу може і не використовуватися в тілі циклу, оскільки основне його призначення – це управління числом повторень циклу. Наприклад, значення y=xn, де n0 – ціле, можна обчислити за наступним алгоритмом: попередньо покласти y=1, а потім рівно n раз домножити це значення на x:

y=1;

for (i=1; i<=n; i++)

y=y*x.

Як видно, тут параметр циклу і служить лише для того, щоб забезпечити виконання оператора y=y*x потрібне число раз.

Наприклад, програма для визначення суми введених дійсних чисел.

// Визначити суму N введених дійсних чисел

#include <iostream.h>

int main ()

{ float s=0, // сума

num; // число

int i, // лічильник циклу

n; // кількість введених чисел

cout <<“Input amount of numbers:”;

cin >> n;

for (i=1; i<=n; i++)

{ printf(“Input number:”);

scanf(“%f”, &num);

s+= num;

}

printf(“\nSum=%5.2f”,s);

system(”pause”);

return 0;

}

Оператор циклу з передумовою. Використовується для задання ітераційних циклічних процесів, коли число повторень циклу заздалегідь невідоме, а визначається в процесі роботи програми. Специфічною особливістю даного оператора циклу є попередня перевірка умови його працездатності і лише потім (за необхідності) виконання тіла циклу. Тому при деяких значеннях вихідних даних передбаченні у циклі дії взагалі можуть не виконуватися.

Оператору циклу з передумовою відповідає блок-схема на рис. 5.

Рис.5. Блок-схема циклу з передумовою

У мовах програмування оператором циклу з передумовою є, зазвичай, оператор while наступного формату:

while (умова)

оператор;

Механізм його реалізації: перед кожною ітерацією перевіряється задана в заголовку циклу умова і доти, поки вона істинна, тіло циклу виконується; коли ж умова стає хибною, цикл припиняє свою роботу.

Особливості реалізації циклу з передумовою:

- цикл може не виконуватися жодного разу;

- тіло циклу виконується поки умова істинна (true);

- у тілі циклу повинен бути оператор, що впливає на умову.

Наприклад,

n= 1; s= 0;

while (n< 11)

{ s = s+n;

n = n+2;

}

Оператор циклу з передумовою зручний у випадках, коли за певних умов тіло циклу не повинне виконуватися жодного разу. Також його рекомендується використовувати для задання ітераційних циклів, коли зручніше сформулювати умову, при виконанні якої циклічний процес буде продовжувати виконуватися.

Приклад 1. Нехай заданий нескінчений ряд виду . Знайти суму даного ряду із точністю ε = 0.0001.

Щоб знайти суму даного ряду із заданою точністю треба продовжувати процес підсумовування елементів ряду до тих пір, поки |Sk+1 - S k|< ε, тобто модуль різниці між сумами для k-го і (k+1)-го кроку не стане меншим за ε.

int main()

{ float eps=0.0001, //точність обчислень

s=1, //проміжкова сума, обчислена на поточній ітерації

s1=0; //проміжкова сума, обчислена на попередній ітерації

int k=1; //номер елемента ряду

while (abs(s-s1)>= eps)

{ s1=s;

k=k+1;

s=s+1/k;

}

printf (”Suma row -%5.2f”, s);

system(”pause”);

return 0;

}

Приклад 2. Дано числа a, b (a > 1, b > a). Одержати всі члени послідовності а, а2, а3, …, що менші числа b.

#include <iostream.h>

int main ()

{ float a,b, // вхідні дані

c; // елементи послідовності

cout <<“Input a,b:”;

cin >> a >> b;

c = a;

while (c < b)

{ cout << c << “ “;

c*= a;

}

system(”pause”);

return 0;

}

Оператор циклу з постумовою. Також є оператором, що використовується для задання ітераційних циклів. Але, на відміну від попереднього оператора, оператор циклу з постумовою передбачає спочатку виконання тіла циклу, а лише потім перевірку умови його продовження або завершення. Тому передбачені у такому циклі дії виконуються як мінімум один раз.

Оператор циклу з післяумовою є в багатьох мовах програмування, але в деяких із мов відповідна умова розуміється як умова завершення циклу, в інших – як умова його продовження. Тому при «перекладі» таких програм на інші мови програмування можуть виникати непорозу-міння.

У випадку мови C/C++ оператором циклу з постумовою є оператор do-while. Його формат:

do

оператор

while (умова).

Механізм його реалізації: після кожної ітерації перевіряється умова продовження роботи циклу і доти, поки вона істинна (TRUE), цикл продовжує свою роботу; коли ж умова стає хибною, виконання циклу завершується.

Даному оператору циклу відповідає блок-схема, представлена на рис. 6.

Рис.6. Блок-схема циклу з постумовою

Особливості реалізації циклу з постумовою:

- цикл виконується хоча б один раз;

- тіло циклу виконується поки умова є хибною (false);

- у тілі циклу повинен бути оператор, що змінює умову.

У С/С++ оператор циклу з післяумовою рекомендується використовувати для задання ітераційних циклів, коли число повторень циклу заздалегідь невідоме, але зручно сформулювати умову закінчення виконання циклу.

Наприклад, обчислимо із заданою точністюε > 0. Для знаходження квадратного кореня заданого числа використаємо ітераційний метод Ньютона. Цей метод полягає у наступному: вибирається деяке початкове наближення y = y0, а потім знаходяться наступні наближення yn по рекурентній формулі

, де n = 1, 2, … .

Цю формулу можна представити у вигляді yn = yn-1 + vn-1, де є поправкою до попереднього наближення. Відомо, що цей процес сходиться при будь-якому початковому наближенніy0. При цьому практично можна вважати, що потрібна точність досягнута, коли наступна врахована поправка vn-1 по абсолютній величині стає меншою за ε.

int main()

{ float x, //введене число

y=1, //наближене значення квадратного кореня введеного числа

v, //поправка наближення

eps; //точність обчислення кореня

printf(“Input X :”); scanf(“%f”, x);

printf(“Input E :”); scanf(“%f”, eps);

do

{ v=(x /y - y) /2;

y=y+v;

}

while( abs(v)>eps);

printf(“Y=”); scanf(“%f”, y);

system(”pause”);

return 0;

}

Кожен цикл з постумовою можна звести до оператора циклу з передумовою, який в усіх мовах програмування розуміється однаково. Наприклад, розглянуту вище задачу знаходження квадратного кореня із заданою точністю можна вирішити і з використанням циклу з передумовою:

y=1; v=1;

while (abs(v) >= eps)

{ v=(x /y - y) /2;

y=y+v;

}

Приклад програми знаходження кiлькості та суми введених чисел.

#include <stdio.h>

int main ()

{ int number, // введене число

total = 0, // сума введених чисел

count = 1; // кiлькiсть введених чисел

do

{ printf ("number \n"); scanf ("%d", &number);

total += number;

count++;

}

while (number != 0);

count- -;

printf("total=%d count=%d \n", total, count);

system(”pause”);

return 0;

}

Всі оператори циклів допускають вкладеність інших операторів, у тому числі і інших циклів. Наприклад, для а = 1, 2, 3 знайти значення функції y(x) = x2 + а при х = 2, 5, 8, 11.

int main( )

{ int x, // значення аргумента функції

a , // значення параметра функції

y; // значення функції

for (a = 1; a<= 3 ; a++)

{ x = 2;

while (x < 12)

{ y = pow(x, 2) + 7;

printf("При х = %d y =%d\n", x, y);

x = x+3;

}

}

system(”pause”);

return 0;

}

Рекомендації з вибору циклів. Для організації циклів слід користуватися найбільш підходящим оператором.

Так цикл do–while має сенс застосовувати в тих випадках, коли тіло неодмінно треба буде виконати хоча б один раз, наприклад, при перевірці введення. Цикл for використовується, якщо кількість повторень відома заздалегідь і параметр має порядковий тип. Цикл while - у всіх інших випадках.

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

Для дострокового переривання

роботи будь-якого циклу використовуються оператори переходу, зокрема,

  • BREAK - дострокове закінчення циклу;

  • CONTINUE - дострокове закінчення ітерації циклу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]