Часто в процесі написання програми необхідно писати довгі конструкції if-else
. У ситуації, коли варіант шляху обчислень визначається одним із кількох значень цілого або символьного типу, обчислення можна описати за допомогою оператору множинного вибору switch
, або перемикача.
Наведемо фрагмент програми, яка виводить назву оцінки з використанням конструкції if-else
:
1 2 3 4 5 6 7 8 |
int grade; cout << "Введіть оцінку " << endl; cin >> grade; if (grade == 5) cout << "Відмінно"; else if (grade == 4) cout << "Добре"; else if (grade == 3) cout << "Задовільно"; else if (grade == 2) cout << "Незадовільно"; else cout << "Помилка! Використовується система оцінювання від 2 до 5"; |
Тепер наведемо фрагмент програми з використанням оператору множинного вибору switch
:
1 2 3 4 5 6 7 8 9 10 11 |
int grade; cout << "Введіть оцінку " << endl; cin >> grade; switch (grade) { case 5: cout << "Відмінно"; break; case 4: cout << "Добре"; break; case 3: cout << "Задовільно"; break; case 2: cout << "Незадовільно"; break; default: cout << "Помилка! Використовується система оцінювання від 2 до 5"; } |
Оператор switch
працює так само, як і конструкція if-else
, головна його перевага в тому, що стає легко зрозуміти, як працює програма, бо єдина змінна контролює поведінку програми. У випадку з if-else
прийдеться уважно роздивлятися кожну умову.
Оператор перемикач має таку форму запису:
1 2 3 4 5 6 7 8 |
switch (вираз) { case значення 1: інструкції 1; break; case значення 2: інструкції 2; break; .................................................. case значення n: інструкції n; break; default: інструкції n+1; } |
Вираз в дужках, який називається селектором варіантів, порівнюється зі значеннями (мітками варіантів), які описані після ключового слова case
. Після двокрапки знаходиться послідовність інструкцій, який буде виконуватися, якщо значення виразу буде збігатися з міткою.
Оператор break
необхідний для того, щоб перервати виконання switch
. Якщо його не використовувати, то значення виразу буде послідовно порівнюватися з усіма значеннями.
Якщо значення селектору не збіглося з жодною міткою, то виконаються інструкції, записані після слова default
, а якщо слова default
немає, то виконання перемикача закінчується.
Блок-схема оператору множинного вибору:
Значення для порівняння можуть бути тільки константними, тому наступний приклад використання оператора невірний:
1 2 3 4 5 6 7 |
int a = 10, b = 10, c = 20; switch (a) { case b: cout << “a=b”; break; case c: cout << “a=c”; break; default: cout << “a=”<< a; } |
Послідовність інструкцій після мітки варіанта може бути порожньою. За збігу значення селектора з цією міткою виконуються найближчі інструкції, записані в подальших варіантах – до найближчого break
або до кінця перемикача. Наприклад, наведемо фрагмент програми, яка за номером місяця виводить пору року:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int MonthNumber; cout << "Введіть номер місяця " << endl; cin >> MonthNumber; switch (MonthNumber) { case 12: case 1: case 2: cout << "Зима"; break; case 3: case 4: case 5: cout << "Весна"; break; case 6: case 7: case 8: cout << "Літо"; break; case 9: case 10: case 11: cout << "Осінь"; break; default: cout << "Помилка! В році 12 місяців"; } |
Зверніть увагу! В якості селектору варіантів може бути тільки вираз цілого типу, або такого, що однозначно перетворюється до цілого – символьного або перераховного. Розглянемо приклад з використанням селектору символьного типу.
Приклад. Ввести з клавіатури два числа і знак арифметичної операції (+, -, *, /). Вивести відповідний результат обчислення.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> #include <Windows.h> using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); double a, b; char sign; cout << "Введіть а " << endl; cin >> a; cout << "Введіть b " << endl; cin >> b; cout << " Введіть математичну операцію (+,-,*,/) " << endl; cin >> sign; switch (sign) { case '+': cout << "a + b = " << a + b; break; case '-': cout << "a - b = " << a - b; break; case '*': cout << "a * b = " << a * b; break; case '/': if (b != 0) cout << "a / b = " << a / b; else cout << "Помилка! Ділення на 0"; break; default: cout << "Помилка! Така операція не підтримується"; } return 0; } |