Оператори break, continue. Приклади застосування

Оператори break, continue. Приклади застосування


Зміст


1. Оператор break. Особливості застосування. Загальна форма

Оператор break здійснює вихід з блоку фігурних дужок { } оператора циклу або оператора switch і передає управління наступному оператору в програмі. Якщо використовуються вкладені оператори, то оператор break здійснює вихід з самого внутрішнього оператора.

Загальна форма оператора break наступна

break;

2. Оператор break з міткою. Особливості застосування. Ключове слово goto

Оператор break з міткою може застосовуватись як аналог оператора goto, який є присутній в інших мовах програмування. В мові Java оператор goto не використовується. Однак, ключове слово goto є зарезервоване.

Загальна форма оператора break з міткою має наступний вигляд:

break labelName;

де labelName – це імʼя мітки, що відповідає кодовому блоку. Кодовий блок – це набір операторів, взятих у фігурні дужки { }.

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

Загальна форма оголошення мітки має наступний вигляд

labelName: {
    // послідовність операторів
    // ...
}

де labelName – імʼя мітки. Імʼя мітки задається так само як і для будь-якого ідентифікатора.

3. В яких операторах можна використовувати оператор break?

Оператор break можна використовувати в усіх операторах циклу та операторі switch. Іншими словами, оператор break не може бути використаний за межами циклу або оператора switch.



4. Оператор continue. Особливості застосування. Загальна форма

Оператор continue застосовується в циклах. Оператор continue забезпечує перехід до наступної ітерації в циклі.

Загальна форма оператора continue має вигляд:

continue;

Частіш за все, оператор continue викликається при досягненні деякої умови в тілі циклу.

5. Оператор continue з міткою

Оператор continue може бути реалізований з міткою. У цьому випадку загальна форма оператора continue наступна

continue labelName;

де labelName – імʼя мітки, що відповідає циклу, в якому реалізовано виклики оператором continue.

6. В яких операторах можна застосовувати оператор continue?

Оператор continue можна застосовувати тільки в циклах. Іншими словами, оператор continue не можна застосовувати за межами циклу.

7. Приклади розвʼязку задач, в яких використовується оператор break

Приклад 1. Визначення наявності відʼємного числа в одновимірному масиві.

// Визначення наявності від'ємного числа в одновимірному масиві
int A[] = { 3, 5, -7, 20, 39, 12 };
boolean f_is = false;

for (int i=0; i<A.length; i++)
    if (A[i]<0) // чи є від'ємне число в масиві?
    {
        f_is = true; // якщо є, то рішення знайдено
        break; // вихід з циклу, подальше виконання циклу не має сенсу
    }

if (f_is) System.out.println("Від\'ємне число є в масиві.");
else System.out.println("Від\'ємного числа немає в масиві.");

Приклад 2. Визначення наявності заданого числа n у двовимірному масиві розміром 2×3. У даному прикладі оператор break викликається два рази. Перший раз, коли потрібно вийти з внутрішнього циклу, в якому змінна j є ітератором. Другий раз, коли потрібно вийти з зовнішнього циклу, в якому змінна i є ітератором.

// Визначення наявності від'ємного числа в одновимірному масиві
int A[][] = {
    { 3, 5, -3 },
    { 2, 8, 0 }
};
boolean f_is = false;
int n = 5;

for (int i=0; i<A.length; i++) {
    for (int j=0; j<A[i].length; j++)
        if (A[i][j]==n) {
            f_is = true; // якщо число знайдене, то вихід з внутрішнього циклу
            break; // подальше виконання не має сенсу
        }
    if (f_is) break; // вихід з зовнішнього циклу
}

if (f_is) System.out.println("Число є в масиві.");
else System.out.println("Числа немає в масиві.");

Якщо двовимірний масив є великим за розміром, то використання оператора break підвищує швидкість виконання циклу.

8. Приклад використання оператора break з міткою

Оператор break з міткою працює так само, як і оператор goto в інших мовах програмування. У мові Java оператор goto не використовується. Однак, ключове слово goto зарезервоване. Замість goto використовується оператор break з міткою з деякими обмеженнями.

Задано двовимірний масив цілих чисел. Визначити, чи є в масиві від’ємні елементи. Нижче наводиться фрагмент коду, що розв’язує дану задачу.

// Оператор break з міткою
int[][] A = {
                { 2, 5, 8, },
                { 3, -7, 4 },
                { -2, 1, 3 },
                { -4, 2, 3 }
            };
boolean f_is = false;

// мітка з іменем M1
M1:
for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++) {
        k++;
        if (A[i][j]<0) {
            f_is = true;
            break M1; // повне завершення циклу, перехід до наступного оператора
            // continue M1; - перехід до наступної ітерації зовнішнього циклу (лічильник i)
        }
    }

if (f_is)
    System.out.println("В масиві A є додатні елементи.");
else
    System.out.println("В масиві A додатніх елементів немає");

Перебір усіх елементів двовимірного масиву здійснюється у двох вкладених циклах. Перед викликом циклів розміщується мітка з іменем M1. Якщо у циклі нижнього рівня (лічильник j) зустрічається команда

break M1;

то відбувається вихід з обох циклів і перехід до наступного оператора програми:

...
if (f_is)
    System.out.println("В масиві A є додатні елементи.");
else
    System.out.println("В масиві A додатніх елементів немає");

Якщо мітку M1 розмістити перед оператором if, наприклад:

...
M1:
if (f_is)
    System.out.println("В масиві A є додатні елементи.");
else
    System.out.println("В масиві A додатніх елементів немає");

то компілятор Java згенерує помилку

Unresolved compilation problem:
The label M1 is missing

тому що, в операторі break з міткою, мітка може розміщуватись тільки перед циклом, в якому вона використовується.

9. Приклади розвʼязку задач, в яких використовується оператор continue

Приклад 1. Дано n. Написати фрагмент програмного коду, який обчислює наступну суму S = 2 + 4 + … + 2*n.

Існує багато способів рішення даної задачі. У даному випадку задача розвʼязується з використанням оператора continue.

int s=0;
int n;

n = 10;
for (int i=1; i<=2*n; i++) {                  
    if (i%2==1) continue; // непарні значення i пропустити
    s = s+i; // додавати тільки парні значення i
}

У рядку

if (i%2==1) continue;

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

Приклад 2. У заданому масиві чисел усі додатні елементи помножити на 2. Для рішення використовується оператор continue.

// використання оператора continue
double[] A = { 3.8, -2.5, 4.6, -1.8, -2.2, 5.6, 1.5 };

// у масиві A усі додатні елементи помножити на 2
for (int i=0; i<A.length; i++) {
    // якщо елемент масиву від'ємний, то перехід до наступної ітерації
    if (A[i]<0)
        continue;

    // інакше, помножити цей елемент на 2
    A[i] = A[i] * 2;
}

10. Приклади розвʼязку задач, в яких використовується оператор continue з міткою

Приклад 1. Демонструється використання оператора continue з міткою, яка розміщена у вкладеному циклі (внутрішньому циклі). Мітка має імʼя loop. У прикладі знаходиться сума елементів, що лежать на головній діагоналі матриці A розміру 5*5.

// додати елементи матриці, що розміщені на головній діагоналі
// в цих елементах позиція в рядку i рівна позиції в стовпці j
int n = 5; // розмірність матриці
double A[][] = {
        { 3.2, 4.1, 2.8, 3.4, 3.4 },
        { 1.3, 4.3, 5.5, 0.4, 1.4 },
        { 3.4, 4.7, 2.1, 3.4, 3.4 },
        { 6.2, 4.1, 2.6, 2.4, 2.4 },
        { 0.7, 7.1, 3.8, 1.4, 4.4 }
};
double summ = 0;

// у внутрішньому циклі оголошується мітка з іменем loop
for (int i=0; i<n; i++)
    loop:
    for (int j=0; j<n; j++) {
        // якщо не головна діагональ, то перехід на наступну ітерацію
        if (i!=j) continue loop;
        summ += A[i][j];
    }

Приклад 2. Демонструється використання оператора continue з міткою, яка розміщена на зовнішньому (верхньому) циклі. У програмі визначається кількість рядків масиву A, в яких є відʼємні елементи.

// додати елементи матриці, що розміщені на головній діагоналі
// в цих елементах позиція в рядку i рівна позиції в стовпці j
int n = 0; // к-сть рядків, в яких є від'ємні елементи
double A[][] = {
        { 3.2, -4.1, 2.8, 3.4, 3.4, 3.6, 4.8 },
        { 1.3, 4.3, 5.5, 0.4, 1.4, 2.0, 1.0 },
        { 3.4, -4.7, 2.1, -3.4, 3.4, 3.0, 5.5 },
        { 6.2, 4.1, 2.6, 2.4, 2.4, 1.8, 1.9 },
        { -0.7, 7.1, 3.8, 1.4, 4.4, 2.3, 4.0 }
};

// оголошується мітка з іменем nextRow
nextRow:
for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++) {
        // якщо знайдено від'ємний елемент, то перехід на наступний рядок масиву
        if (A[i][j]<0) {
            n++; // збільшити лічильник
            continue nextRow;
        }
    }
System.out.println("n = " + n); // n = 3

Перебір усіх елементів масиву здійснюється з допомогою двох вкладених циклів. За номер рядка відповідає змінна i, за номер стовпця відповідає змінна j.

Якщо в i-му рядку масиву знайдено хоча б один відʼємний елемент, то подальший перебір елементів цього рядка не має сенсу. Потрібно переходити на наступний рядок. Саме тому, тут викликається оператор continue з міткою, яка розміщується на верхньому (зовнішньому циклі). Мітка має назву nextRow.

11. Які переваги дає використання операторів break та continue у програмах

Використання break та continue дає наступні переваги:

  • у випадку виконання циклічного процесу не має потреби виконувати зайві ітерації якщо знайдене шукане значення або досягнуто потрібного результату. Це дає підвищення швидкості виконання програми;
  • при передчасному припиненні циклічного процесу не порушується структура коду.

12. Яка відмінність між оператором break з міткою та оператором continue з міткою

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


Зв’язані теми