Здавалка
Главная | Обратная связь

ОПЕРАТОР ПЕРЕХОДУ GOTO І МІТКИ

ОПЕРАТОРИ ЦИКЛУ

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

Перевірка умови може здійснюватися перед виконанням (цикли for, while) або після закінчення (do-while) тіла циклу.

Цикли можуть бути вкладеними друг у друга довільним образом.

ЦИКЛИ FOR

Оператор циклу for використовують, як правило, у тому випадку, коли відомий діапазон зміни змінної, наприклад, лічильника ітерацій. Синтаксис циклу for:

for ([вираз1] ; [вираз2] ; [вираз3]) оператор;

Цей оператор працює в такий спосіб.

Ø спочатку виконується вираз1, якщо воно присутнє в конструкції;

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

Ø після виконання тіла циклу наприкінці кожної ітерації обчислюється вираз3, якщо він є в конструкції, і здійснюється перехід до пункту обчислення величини вираз2.

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

Вираз2 використовується як перевірочна умова, на практиці часто містить вираз з операторами порівняння. За замовчуванням величина вираз2 приймає дійсне значення.

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

Усі три вираз не обов'язково повинні бути присутнім у конструкції, однак синтаксис не допускає пропуску символу крапка з коми (;). Тому найпростіший приклад нескінченного циклу for (виконується постійно до примусового завершення програми) виглядає в такий спосіб:

for ( ; ; ) cout << "Нескінченний цикл...’\n'";

Якщо в циклі повинні синхронно змінюватися декілька змінних, які залежать від змінної циклу, обчислення їх значень можна помістити в оператор for, скориставшись оператором "кома".

Типова помилка програмування циклів for – зміна значення лічильника як у конструкції (виразЗ), так і в тілі циклу. Це може приводити до таких негативних наслідків, як "випадання" ітерацій.

Приклад 1. Знайдемо суму набору з десяти цілих чисел, починаючи з 10.

int S = 0 ;

for ( int i=10 ; i<20 ; i++) S += i ;

cout << "Sum = " << S ;

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

Запишемо цей же оператор з використанням усіх можливостей З++:

for ( int S = 0, i = 10 ; i<20 ; S += i, i++) ;

cout << "Sum = " << S;

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

int a = 0;

double fact = 1 ;

cout << "Input number : ";

cin >> a;

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

{

if (a == 0) fact = 1;

else fact *= i;

}

cout << fact << '\n';

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

ЦИКЛИ WHILE

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

while (вираз) оператор ;

Якщо вираз являє собою константу з дійсним значенням, тіло циклу буде виконуватися завжди, отже, ми маємо справу з нескінченним оператором. Цикл також виявиться нескінченним, коли умова істинна й ніде далі в тілі циклу не змінюється. Якщо ж перевірочна умова повертає false, здійсниться вихід із циклу й тіло оператора while буде пропущено.

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

Як і для оператора for, якщо в циклі повинні синхронно змінюватися декілька змінних, які залежать від змінної циклу, обчислення їх значень можна помістити в перевірочний вираз оператора while, скориставшись оператором "кома".

#include "stdafx.h"

#include <iostream>

#include <conio.h> // при використанні функції getch()

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

float s=0,k=11.,step=0.1;

while(s<k)

s+=step;

cout<<"s="<<s<<'\n';

system("pause");// для затримки виводу на екран

// або getch();

return 0;

}

 

ЦИКЛИ DO-WHILE

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

Синтаксис оператора має вигляд:

do оператор ; while (вираз)

Одне із часто використовуваних застосувань даного оператора – запит до користувача на продовження виконання програми:

char S[100];

char answer;

CharToOem ("Продовжувати виконання? (Y/N) ", S) ;

do

{

//Тіло програми

cout<<S ;

cin >> answer ;

}

while ( answer=='Y' || answer=='y' ) ; //якщо користувач нажав клавішу Y - продовження циклу

Таким чином, тіло програми буде повторюватися доти, поки користувач на запитання "Продовжувати виконання?" не відповість уведенням будь-якого символу, крім 'Y' або ‘y'. При цьому, у якості змінної, використовуваної для зберігання цього значення, виступає answer.

ОПЕРАТОР BREAK

Для дострокового виходу з оператора циклу, використовується оператор break. Даний оператор може зустрічатися в тілі циклу скільки завгодно раз і, як і у випадку switch-case, передає керування поза тілом конструкцій. На практиці оператор break часто використовують для виходу з нескінченного циклу.

for ( ; ; )

{

// Тіло циклу

if ( Умова1 ) break;

if (.Умова2.) break;

}

У даному прикладі, якщо хоч один із умовних операторів поверне true відповідний оператор break виведе керування з тіла конструкції нескінченного циклу for.

ОПЕРАТОР CONTINUE

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

Як приклад використання оператора continue пропонується програма знаходження простих чисел (, що діляться на 1 і на самі себе).

bool simple ; // прапор простого числа

for ( int i = 2 ; i<50 ; i++) // для всіх чисел від 2 до 49

{

simple = true ; // число i - простої

for ( int d=2 ; d<i ; d++) // для всіх дільників від 2 до i-1

{

if ( i%d ) // якщо число i не ділиться нацело на d

continue ; // завершення ітерації

else // якщо число i ділиться нацело на d

{

simple = false ; // число i - непросте

break ; // вихід із внутрішнього циклу з параметром d

}

}

if ( simple ) // якщо число просте

cout << i << " " ; // вивід на екран числа i і пробілу

}

Програма організовано у вигляді двох вкладених циклів таким чином, що здійснюється перебір і перевірка залишку від розподілу пари чисел, перше з яких змінюється від 2 до 50, а друге - від 2 до значення першого числа. На початку кожної ітерації в зовнішньому циклі прапор простого числа simple установлюється в стан true. Якщо залишок від розподілу ненульовий, здійснюється продовження внутрішнього циклу по операторі continue. У випадку, якщо залишок від розподілу склав 0, виконується вихід із внутрішнього циклу з установкою прапора простого числа simple у стан false. По закінченню внутрішнього циклу проводиться аналіз логічної змінної simple і вивід простого числа.

ОПЕРАТОР ПЕРЕХОДУ GOTO І МІТКИ

Мітка являє собою ідентифікатор з розташованим за ним символом двокрапки (:). Мітками позначають який-небудь оператор, на який надалі повинен бути здійснен безумовний перехід. Безумовна передача керування на мітку проводиться за допомогою оператора goto.

Оператор goto може здійснювати перехід (адресуватися) до міток, обов'язково розташованих в одному з ним тілі функції. Синтаксис оператора goto:

goto мітка;

мітка : оператор;

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

Розглянемо приклад застосування оператора goto для організації циклу, у якім підсумовуються всі числа від 10 до 20.

int i=10 ;

int S=0 ;

label:

S+=i;

i++ ;

if ( i<21) goto label ;

cout<<"S="<<S<<'\n' ;

Як тільки виконання програми досягне оператора goto, керування буде передано операторові, що стоїть за міткою label.

Загалом кажучи, використання структурного й об'єктно-орієнтованого підходів до програмування дозволяє повністю відмовитися від застосування операторів безумовного переходу. Однак на практиці часто бувають випадки, коли goto значно спрощує код програми. Особливо це твердження стосується вкладених конструкцій switch-case і if-else.

 





©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.