Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

4.1.3. Конструкція if-else-if

Дуже поширеною у програмуванні конструкцією, в основі якої знаходиться вкладена if-настанова, є "сходинки" if-else-if. Її можна представити в такому вигляді:

if(умова)

настанова;

else

if(умова)

настанова;

else

if(умова)

настанова;

else

настанова;

У цьому записі під елементом умова розуміють умовний вираз, який обчислюється зверху вниз. Як тільки у якій-небудь гілці виявиться істинний результат, то буде виконану настанову, пов'язану з цією гілкою, а всі решта "сходинки" опускаються. Якщо виявиться, що жодна з умов не є істинною, то буде виконано останню else-настанову (можна вважати, що вона виконує роль умови, яка діє за замовчуванням). Якщо останню else-настанову не задано, а всі інші виявилися помилковими, то взагалі ніяка дія не буде виконана.

"Сходинки" if-else-if – це послідовність вкладених if-else-настанов.

Робота if-else-if –"сходинок" продемонструємо у наведеній нижче |такій| програмі.

Код програми 4.5. Демонстрація механізму використання "сходинок" if-else-if

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int x;

for(x=0; x<6; x++) {

if(x==1) cout << "x дорівнює одиниці.\n";

else if(x==2) cout << "x дорівнює двом.\n";

else if(x==3) cout << "x дорівнює трьом.\n";

else if(x==4) cout << "x дорівнює чотирьом.\n";

else cout << "x не потрапляє в діапазон від 1 до 4.\n";

}

getch(); return 0;

}

Результати виконання цієї програми є такими:

х не потрапляє в діапазон від 1 до 4.

х дорівнює одиниці.

х дорівнює двом.

х дорівнює трьом.

х дорівнює чотирьом.

х не потрапляє в діапазон від 1 до 4.

Як бачимо, остання else-настанова виконується тільки у тому випадку, коли всі попередні if-умови дали помилковий результат.

4.2. Використання настанови багатовибірного розгалуження switch

Настанова switch – це настанова багатовибірного розгалуження, яка дає змогу вибрати одну з множини альтернатив.

Вона дає змогу робити вибір однієї з множини альтернатив. Хоча різноспрямоване тестування можна реалізувати за допомогою послідовності вкладених if-настанов, однак у багатьох ситуаціях настанова switch виявляється ефективнішим рішенням.

4.2.1. Особливості роботи настанови

Настанова багатовибірного розгалуження працює таким чином. Значення виразу послідовно порівнюється з константами із заданого переліку. Внаслідок виявлення збігу для однієї з умов порівняння виконується послідовність настанов, пов'язана з цією умовою. Загальний формат запису настанови switch є таким:

switch (вираз) {

case константа1:

послідовність настанов

break;

case константа2:

послідовність настанов

break;

case константа3:

послідовність настанов

break;

...

default:

послідовність настанов

}

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

Настанова break завершує виконання коду програми, що визначається настановою switch.

Послідовності настанов default-гілки виконуються у тому випадку, якщо жодна із заданих case-констант не співпаде з результатом обчислення switch-виразу. Гілка default є необов'язковою. Якщо вона відсутня, то при неспівпаданні результату виразу ні з однією з case-констант ніякої дії виконано не буде. Якщо такий збіг все-таки виявиться, то виконуватимуться настанови, відповідні цій case-гілці, доти, доки не трапиться настанова break або не буде досягнуто кінець switch-настанови (або у default-, або в останній case-гілці).

Настанови default-гілки виконуються у тому випадку, якщо жодна з case-констант не співпаде з результатом обчислення switch-виразу.

Отже, для застосування switch-настанови необхідно знати таке:

  • настанова switch відрізняється від настанови if тим, що switch-вираз можна тестувати тільки з використанням умови рівності (тобто на збіг switch-виразу із заданими case-константами), тоді як умовний if-вираз може бути будь-якого типу;

  • ніякі дві case-константи в одній switch-настанові не можуть мати однакових значень;

  • настанова switch зазвичай ефективніша, ніж вкладені if-настанови;

  • послідовність настанов, пов'язана з кожною case-гілкою, не є блоком. Проте повна switch-настанова визначає блок. Значущість цього твердження стане очевидною після того, як ми більше дізнаємося про мову програмування C++.

Згідно з стандартом мови програмування C++, switch-конструкція може мати не більше ніж 16 384 case-настанов. Але на практиці (виходячи з міркувань ефективності) зазвичай обмежуються набагато меншою їх кількістю.

Використання switch-настанови продемонстровано у наведеному нижче коді програми. Вона створює просту "довідкову" систему, яка описує призначення for-, if- і switch-настанов. Після відображення переліку пропонованих тем, згідно з якими можливе надання довідки, програма переходить в режим очікування доти, доки користувач не зробить свій вибір. Введене користувачем значення використовується в настанові switch для відображення інформації по вказаній темі1.

Код програми 4.6. Демонстрація механізму використання switch-настанови на прикладі|зразку| "довідкової" системи

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int vybir;

cout << "Довідка на теми: \n\n";

cout << "1. for\n";

cout << "2. if\n";

cout << "3. switch\n\n";

cout << "Введіть номер теми (1-3): ";

cin >> vybir;

cout << "\n";

switch(vybir) {

case 1: cout << "for – це найуніверсальніший цикл в С++.\n";

break;

case 2: cout << "if – це настанова умовного розгалуження.\n";

break;

case 3: cout << "switch – це настанова багатовибірного

розгалуження.\n";

break;

default: cout << "програміст повинен ввести число від 1 до 3.\n";

}

getch(); return 0;

}

Ось один з варіантів виконання цієї програми.

Довідка на теми:

1. for

2. if

3. switch

Введіть номер теми (1-3): 2

if – це настанова умовного розгалуження.

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

Розглянемо уважно наведену нижче програму. Спробуйте передбачити, що буде відображено на екрані під час її виконання.

Код програми 4.7. Демонстрація механізму використання switch-конструкції

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int i;

for(i=0; i<5; i++) {

switch(i) {

case 0: cout << "менше 1\n";

case 1: cout << "менше за 2\n";

case 2: cout << "менше за 3\n";

case 3: cout << "менше за 4\n";

case 4: cout << "менше за 5\n";

}

cout << "\n";

}

getch(); return 0;

}

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

менше 1

менше 2

менше 3

менше 4

менше 5

менше 2

менше 3

менше 4

менше 5

менше 3

менше 4

менше 5

менше 4

менше 5

менше 5

З цих результатів видно, якщо настанова break в одній case-гілці відсутня, то виконуються настанови, що належать наступній case-гілці. Як це показано в цому прикладі, в switch-конструкцію можна помістити "порожні" case-гілки:

switch(izm) {

case 1:

case 2:

case 3: do_something();

break;

case 4: do_something_else();

break;

}

Якщо змінна izm цей фрагмент коду програми набуває значення 1, 2 або 3, то викликається функція do_something(). Якщо ж значення змінної izm дорівнює 4, то робиться звернення до функції do_something_else(). Використання "пачки" декількох порожніх case-гілок характерне для випадків, коли вони використовують один і той самий програмний код.