неділя, 19 лютого 2017 р.

Lazarus. Урок 14. Розгалуження та операторні дужки.

Привіт. Сьогодні продовжимо гратися із оператором розгалуження (ми ще довго будемо з ним гратися 😃 ).  І сьогоднішній урок розпочнемо з розбору попереднього. На минулому уроці нам потрібно було створити проект у якому ми могли рухати форму у відповідному напрямку однією кнопкою, а обирати напрямок ще чотирма.
Як я вже й писав підказка до завдання була в назві посту "Змінна-перемикач". Бо саме використання змінної дозволить програмі запам’ятати у якому напрямку потрібно рухати форму. Отож для того, щоб програма запам’ятала куди саме їй потрібно рухатись достатньо було створити змінну наприклад типу byte (цілі числа в межах від 0 до 255n:byte; а потім створити обробники подій для кнопок, що означають напрямок і вписати в них команду
n:=1;
Маю надію, що Ви вже здогадались, що потрібно вписати в обробник події Onclick для кнопки Go.
Звичайно процедура повинна містити код перевірки значення змінної n. А отже мати наступний вигляд:

Залишилось лише додати перевірку для кнопок вправо та вниз.

А тепер давайте доповнимо попереднє завдання. 
Після того, як форма переміститься в обраному напрямку потрібно, щоб у заголовоку форми відобразився напрямок куди рухалась форма.
Якщо подумати, то нічого складного. Просто допишемо ще одну команду для кожної умови
Form1.Caption:='Вліво';
Так, щоб вийшов код як на малюнку нижче.

Запустіть проект і клацніть по кнопці вліво, а потім Go. Який результат Ви отримали?
Форма перемістилась вліво і в цьому нічого дивного немає. Але який текст ми маємо в заголовку вікна? 
Як не дивно, але там буде слово Вгору. Чому так? Справа в тому, що оператор розгалуження використовує для себе лише одну команду яка записана після THEN чи ELSE. Якщо ж після THEN записати дві та більше команд і при цьому використати ELSE то Ви отримаєте помилку.
У нашому ж випадку ми використали неповний оператор розгалуження тому Програма взявши собі по одній команді, решту просто виконала.
Давайте розглянемо той же код, але записаний по іншому (нумерація для зручності.):

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

 1. if n=1 then form1.left:=form1.left-10;

 2. Form1.Caption:='Вліво';
 3. if n=2 then form1.top:=form1.top-10;
 4. Form1.Caption:='Вгору';  

Отже, після того, як ми натиснули кнопку "Вліво", а потім кнопку "Go", спочатку програма перевірила істинність висловлювання n=1 ( Рядок №1). Воно виявилось істини, а значить виконався код позначений зеленим кольором. Після цього програма виконала команду з рядка №2 і перейшла до рядка №3. Висловлювання n=2 виявилось хибним, а отже код позначений синім кольором не виконувався і програма пішла далі, а отже виконала команду №4. Причому враховуючи швидкодію, зміни тексту в заголовку форми, а він був, ми не побачили. 

Але як же бути з тим, що команда Form1.Caption:='Вліво'; повинна виконатись саме тоді коли n=1, а Form1.Caption:='Вгору';  взагалі не виконатись, якщо ми клацнули кнопку "Вліво"?

На допомогу прийдуть операторні дужки.

Операторні дужки 
BEGIN END  - це операторні дужки.
Так саме ця комбінація слів, вже до речі відома Вам дозволить виправити ситуацію з нашим і не тільки завданням.
Як і звичайні дужки у математиці, BEGIN END можна використовувати там, де потрібно чітко відмежувати якусь частину коду. І найчастіше це відбувається саме в конструкціях розгалуження. 



А тому сам оператор розгалуження можна записати так:
IF <висловлювання> THEN
                                               BEGIN
                                                       <дія1;>  
                                                       <дія2;>
                                                          ...
                                                       <діяN;>
                                              END
                                    ELSE
                                              BEGIN
                                                      <дія1;>  
                                                      <дія2;>
                                                        ...
                                                      <діяN;>
                                              END;

Зверніть увагу!
Після END, що стоїть перед ELSE, крапка з комою не ставиться!

ПРАВИЛО!
Якщо після THEN чи ELSE потрібно виконати дві чи більше команд, вони обов’язково повинні бути обгорнуті операторними дужками!

a:=5;
b:=4;
IF a=b+1 THEN 
                     BEGIN
                      a:=1;
                      b:=a+1;
                     END
                 ELSE
                     BEGIN
                      a:=2;
                      b:=a+1;
                     END
                   
Які значення матимуть змінні а та b?
Ну а тепер виправляти нашу програму! 
Успіхів Вам! Маю надію, що у Вас все вийде!


Додаткові завдання

У попередньому проекті виконайте наступні завдання.
  1. Додайте на форму текстове поле, у яке можна буде ввести "відстань" на яку може переміститися форма.
  2. Подбайте про те, щоб програма перевіряла, що більше ніж на 50 кроків вона рухатись не може.