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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Синтаксис оператора 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

}

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 66; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.151.106 (0.018 с.)