Оператор вибору switch

Оператор вибору switch. Вкладені оператори switch


Зміст



1. Яке призначення у програмах має оператор вибору switch?

Оператор вибору switch є подібний до оператора умовного переходу ifelse. Він дозволяє організувати розгалуження процесу виконання в програмі. У деяких випадках використання оператора вибору switch дає більш компактний програмний код у порівняння з оператором умовного переходу if-else.

 

2. Яка загальна форма оператора вибору switch?

У C-орієнтованих мовах програмування, до яких належить і Java, оператор вибору switch має однакову загальну форму представлення:

switch (вираз)
{
    case значення1:
        // оператори
        ...
    break;
    case значення2:
        // оператори
        ...
    break;

    ...

    case значенняN:
        // оператори
        ...
    break;
    default:
        // оператори, що виконуються за замовчуванням
        ...
}

де

  • вираз – керуючий вираз, який може мати один з цілочисельних типів: byte, int, short, char або зчислений тип. У нових версіях JDK вираз може мати тип String.
  • значення1, значення2, … , значенняN – константні вирази (літеральні значення). Кожне значення має бути сумісним за типом з вказаним виразом.

Блок default може бути відсутній.

 

3. Принцип роботи оператора switch

Оператор вибору switch працює наступним чином. Значення виразу порівнюється з кожним зі значень (значення1, значення2, …, значенняN), що слідують після ключового слова case. Якщо знайдено співпадіння, тоді виконуються оператори, що слідують після цієї частини case. Якщо в жодному з варіантів після case співпадіння не знайдено, тоді виконуються оператори, що йдуть в блоці default. Якщо блок default відсутній (може бути відсутній), тоді нічого не відбувається і виконується наступний оператор, що слідує за оператором switch.

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

 

4. Приклад використання оператору вибору switch, в якому є блок default

За заданим значенням n = 1..7 вивести назву відповідного дня тижня. Врахувати можливі помилкові значення n.

// оператор вибору switch
int n;
String s;

// ввід значення n
n = 6;

switch (n)
{
    case 1:
        s = "Понеділок";
    break;
    case 2:
        s = "Вівторок";
    break;
    case 3:
        s = "Середа";
    break;
    case 4:
        s = "Четвер";
    break;
    case 5:
        s = "П'ятниця";
    break;
    case 6:
        s = "Субота";
    break;
    case 7:
        s = "Неділя";
    break;
    default:
        s = "Неправильно введений день";
}

System.out.println(s);

 

5. Приклад використання оператора switch, в якому пропущені оператори break

Як відомо, оператор break, може бути відсутній.

У даному прикладі за введеним значенням номера дня тижня n = 1..7 визначається вихідний цей день чи робочий.

// оператор вибору switch
int n;
String s;

// ввід значення n
n = 3;

switch (n)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        s = "Робочий день";
    break;
    case 6:
    case 7:
        s = "Вихідний день";
    break;
    default:
        s = "Неправильно введений день";
}

System.out.println(s);

 

6. Приклад використання оператора switch, в якому відсутній блок default

Дано ціле число n = 1..3. За даним значенням змінної n визначити:

  1. довжину кола;
  2. площу круга;
  3. об’єм кулі.
// оператор вибору switch
int n;
double pi = 3.1415;
double r;

// ввід значень n, r
// ...

switch (n)
{
    case 1:
        double d = 2*pi*r;
        System.out.println("Довжина кола = " + d);
    break;
    case 2:
        double s = pi*r*r;
        System.out.println("Площа круга = " + s);
    break;
    case 3:
        double v = 4.0/3.0 * pi*r*r*r;
        System.out.println("Об'єм кулі = " + v);
    break;
}

 

7. Вкладені інструкції switch. Приклад

Інструкція switch може містити іншу, вкладену інструкцію switch. У кожному операторі switch визначається свій блок коду. Блоки коду є незалежними один від одного.

Приклад. У даному прикладі на основі номера року (year) та місяця (month) обчислюється кількість днів у місяці (змінна days). Задачу розв’язано з використанням вкладених операторів if та switch.

// обчислення кількості днів у місяці року
int f;  
int year;
int month;
int days;

// задані місяць та рік
year = 2404;
month = 2;

switch(month) {
    case 4: case 6: case 9: case 11:
        days = 30;
        break;
    case 2: // місяць лютий
        f = 0; 

        // вкладений оператор if
        if (year%400==0) f=1;
        else
        if (year%100==0) f=0;
        else
        if (year%4==0) f=1;

        // вкладений оператор switch
        switch (f) {
            case 0:
                days=28;
                break;
            default:
                days=29;
        }
        break;
    default:
        days = 31; 
} 
System.out.println("Days = " + days);

 

8. Переваги оператора switch у порівнянні з оператором if

У порівнянні з оператором if переваги оператора switch наступні:

  • при виборі з великої групи значень оператор switch працює швидше ніж оператор if-else. Це зв’язано з тим, що в операторі switch константи усіх гілок case та вираз мають однаковий тип. Тому достатньо здійснити перевірку на рівніть. В операторі if-else компілятор наперед не знає типи результатів виразів у різних гілках порівняння, що потребує додаткових перетворень які займають час.
  • у випадках коли виконується код для декількох операторів гілок case без вказання розділяючих їх операторів break.

 

9. Недоліки оператора switch у порівнянні з оператором if

Порівняно з оператором if, оператор switch має такі недоліки:

  • в операторі switch, у кожній гілці виконується перевірка тільки на рівність (пошук на співпадіння в гілці case). В операторі if у кожній гілці можна обчислювати будь-який логічний вираз будь-якого типу;
  • в операторі switch вираз, що порівнюється може бути тільки типу int, зчисленням enum або типу String (починаючи з версії JDK 7). Вираз не може бути типом з плаваючою комою. В операторі if порівнюваний вираз може бути будь-якого типу;
  • у двох різних гілках case константи не можуть мати однакові значення. Однакові значення у гілках case допускаються, якщо ці гілки розміщуються на різних рівнях вкладення у випадку вкладених операторів switch.

 


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