Розгалуження у програмі
Вкладені умовні оператори
Коли потрібно послідовно перевіряти ще раз кілька взаємовиключних умов, для частин else не відкривають окремого блоку (записують наступний if як просту, а не як складову інструкцію), щоб отримати більш компактний запис. Такі конструкції у коді називають else…if.
Розглянемо спочатку варіант запису із вкладеними блоками. Наприклад розглянемо таке завдання.
Чоловік заповнює у військкоматі анкету та програма має залежно від зазначеного ним віку виводити різні підказки, а саме:
- Якщо зазначений вік від 18 до 27 років, то повідомляти, що заповнювач підлягає призову на строкову службу або може служити за контрактом.
- Якщо вказано вік від 28 до 59 років, то повідомляти, що той, хто заповнює, може служити за контрактом.
- Якщо вказано вік менше 18 або більше 59 років, то повідомляти про те, що заповнювач перебуває у непризовному віці.
- Якщо вказано непозитивний вік або вік понад 100 років, повідомити про помилку.
Припустимо, що вік збережений у змінній n, тоді для виведення підказки буде потрібен наступний код:
Зверніть увагу на те, що як тільки одна з умов виявиться істинною - всі наступні перевірки не виконуватимуться (тобто в кращому випадку виконатиметься тільки перша перевірка). Відповідно, повідомлення про помилку буде виведено тоді і тільки тоді, коли всі умови, що перевіряються, дадуть хибний результат.
Більше того, для повідомлення про непризовний вік умова підібрана з урахуванням того, що заповнюючу анкету вже не підійшов до жодного з варіантів призовного віку. Звичайно, можна було б використати таку умову:
Але воно було б надлишковим, адже раніше (за рахунок вище перевірок, що стоять) ми вже переконалися, що змінна n не потрапила в проміжок [18; 60). Якби змінна потрапляла в проміжок, то вивелося б повідомлення "Ви можете пройти термінову або контрактну службу" або "Ви можете служити лише за контрактом".
Оператор множинного вибору
Інструкція множинного вибору switch дозволяє виконувати різні частини програми в залежності від того, яке значення матиме деяка цілочисленна змінною (її називають «змінною-перемикачем», а «switch» з англійської перекладається саме як «перемикач»).
Схема інструкції така:
Розглянемо всі елементи оператора:
- перемикач - це цілочислова змінна або вираз, що дає цілісний результат;
- значение1 , значение2 , … — це цілочисленні літерали, із якими порівнюватиметься значення перемикача. Якщо перемикач дорівнює значеннюN , то програма буде виконуватися з рядка, наступного за case значенняN: і до найближчого break , або до кінця блоку switch (якщо break не зустрінеться);
- default: — це мітка інструкції, після якої будуть виконуватися в тому випадку, якщо вище жодне з значень N не співпало з перемикачем. Мітка default - необов'язкова: можна її не включати до блоку switch міток або не виконувати після неї ніяких команд;
- інструкція N - проста або складова інструкція. До того ж у разі складової кілька команд не обов'язково поєднувати в блок, можна їх просто написати один за одним розділяючи за допомогою «;» (І починаючи нові рядки для зручності).
Розглянемо таку ситуацію: в якийсь момент потрібно просити у користувача, чи треба продовжувати програму, чи можна її завершити. Припустимо, щовідповідь користувача приймається у вигляді символу, що вводиться з клавіатури і зберігається в змінній ans: Д - так, продовжувати, Н - ні, зупинити.
Тоді отримуємо приблизно такий програмний код:
Якщо ми захочемо якось сповістити користувача про те, що він ввів невідповідний символ, то знадобиться мітка default:
Після інструкцій причетних до цієї мітки break зазвичай не ставлять, тому що default розташовується в кінці всього блоку switch і після неї все одно завершиться оператор множинного вибору. Але в решті гілок — break необхідний. Розглянемо приклад, в якому помилково пропущено перший break у ситуації, коли в змінній-перемикачі буде символ «Д»:
На екран будуть виведені відразу дві фрази: «Продовжуємо програму» та «Зупиняємо програму». Це сталося тому, що після першої гілки з літералом "Д" програма виконувалася до першого зустрінутого break, тобто. виконалася і частина, що відноситься до гілки з літералом "Н".
Таку поведінку програми можна використати на благо. Наприклад, можна розмістити кілька поспіль міток з різними літералами, для яких буде виконуватися один і той же код:
Тепер користувач для продовження програми зможе ввести не лише символ "Д", але й символи "д", "Y", "y" (від англійської "yes").
Будь-який оператор switch можна замінити конструкцією if…else:
Зворотне — неправильно, адже switch дозволяє лише порівнювати перемикач з конкретними значеннями, але не дозволяє для якоїсь гілки задати умову у вигляді цілого діапазону значень з використанням операторів порівняння (наприклад, з використанням суворих нерівностей та логічних операторів «і» або «або» »). Також нагадаємо, що в якості перемикача можуть виступати тільки цілі перемінні або вирази.
if…else більш універсальний оператор, ніж switch.
Створити програму, яка перевірятиме чи потрапило випадково обране з відрізка [5;155] ціле число інтервал (25;100) і повідомляти результат на екран.
Приклади роботи програми:
Створити програму, що виводить на екран випадково згенероване тризначне натуральне число та його найбільшу цифру.
Приклади роботи програми:
У три змінні a, b і c явно записані програмістом три цілих попарно нерівних між собою числа. Створити програму, яка переставить числа змінних таким чином, щоб при виведенні на екран послідовність a, b і c виявилася строго зростаючою.
На деякому підприємстві інженер Петров створив пристрій, на табло якого з'являється кількість секунд, що залишилися до кінця робочого дня. Коли робочий день починається рівно о 9 годині ранку — табло відображає «28800» (тобто залишається 8 годин), коли часу 14:30 — на табло «9000» (тобто залишається дві з половиною години), а коли настає 17 годин – на табло відображається «0» (тобто робочий день закінчився).
Програміст Іванов помітив, як страждають офісні співробітниці — їм незручно оцінювати решту робочого дня за секунди. Іванов зголосився допомогти співробітницям і написати програму, яка замість секунд виводитиме на табло зрозумілі фрази з інформацією про те, скільки повних годин залишилося до кінця робочого дня. Наприклад: «залишилося 7 годин», «залишилося 4 години», «залишилося 1 година», «залишилося менше години».
Отже, в змінну n повинно записуватися випадкове (на час тестування програми) ціле число [0;28800], далі воно повинно виводитися на екран (для Петрова) і на наступному рядку (для співробітниць) повинна виводитися фраза про кількість повних годин у n секундах.
Приклади роботи програми: