asyan.org
добавить свой файл
1
ОСНОВНІ УПРАВЛЯЮЧІ СТРУКТУРИ

2.Управляюча структура «Розгалуження»

Управляюча структура «розгалуження» – це одна з базових управляючих структур. Вона використовується для перевірки умови і вибору однієї або більше дій в залежності від істинності або хибності умови. В основі заданої оператором ЯКЩО умови лежить порівняння двох елементів, яке зазвичай представляють операціями відношення:

< менше

> більше

= рівно

<= менше або рівно

>= більше або рівно

<> не рівно

Існує декілька різновидів структури «розгалуження». Розглянемо їх.
2.1. Просте розгалуження (оператор ЯКЩО)

Просте розгалуження використовується при виборі однієї з двох альтернатив­них дій в залежності від істинності або хибності умови. Для представлення структури використовуються ключові слова ЯКЩО, ТО, ІНАКШЕ і ЯКЩО ВСЕ. Наприклад:

ЯКЩО account_balance $300

ТО

service_charge = 5.00

ІНАКШЕ

service_charge = 2.00

ЯКЩО ВСЕ

В залежності від результату умови ЯКЩО буде реалізована дія ТО або дія ІНАКШЕ.
2.1.1. Просте розгалуження без гілки хибності (без оператора ІНАКШЕ)

Структура без оператора ІНАКШЕ є різновидом простої струк­тури ЯКЩО. Вона використовується в тих випадках, коли дія повинна бути виконана тільки у випадку істинності умови. Якщо умова хибна, ні­чого не відбудеться і конструкція ЯКЩО буде пропущена. Наприклад:

ЯКЩО тип_навчання = _заочний_

ТО

Додати 1 до число_заочників

ЯКЩО ВСЕ

В даному випадку, поле число_заочників буде змінене, тільки якщо студент навчається на заочному відділенні.
2.2. Складене розгалуження (складений оператор ЯКЩО)

Складений оператор – це декілька операторів, об'єднаних в одну групу (блок).

Складений оператор ЯКЩО складається з кількох умов, поєднаних логічними операціями І або АБО. Якщо для поєднання умов використовується операція І, то для виконання складеної умови істинни­ми повинні бути обидві умови, наприклад:

ЯКЩО тип_навчання = _заочний_ І стать_студента = Ж

ТО

Додати 1 до число_дівчат_заочниць

ЯКЩО ВСЕ

В цьому випадку, кожний запис студентів буде перевірений двічі. О­брані будуть тільки дівчата-студентки, які навчаються заочно, і тільки в цьому випадку значення змінної число_дівчат_заочниць буде збільшене. Якщо одна з умов хибна, значення лічильника не зміниться.

Якщо для поєднання умов використовується операція АБО, то для визнання складеної умови істинною, достатньо, щоб хоча б одна із поєднаних умов була істинною. Якщо обидві поєднані умови хибні, то і складена умова вважається хибною.

Якщо в наведеному вище прикладі замінити операцію І на операцію АБО, вихідні дані суттєво зміняться.

ЯКЩО тип_ навчання = заочний_ АБО стать_студента = Ж

ТО

Додати 1 до число_дівчат_заочниць

ЯКЩО ВСЕ
У цьому прикладі, складена умова буде істинною, якщо хоча б одна з умов істинна. Лічильник буде збільшений у випадку:

  1. якщо студент навчається заочно, незалежно від його статі, або

  2. якщо стать студента жіноча, незалежно від типу навчання.

Пропущені будуть тільки ті студенти чоловічої статі, які не навчаються на заочному відділенні. У результаті змінна число-дівчат-заочниць буде містити кількість студенток заочниць, студентів заочників і студенток очного відділення. Ім’я змінної число-дівчат-заочниць не буде відповідати значенню, що в ній зберігається. Поєднуючи умови операціями І або АБО, потрібно добре розуміти, що буде відбуватись.

Операціями І або АБО можна поєднати більше двох умов. Але якщо в одній умові ЯКЩО використовуються обидві операції, то, щоб виключити двозначність, слід використовувати круглі дужки. Розглянемо приклад:

ЯКЩО код_запису = '23' АБО код_зміни = видалити І залишок_рахунку = 0

ТО

Видалити запис користувача

ЯКЩО ВСЕ

Логіка цієї конструкції збиває з пантелику. Що групувати і обробляти спочатку: перші дві умови або дві останні? Але алгоритми не повинні бути неоднозначними. Хоч для логічних опера­цій немає жорстко оговореного порядку виконання, він є у більшості мов програмування. Тому, щоб уникнути двозначності, слід використовувати круглі дужки:

ЯКЩО (код_запису = '23' АБО код_зміни = видалити) І залишок_рахунку = нулю

ТО

Видалити запис користувача

ЯКЩО ВСЕ

Тепер двозначності немає, і, зрозуміло, які умови повинні бути виконані для видалення запису клієнта: запис буде видалений, якщо залишок_рахунку дорівнює нулю і або код_запису рівний 23, або код_зміни рівний «видалити».
2.3. Операція НЕ

Операція НЕ може бути використана для логічного заперечення умо­ви, наприклад:

ЯКЩО НЕ (код_запису = '23')

ТО

Змінити запис користувача

ЯКЩО ВСЕ

Тут, дії оператора ЯКЩО будуть виконані для всіх записів, код яких відрізняється від 23, тобто не рівний 23.

Зверніть увагу, що операції І або АБО можна використовувати разом з операцією НЕ, але щоб уникнути двозначностей, потрібно не забувати застосовувати круглі дужки:

ЯКЩО НЕ (код_запису = '23' І код_зміни = видалити)

ТО

Змінити запис користувача

ЯКЩО ВСЕ

У цьому прикладі, запис користувача буде змінений, якщо код_запису не рівний 23 і код_зміни не рівний «видалити».
2.4. Вкладене розгалуження (вкладений оператор ЯКЩО)

Розгалуження є вкладеним (багатозначним), якщо у тілі конструкції розгалуження зустрічається ключове слово ЯКЩО. Вкладені розгалуження можуть бути лі­нійними і нелінійними.
2.4.1. Лінійні вкладені конструкції ЯКЩО

Лінійна вкладена конструкція ЯКЩО застосовується, коли змінна пере­віряється на різні значення і для кожного із значень потрібно виконати різні дії.

Цей вид вкладеного розгалуження називається лінійним, тому що опера­тор ІНАКШЕ слідує відразу за відповідною йому умовою ЯКЩО. Ліній­ні вкладені конструкції ЯКЩО рекомендується для наочності записувати з відступами, вирівнюючи всі відповідні ключові слова ЯКЩО, ІНАКШЕ і ЯКЩО ВСЕ.

Наприклад:

ЯКЩО record_code = 'А’

ТО

Збільшити counter_A

ІНАКШЕ

ЯКЩО record_code = ‘В’

ТО

Збільшити counter_B

ІНАКШЕ

ЯКЩО record_code = ‘С’

ТО

Збільшити counter_C

ІНАКШЕ

Збільшити error_counter

ЯКЩО ВСЕ

ЯКЩО ВСЕ

ЯКЩО ВСЕ

В наведеному прикладі кількість операторів ЯКЩО рівна кількості операторів ІНАКШЕ і кількості операторів ЯКЩО ВСЕ. Правильне використання відступів робить конструкцію більш наочною і зрозумілою. Групу лінійно вкладених конструкцій ЯКЩО інколи називають «каскадною конструкцією ЯКЩО» відповідно до вигляду розташування окремих фрагментів у запису алгоритму.
2.4.2. Нелінійні вкладені конструкції ЯКЩО

Нелінійною вкладена конструкція ЯКЩО є тоді, коли для виконання певної дії перевіряється кілька різних умов. Конструкція називається нелінійною тому, що оператор ІНАКШЕ може бути відокремлений від відповідного йому оператора ЯКЩО. Записуючи лістинг програми, також важливо коректно використовувати відступи. Кожен оператор ІНАКШЕ і ЯКЩО ВСЕ має бути на одному рівні з відповідним йому оператором ЯКЩО.

Наприклад:
ЯКЩО тип_навчання = _заочний_

ТО

ЯКЩО стать_студента = Ж

ТО

ЯКЩО вік_студента 21

ТО

Додати 1 до дорослі_дівчата_заочниці

ІНАКШЕ

Додати 1 до молоді_дівчата_заочниці

ЯКЩО ВСЕ

ІНАКШЕ

Додати 1 до хлопці_заочники

ЯКЩО ВСЕ

ІНАКШЕ

Додати 1 до студенти_денного_навчання

ЯКЩО ВСЕ

В даному прикладі кількість операторів ЯКЩО, операторів ІНАКШЕ і операторів ЯКЩО ВСЕ співпадає. Правильне використання відступів допоможе побачити відповідні трійки операторів ЯКЩО, ІНАКШЕ і ЯКЩО ВСЕ.

Проте нелінійні вкладені конструкції ЯКЩО можуть містити логічні помилки, які важко виправляти, тому не слід захоплюватися їх використанням. Якщо це можливо, краще замінити групу нелінійних вкладених конструкцій ЯКЩО розгалуженням із складеною умовою. Така заміна можлива, оскільки два послідовні оператори ЯКЩО працюють як оператор ЯКЩО із складеною умовою, що використовує операцію І. Як приклад розглянемо наступну нелінійну вкладену конструкцію ЯКЩО:
ЯКЩО тип_навчання = _заочний_

ТО

ЯКЩО вік_студента 21

ТО

Збільшити на 1 дорослі_заочники

ЯКЩО ВСЕ

ЯКЩО ВСЕ

Її можна записати у вигляді складеної конструкції ЯКЩО:
ЯКЩО тип_навчання = _заочний_ І вік_студента 21

ТО

Збільшити на 1 дорослі_заочники

ЯКЩО ВСЕ
Обидві ці конструкції дадуть однаковий результат, але, якщо логіка дозволяє, краще використовувати другий варіант конструкції, оскільки він простіший для розуміння.

Розглянемо приклад задачі з програмування, в якій використовується управляюча структура «розгалуження».
Приклад 1. Прочитати три символи

Складіть алгоритм, який буде пропонувати користувачу введення трьох символів, прийматиме ці символи як вхідні дані, сортуватиме їх в алфавітному порядку і виводитиме на екран.

Крок 1: Визначення алгоритму

Таблиця визначення алгоритму

Вхідні дані

Етапи обробки

Вихідні дані

символ_1

символ_2

символ_3

Запросити введення символу

Прийняти три символи

Сортувати символи

Вивести символи на екран

символ_1

символ_2

символ_3

Крок 2: Розробка логіки алгоритму

Для сортування трьох символів у порядку зростання в алгоритмі використовується кілька конструкцій ЯКЩО:
Прочитати_три_символи

  1. Запросити у користувача символ_1, символ_2, символ_3

  2. Отримати символ_1, символ_2, символ_3

  3. ЯКЩО символ_1 > символ_2

  4. ТО

temp = символ_1

символ_1 = символ_2

символ_2 = temp

5 ЯКЩО ВСЕ

6 ЯКЩО символ_2 > символ_3

7 ТО

temp = символ_2

символ_2 = символ_3

символ З = temp

8 ЯКЩО ВСЕ

9 ЯКЩО символ_1 > символ_2

10 ТО

temp = символ_1

символ_1 = символ_2

символ_2 = temp

11 ЯКЩО ВСЕ

12 Вивести на екран символ1, символ_2, символЗ

13 КІНЕЦЬ
У запропонованому рішенні сортування виконується шляхом «обміну» значеннями двох змінних:
temp = символ_1

символ_1 = символ_2

символ_2 = temp

Тут значеннями обмінюються змінні символ_1 і символ_2, для обміну використовується тимчасова змінна, temp. При написанні подібного коду слід бути уважним, щоб при перетасовуванні не втратити значення змінних. Щоб зробити алгоритм більш наочним, сортування слід виконувати в окремому модулі (див. пр.16 п.4.3).

Крок 3: Перевірка алгоритму «на папері»

Для перевірки алгоритму будуть використані два набори відповідних символів. Перший набір складатиметься з символів k, b, g, а другий – z, s, а.

Вхідні дані




Перший набір даних

Другий набір даних

символ_1

символ_2

символ_3

K

b

g

Z

s

a


Очікувані результати

Розрахуємо очікувані результати для кожного контрольного набору.




Перший набір даних

Другий набір даних

символ_1

символ_2

символ_3

b

g

k

a

s

z

Перевірочна таблиця

Для позначення дій програми використовуються номери рядків. Зверніть увагу, що при перевірці логіки «на папері», кожна конструкція ЯКЩО розглядається як одна дія.

Номер дії

символ 1

символ 2

символ 3

temp

Перший набір

1,2

k

b

g




3

b

k




k

4




g

k

k

5













6

вивід

вивід

вивід




Другий набір

1,2

z

s

a




3

s

z




z

4




a

z

z

5

a

s




s

6

вивід

вивід

вивід





Питання для самоконтролю

  1. Яка записується і виконується управляюча структура «розгалуження» в повній формі?

  2. Яка записується і виконується управляюча структура «розгалуження» в скороченій формі?

  3. Чи можна у структурі «розгалуження» використовувати складені оператори?

  4. Яких основних правил слід дотримуватись при програмуванні алгоритмів з розгалуженням ?


2.5. Множинне розгалуження (оператор ВИБІР)

Лінійна вкладена конструкція ЯКЩО має альтернативуконструкцію ВИБІР. Її використовують з кількох причин:

  • вона прямо переводиться на багато мов високого рівня;

  • вона спрощує написання і розуміння алгоритму;

  • вона спрощує вибір значень одного з декількох.


У конструкції ВИБІР можуть бути представлені кілька логічних гілок:

ВИБІР за _змінною_

значення_1: група дій_1

значення_2: група дій_2

.

.

.

значення_n: група дій_n

значення_інакше: група дій_інакше

ВИБІР ВСЕ
Вираз, що записується після оператора ВИБІР, називається селектором. Селектор може належати до одного з типів: цілий, символьний, булевий. Дійсні типи в селекторах використовувати не можна.

Мітки варіантів – константи, типи яких повинні співпадати з типом селектора. Всі мітки повинні бути різними. Якщо якомусь оператору в конструкції ВИБІР відповідає декілька міток, то вони перераховуються через кому.

Виконується конструкція ВИБІР так:

Спочатку обчислюється значення селектора, а тоді виконується той оператор з конструкції, мітка якого дорівнює значенню селектора. Якщо значення селектора рівне значення_1, буде виконана група дій_1, якщо значення_2 – група дій_2 і так далі. По закінченню виконання вибраного оператора управління передається на виконання оператору, що слідує за оператором ВИБІР.

Рядок значення_інакше доданий на випадок, коли значення селектора не буде дорівнювати жодному з наведених значень. Якщо значення селектора не співпадає ні з однією з міток, то обирається оператор, який знаходиться після оператора ВИБІР, тобто після службового слова ВИБІР ВСЕ.

Мітки варіантів не потрібно описувати в розділі міток.

Розглянемо приклад.
Приклад 2. Визначити квартал року

Складіть алгоритм, який буде приймати порядковий номер місяця як вхідні дані, визначати квартал року за цим порядковим номером і виводити його на екран.

Крок 1: Визначення алгоритму

Таблиця визначення алгоритму

Вхідні дані

Етапи обробки

Вихідні дані

Порядковий_ номер_місяця

Запросити введення номера місяця

Прийняти номер місяця

Надрукувати номер кварталу

Номер_кварталу


Крок 2: Розробка логіки алгоритму

В алгоритмі рішення буде використовуватись конструкція ВИБІР.

Визначення_номеру_квартала

Запросити у користувача порядковий_номер_місяця

Отримати порядковий_номер_місяця

ВИБІР по порядковий_номер_місяця

1,2,3: номер_кварталу=1

4,5,6: номер_кварталу=2

7,8,9: номер_кварталу=3

10,11,12: номер_кварталу=4

ВИБІР ВСЕ

Вивести на екран номер_кварталу

КІНЕЦЬ

Крок 3: Перевірка алгоритму «на папері»

Для перевірки алгоритму будуть використані два набори відповідних символів. Перший набір складатиметься з символів k, b, g, а другий — z, s, а.
Вхідні дані




Перший набір

даних

Другий набір даних

порядковий_номер_місяця

2

10


Очікувані результати

Розрахуємо очікувані результати для кожного контрольного набору.




Перший набір даних

Другий набір даних

номер_кварталу

1

4


Перевірочна таблиця

Для позначення дій програми використовуються номери рядків. Зверніть увагу, що при перевірці логіки «на папері» кожна конструкція ЯКЩО розглядається цілком як одна дія.

Номер дії

порядковий_номер_місяця

номер_кварталу

1,2

2




3




1

4

вивід

вивід

1,2

10




3




4

4

вивід

вивід

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

Питання для самоконтролю

  1. Як записується і виконується конструкція ВИБІР?

  2. Що таке «селектор» і які вимоги до нього ставляться?

  3. Для конструкція ВИБІР запишіть її еквівалент за допомогою конструкції ЯКЩО.

  4. Охарактеризуйте відмінність конструкції ВИБІР від конструкції ЯКЩО.

  5. Які ключові слова оператору ВИБІР є обов’язковими?

  6. Скільки значень селектора може бути в операторі ВИБІР ?