Розгалуження у програмуванні

Одним із найголовніших конструкцій у програмуванні без яких неможливо уявити жодної програми, що містить елемент "штучного інтелекту", є конструкція розгалуження.

У цьому матеріалі - моя спроба пояснити, що таке конструкція розгалуження і як вона використовується мовами програмування.

Розгалуження і Висловлювання


Розгалуження - це конструкція мови програмування, що містить деяке висловлювання зрозуміле виконавцеві і на яке він, виконавець, може дати відповідь - істинне воно чи хибне. В залежності від істинності чи хибності висловлювання виконавець виконує той чи інший набір команд які також входять до складу розгалуження.
 
У повсякденному житті людина стикається з тим, що "передбачає" для себе план дій на випадок якоїсь ситуації. Наприклад учень, що не виконав домашнє завдання йдучи до школи планує свої дії на випадок якщо  викличе вчитель, а ще планує свої дії на випадок якщо мама лаятиме. Щодня перед тим як перейти дорогу наш мозок робить перевірку істинності висловлювання формулюючи його приблизно так: "якщо машин немає"  і в залежності від істинності дає вказівку ногам "йти" чи "стояти". Отже і для робота програміст повинен передбачити і ситуацію і дії, які потрібно виконати у випадку її настання.

У житті людини трапляється безліч ситуацій. Але щоразу потрапляючи у неї ми ніколи не задумуємось над діями які будемо виконувати. Це робиться підсвідомо і для людини це природньо. Інша справа з технікою. Вона не наділена інтелектом. Вона вміє лише виконувати команди. А отже у її наборі команд повинні бути інструкції, що дають можливість вибору йти чи стояти, піднімати вантаж чи опускати. І будуючи складні механізми, здатні виконувати складні операції, людина повинна передбачити усі ці ситуації. Процес передбачення полягає у тому, що ми повинні описати для виконавця інструкції на випадок:

  • якщо батарея розрядилась,
  • якщо чайник закипів,
  • якщо надійшов пароль для входу і пароль правильний.

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

Відповідями на висловлювання "батарея розрядилася", "чайник закипів" і безліч інших є два прости слова - ТАК і НІ. Відповідь на висловлювання ТАК означає, що воно істинне, а відповідь НІ означає, що висловлювання хибне.

Що означає висловлювання "пароль правильний"?

Можливо правильніше буде запитати у себе коли висловлювання "пароль правильний" буде істинним? Очевидно, що воно буде істинним тоді, коли комбінація символів яка надійшла виконавцеві співпадає з оригіналом, що  є у виконавця. 
Коли  висловлювання "чайник закипів" буде істинним? І тут є очевидна відповідь - температура води у чайнику дорівнює 100 градусам. І попереднє висловлювання з точки зору математики буде істинним коли фраза (набір символів), що надійшла від користувача дорівнює фразі-оригіналові, що є у виконавця. У якій ситуації Ви зможете прошепотіти на вухо товаришеві якийсь секрет?

Якщо  "відстань від Ваших вуст до його вух" менша  "20 сантиметрів".


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

  1. за зарядом батареї визначити "відстань яку він може подолати"
  2. виміряти відстань до кратера

І на цьому етапі ми і повинні подбати про те, щоб робот мав можливіть виконати правильні команди, а отже нам портібно скласти висловлювання на яке програма скаже так чи ні.  

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

"відстань яку можна подолати" > "відстань до кратера" або "відстань до кратера" <  "відстань яку можна подолати"

Сформулювавши одне з таких висловлювань можна оформити конструкцію у якій виконавець буде виконувати деякі дії якщо відповіддю на висловлювання буде ТАК і передбачити інші команди колли відповіддю буде НІ.

 

Розгалуження у Scratch

Середовище Scratch нічим не відрізняються від справжніх мов програмування. Тут теж є конструкція яка дозволить перевірити істинність висловлювання і виконати той чи інший набір команд.

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

Коротка форма розгалуження

Повна форма розгалуження

Обидва блоки містять поле для висловлювання, але коротка форма групує команди, що будуть виконуватись у випадку істинності висловлювання, а повна форма розгалуження групує команди для істинності висловлювання (після слова ТО) та дозволяє групувати команди які будуть виконуватися у випадку хибності висловлювання.

Але для того, щоб ця конструкція працювала вона повинна мати висловлювання і звичайно команди які потрібно виконати. 
Розглянемо приклад:
Кіт хоче спіймати Метелика. Кіт може стрибнути на певну кількість кроків. Чи може Кіт не стрибаючи визначити дістанеться він до Метелика чи ні?

 

Завдання

  1. Створіть проект за поданим вище малюнком.
  2. Змініть імена спрайтів на Кіт та Метелик

Як виявляється у нього є така можливість. Так як Кіт у нас роботизований то у нього є датчики:

Судячи з нашої задачі (Кіт може стрибнути на певну короків і Кіт знаходиться на певній відстані від метелика) нам буде потрібен датчик . Знаючи її Кіт може визначити дострибне він до Метелика чи ні.

Завдання

  1. Додайте для спрайту Кіт блок та клацніть по ньому. Що Ви бачите на екрані.
  2. Змініть положення Кота чи метелика і знову клацніть по блокові.

Але дивлячись на конструкцію розгалуження Ми можемо сказати, що поле для висловлювання і форма датчика не співпадають. А це нам підказка, що просто так відстань нам не допоможе. З умови задачі пам'ятаємо, що Кіт може стрибнути на певну кількість кроків.  І ось саме слово певну є неправильним у постановці задачі. Кіт роботизований і точно знає, що він може стрибнути наприклад на 50 кроків. Тепер у нас є два числа: відстань до метелика і довжина стрибка. Саме вони і допоможуть нам скласти висловлювання.  Оскільки ми "хочемо" щоб Кіт дострибнув до Метелика, потрібно, щоб відстань до Метелика була меншою за довжину стрибка Кота. Порівняння виразів знаходится у групі Оператори:

Так як ми визначили, що довжина стрибка Кота - 50 кроків складемо висловлювання:


це висловлювання на яке КІТ може сказати ТАК (TRUE) або НІ (FALSE)

Завдання

  1. Створіть блок за малюнком вище, додайте його до спрайту Кіт та клацінть по ньому.
  2. Змініть положення Кота чи Метелика і знову клацінть по ньому

Тепер нам залишилось помістит це висловлювання у конструкцію розгалуження. Залишилось лише визначити яка нам потрбіна - повна форма розгалуження чи коротка форма розгалуження. Щоб дати відповідь на це питання ми повинні запитати себе, а що ми хочемо, щоб Кіт зробив якщо на висловлювання буде відповідь ТАК  і чи хочемо, щоб Кіт виконував якісь команди, якщо відповідь буде НІ.

Припустімо я хочу, щоб Кіт у випадку істинності висловлювання говорив "Я спіймаю цього метелика!", а у випадку хибності нічого не робив. Вочевидь мені потрібна коротка форма розгалуження. Якщо ж я хочу, щоб Кіт говорив фразу "Я не спіймаю цього метелика!", коли висловлювання хибне - мені потрібна повна форма розгалуження. В цьому випадку для спрайту Кіт у мене буде такий скрипт:

Завдання

  1. Створіть цей скрипт для спрайту Кіт
  2. Додайте його до обробника події "коли прапорець натиснуто" та запустіть
  3. Змініть положення Кота чи Метелика і знову активуйте скрипт
  4. Додатково: Створіть скрипт для метелика у якому він буде говорити "Цей кіт мене зараз спіймає" або "Ти мене не спіймаєш"

 

ПОДІЛИТИСЯ У FACEBOOK