русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Оператори циклу. Цикл з параметром. Оператор for


Дата додавання: 2014-04-22; переглядів: 1782.


Синтаксис оператора for такий:

 

for ( вираз_1; вираз_2; вираз_3 ) оператор;

 

Вираз 1 встановлює початкові значення змінних циклу, його називають виразом ініціалізації. Вираз 2 задає умову виконання циклу, його називають виразом умови. Вираз 3 виконує зміну значень змінних циклу, його називають виразом ітерації. Оператор – довільний оператор мови, в тому числі блок, який задає дії, що мають виконуватись кількаразово, його називають тілом циклу.

Оператор працює наступним чином:

1) обчислюється вираз 1, який використовується для надання змінним циклу початкових значень;

2) обчислюється значення виразу 2, тобто перевіряється умова виконання циклу;

3) якщо значення виразу 2 дорівнює нулю (умова хибна), то виконання циклу завершується, управління передається оператору, наступному за for;

4) якщо значення виразу 2 ненульове (умова істинна), то виконується оператор тіла циклу;

5) обчислюється вираз 3, який застосовується для зміни значень параметрів циклу;

6) відбувається безумовний перехід до кроку 2.

Блок – схема роботи оператора for наведена на мал. 6.1. На цьому ж малюнку наведена блок – схема виконання такої програми:

 

#include <iostream>

using namespace std;

int main() {

for ( int i = 1; i <= 10; i++ )

cout << "i = " << i << endl;

}

 

Параметром циклу є змінна і, значення якої змінюються при виконанні оператора циклу і виводяться на екран. Початковим значенням змінної є одиниця (задається виразом 1), останнім – десять (задається виразом 2). На кожному кроці виконання оператора for (ще кажуть, при кожному проході тіла циклу, на кожній ітерації) значення змінної збільшується на одиницю (задається виразом 3).

Змінна і оголошена всередині оператора for. Такі змінні є локальними змінними циклу, їх можна використовувати тільки в межах даного оператора for.

Початкову частину оператора циклу for ( вираз_1; вираз_2; вираз_3 ) називають заголовком циклу. Після заголовка знак ; не ставлять, крім випадків порожнього оператора. Всередині заголовка знак ; застосовують для відокремлення між собою трьох складових виразів. Кожен з виразів, або всі вони, можуть бути відсутні, але знаки ; ставити обов’язково. Тобто, попередню програму можна переписати так:

 

#include <iostream>

using namespace std;

int main(){

int i;

i = 1;

for ( ; i <= 10; ) {

cout << "i = " << i << endl;

i++;

}

}

 

Мал. 6.1. Блок – схема роботи і приклад використання оператора for

 

Якщо вираз 2 відсутній, то умова вважається істиною. Для виходу з такого циклу можна застосовувати оператор break, який перериває виконання найближчого оточуючого оператора циклу. Тобто, попередню програму можна переписати так:

 

#include <iostream>

using namespace std;

int main(){

int i;

i = 1;

for ( ; ; ) {

cout << "i = " << i << endl;

if ( ++i > 10 )

break;

}

}

 

Приклад програми: знаходження суми ряду 1/1+1/2+1/3+… Суму будемо знаходити двома способами: з заданою точністю і підсумовуванням певної кількості елементів ряду.

 

#include <iostream>

using namespace std;

int main(){

double s, t, e;

int i;

s = 0;

e = 1e-5;

i = 1;

for ( t = 1 / i; t >= e; t = 1. / i ) {

s += t;

i++;

}

cout << s << endl;

s = 0;

t = 1;

for ( i = 1; i <= 100000; i++ ) {

t = 1. / i;

s += t;

}

cout << s << endl;

}

 

Недоліком цієї програми можна вважати ініціалізацію змінних в різних місцях програми, так само, як і збільшення параметрів циклу. В таких випадках зручно використовувати операцію «кома». Вона має найнижчий пріоритет серед операцій мови С++ і призначена для об’єднання декількох послідовно записаних виразів в один загальний вираз. Вирази, об’єднані з допомогою операції кома, виконуються зліва на право, значенням загального виразу стає значення самого правого під виразу. Приклад використання операції кома:

 

#include <iostream>

using namespace std;

int main(){

int a = 1, b = 2, c = 3, t;

t = a + b, --c, a + c; // t = a + c

cout << t << endl;

}

 

Використаємо операцію кома при організації циклу. Знайдемо суму ряду 1/1+1/2+1/4+1/8+… Як і у попередньому прикладі, суму будемо знаходити двома способами: з заданою точністю і підсумовуванням певної кількості елементів ряду.

 

#include <iostream>

using namespace std;

int main(){

double s, t, e;

int i;

for ( i = 0, s = 0, t = 1, e = 1e-5; t >= e; ++i,

t = 1 / pow( 2., i ) )

s += t;

cout << s << endl;

for ( i = 0, s = 0, t = 1 ; i <= 100000; ++i,

t = 1 / pow( 2., i ) )

s += t;

cout << s << endl;

}

 

Знайдемо значення факторіалу з допомогою оператора for.

 

#include <iostream>

using namespace std;

int main(){

int f, i, n;

cin >> n;

for ( f = 1, i = 2; i <= n; ++i )

f *= i;

cout << f << endl;

}

 

Знайдемо суму ряду 1/1!+1/2!+1/3!+1/4!+1/5!+…

 

#include <iostream>

using namespace std;

int main(){

int f, i, n, j;

double s;

cin >> n; // кількість елементів ряду

for ( s = 0, i = 1; i <= n; ++i ) {

for ( f = 1, j = 2; j <= i; ++j )

f *= j;

cout << s << " + 1 / " << f << endl;

s += 1. / f;

}

cout << s << endl;

}

 

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

 

#include <iostream>

using namespace std;

int main() {

int f, i, n, j;

double s;

cin >> n; // кількість елементів ряду

for ( s = 0, i = 1, f = 1; i <= n; ++i, f *= i ) {

cout << s << " + 1 / " << f << endl;

s += 1. / f;

}

cout << s << endl;

}

 

Схожий метод можна використовувати для програм, в яких необхідно отримати послідовність виду 1, -1, 1, -1, 1, … Зробимо це двома способами: з допомогою піднесення до степеня n числа -1 і з допомогою множення попереднього значення на -1.

 

#include <iostream>

using namespace std;

int main(){

int i, n = 10, t;

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

cout << i << " : " << pow( -1., i ) << endl;

for ( i = 0, t = 1; i < n; i++, t *= -1 )

cout << i << " : " << t << endl;

}

 

Знайти максимальне значення функції на інтервалі від 0 до Пі. Графік функції представлений на мал. 6.2. Вивести на екран таблицю значень цієї функції з заданим користувачем кроком зміни х.

 

Мал. 6.2. Графік функції

 

#include <iostream>

using namespace std;

int main(){

const double PI = 3.14159;

const double X1 = 0.;

const double X2 = PI;

double xmax, fmax, d, t, f;

cin >> d;

xmax = X1;

fmax = sin( pow( X1, 2 ) ) + pow( cos( X1 ), 2 );

for ( t = X1; t <= X2; t += d ) {

f = sin( pow( t, 2 ) ) + pow( cos( t ), 2 );

cout << t << "\t" << f << endl;

if ( fmax < f ) {

xmax = t;

fmax = f;

}

}

cout << xmax << " : " << fmax << endl;

}

 

Знайти перше нульове значення функції для значень х більше нуля.

 

#include <iostream>

using namespace std;

int main() {

double f; // Значення функції

double d = 1e-5; // Крок зміни х

double x = 0.; // Поточне значення х

double e = 1e-5; // Допустима помилка розрахунків

int n = 10000000; // Максимально допустима кількість ітерацій

int i;

f = sin( pow( 0, 2. ) ) + pow( cos( 0. ), 2. );

for ( x = d, i = 1; ! ( -e < f && f < e ); x += d, ++i ) {

f = sin( pow( x, 2. ) ) + pow( cos( x ), 2. );

if ( i >= n ) {

cout << "Not found" << endl;

break;

}

}

cout << "x = " << x << endl; // 1.78519

cout << "f = " << f << endl; // 1.02908e-006

}

 


<== попередня лекція | наступна лекція ==>
Оператор вибору switch | Цикл з передумовою. Оператор while


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн