Розгалуження (умови) у Delphi. Частина 1.

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

 

Умова

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

Радіус кола дорівнює нулю?

Відповідь правильна?

Сума покупки більше 100 грн.?

В програмі умова — це вираз логічного типу (Boolean), який може приймати одне з двох значень: True (істина) або False (хибно).

Проста умова складається з двох операндів і оператора порівняння. В загальному вигляді умова записується таким чином:

Операнд1 Оператор Oперанд2, де:

Oперанд1 і Операнд2 — операнди умови, замість яких може виступати змінна, константа, функція або вираз;

Оператор — оператор порівняння.

В мові Delphi є шість операторів порівняння, які  приведені в таблиці нижче.

Оператори порівняння

Оператор

Опис

Результат порівняння

>

Більше

True, якщо перший операнд більший за другий, інакше False

<

Менше

True, якщо перший операнд менший за другий, інакше False

=

Дорівнює

True, якщо перший операнд рівний другому, інакше False

<>

Не дорівнює

True, якщо перший операнд не рівний другому, інакше False

>=

Більше або рівне

True, якщо перший операнд більший або рівний другому, інакше False

<=

Менше або рівне

True, якщо перший операнд менший або рівний другому, інакше False

 

Наведемо приклади умов:

Radius < 10; Kilst >=X ; key = Chr(13).

В першому прикладі операндами умови є змінна і константа. Значення цієї умови залежить від значення змінної Radius. Умова буде вірною і, отже, мати значення True, якщо значення змінної Radius менше ніж 10. Якщо значення змінної Radius більше або рівно 10, то значення цієї умови буде False. В другому прикладі як операнди використовуються змінні. Значення цієї умови буде True, якщо значення змінної Kilst більше або рівно значенню змінної X. В третьому прикладі як другий операнд використовується функція. Значення цієї умови буде True, якщо в змінній key знаходиться символьний код клавіші <Enter>, рівний 13.

При записі умов слід звернути особливу увагу на те, що операнди умови повинні бути одного типу або, якщо тип операндів різний, то тип одного з операндів може бути приведений до типу іншого операнда. Наприклад, якщо змінна Key оголошена як integer, то умова Key = Chr(13) синтаксично невірна, оскільки значення, яке  повертається функцією Chr має тип char (символьний).

 

Під час трансляції програми при виявленні невірної умови компілятор виводить повідомлення: incompatible types (несумісні типи).


З простих умов за допомогою логічних операторів: and — "логічне І", or — "логічне АБО" і not — "заперечення" можна будувати складні умови.

В загальному вигляді складна умова записується таким чином:

умова1 оператор умова2

де: умова1 і умова2 — прості умови (вирази логічного типу);

оператор — оператор and або or.

Наприклад:

(key >= 0) and (key <= 9)

(day = 7) or (day = 6)

(Form1.Edit1.Text <> ' ' ) or (Form1.Edit2.Text <> ' ' )

Form1.CheckBox1.Checked and (Form1.Edit1.Text <> ' ' )

Результат виконання логічних операторів and, or і not  представлений нижче.

Виконання логічних операцій

Oп1

Oп2

 

Oп1 and Oп2

Oп1 or Oп2

not Oп1

False

False

False

False

True

False

True

False

True

True

True

False

False

True

False

True

True

True

True

False

 

При записі складних умов важливо враховувати те, що логічні оператори мають більш високий пріоритет, ніж оператори порівняння, і тому прості умови слід брати в дужки. Наприклад, нехай умова надання знижки була сформульована таким чином: "знижка надається, якщо сума покупки перевищує 100 грн. і день покупки — неділя", Якщо день тижня позначений як змінна day цілого типу, і рівність її значення семи відповідає неділі, то умова надання знижки можна записати:

(Suma > 100) and (day = 7)

Якщо умову надання знижки доповнити тим, що знижка надається в будь-який день, якщо сума покупки перевищує 300 грн., то умова можна записати:

((Suma > 200) and (day =7)) or (Suma > 300)

 

Вибір

Вибір в програмі може бути реалізований за допомогою вказівок if і case. Інструкція if дозволяє вибрати один з двох можливих варіантів, інструкція case — один з декількох.

 

Інструкція if

Інструкція if дозволяє вибрати один з двох можливих варіантів виконання програми. Вибір здійснюється залежно від виконання умови.

В загальному вигляді інструкція if записується так:

if умова then
   begin
   // тут вказівки, які треба виконати, якщо умова істинна. 
   end
else 
   begin
   // тут вказівки, які треба виконати, якщо умова хибна. 
   end;

 

Зверніть увагу, що перед else (після end) крапка з комою не ставиться.

 

Виконується інструкція if таким чином:

1. Обчислюється значення умови (умова — вираз логічного типу, значення якого може бути рівний True або False).

2. Якщо умова істинна (значення виразу умови рівна True), то виконуються інструкції, наступні за словом then (між begin і end). На цьому виконання операції if закінчується, тобто інструкції, наступні за else, не будуть виконані.

Якщо умова хибна (значення виразу умова рівно False), то виконуються інструкції, наступні за словом else (між begin і end).

Наприклад, якщо змінна t позначає тип з'єднання опорів в електричному колі (t=1 відповідає послідовному з'єднанню, t=2 — паралельному), а r1 і r2 — величини опорів, то приведена нижче інструкція if здійснює вибір формули, по якій буде виконаний розрахунок.

If  t=1 then
   begin
      r:=r1+r2; 
   end 
else
   begin
      r:=(r1+r2)/(r1*r2); 
   end;

Якщо в інструкції if між begin і end знаходиться тільки одна інструкція, то слова begin і end можна не писати.

Наприклад, інструкцію

if x=5 then
   begin
      k:=k+1 ; 
   end 
else
   begin
      ShowMessage('Помилка!');
   end;

можна переписати так:

if  x=5 then
   k:=k+1 
else
   ShowMessage('Помилка!');

Якщо яка-небудь дія повинна бути виконана тільки при виконанні певної умови і пропущена, якщо ця умова не виконується, то інструкція if може бути записаний так:

if умова then
   begin
      { інструкції, які треба виконати, якщо умова виконується, істинна }  
   end;

 

Приклад1. Скласти програму, де потрібно ввести два цілі числа А, В. Менше замінити добутком цих чисел, більше їх сумою.

procedure TForm1.Button1Click(Sender: TObject);
   var a,b,x,y:integer;
begin
   a:=StrToInt(Edit1.Text);
   b:=StrToInt(Edit2.Text);
   if a>b then
      begin
         x:=a+b;
         y:=a*b;
      end 
   else
      begin
         x:=a*b;
         y:=a+b;
      end;
   a:=x;
   b:=y;
   Edit3.Text:=IntTostr(a);
   
Edit4.Text:=IntTostr(b);
end;

 

 

Приклад2. Як приклад використання інструкції if розглянемо програму обчислення вартості послуг за Інтернет.

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

Діалогове вікно програми Вартість розмови


Для введення початкових даних (тривалість роботи в Інтернеті , номер дня тижня) використовуються поля редагування, для виведення результату і тексту пояснення — текстові поля . В табл. “Компоненти форми додатку Вартість розмови” перераховані компоненти і вказано їх призначення, а табл. “Значення властивостей компонентів” приведені значення властивостей цих компонентів.

Табл. Компоненти форми додатку Вартість розмови

Компонент

Призначення

Edit1

 

Edit2

 

Для введення тривалості роботи в Інтернеті  в хвилинах

Для введення номера дня тижня

 

Label1, Label2

Для виведення тексту пояснення про призначення полів введення

Label3

Для виведення результату обчислення — вартості послуг

Button1

Для активізації процедури обчислення вартості послуг користування Інтернетом

Примітка

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

 

Табл. Значення властивостей компонентів

Властивість

Значення

Form1 . Caption

Вартість роботи в Інтернеті

r

Edit1.Text

 

Edit2.Text

 

Label1 .Caption

Тривалість (хв.)

Label2 .Caption

Номер дня тижня

Label3 .Caption

 

Button1 . Caption

Обчислити

Примітка

В таблицях, що містять опис значень властивостей компонентів форми, вказується ім'я компоненту і через крапку — ім'я властивості. Наприклад, рядок таблиці Form1.Caption Плата за Інтернет означає, що під час створення форми додатку властивості Caption форми додатку треба привласнити вказане значення — текст "Плата за  Інтернет".

 

Програма проводить обчислення в результаті клацання на командній кнопці Обчислити. При цьому виникає подія onclick, яка обробляється процедурою TForm1.Button1Click.

Лістинг. Обчислення вартості користування інтернетом

Unit Inet;
interface
Windows, Messages, SysUtils, Classes 
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Editl: TEdit; // поле введення тривалості роботи в Інтернеті 
Edit2: TEdit; // поле введення номера дня тижня 
Button1: ТВutton; // кнопка Обчислити 
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure ButtonlClick(Sender: TObject); private
/ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
implementation
($R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); 
   const
   Cina =0.03; // ціна однієї хвилини роботи 0.03 грн. 
   DISCOUNT = 0.2; // знижка 20 відсотків 
   var
   Time:Real; // тривалість роботи 
   Day:integer; // день тижня 
   Suma:real; // вартість послуг 
Begin  // отримати початкові дані 
   Time:=StrToFloat(Editl.Text) ;
   Day:=StrToInt(Edit2.Text);
   // Обчислити вартість послуг 
   Suma:= Cina*Time;
   // Якщо день субота або неділя, то зменшити // вартість на величину знижки 
   if (Day = 6) OR (Day = 7) then
       Suma:=Suma*(1 - DISCOUNT);
      // виведення результату обчислення 
   label3.caption:='До оплати '+ FloatToStr(Suma)+ ' грн.'; end;
end.

 

Проект «Вгадай число»

Завдання. Складіть програму «Вгадай число». Комп’ютер загадує випадкове число від 0 до 100. Користувач робить спробу вгадати число. Комп’ютер порівнює введене число і видає відповідь «мало» або «багато». Якщо користувач вгадав число, виводиться надпис «Ура! Ти вгадав число!»

1. Створіть проект. Розмістіть на формі елементи відповідно до приведеного прикладу. Задайте властивості компонент згідно таблиці

Властивість

Значення

Form1 . Caption

Вгадай число

Edit1.Text

 

Label1 .Caption

Ваша спроба

Label2 .Caption

 

Label3 .Caption

Ура! Ти вгадав число

Label3 .Visible

False

Button1 . Caption

Загадати нове число

Button2 . Caption

Перевірити

 

2. Для одержання випадкових чисел в Delphi існує функція Random(k), яка повертає випадкове ціле число, що лежить у діапазоні від 0 до k. Наприклад, щоб отримати випадкове число від 0 до 100, необхідно записати оператор присвоєння: x:=Random(100). Для того, щоб при кожному запуску програми одержувати різні випадкові числа необхідно перед використанням функції Random використати процедуру Randomize

Отже, кнопці «Загадати нове число» відповідає процедура обробки події:

procedure TForm1.Button1Click(Sender: TObject);
   begin
      Randomize;
      b:=Random(100);
      Label2.Visible:=False;
      Label3.Visible:=False;
      Edit1.Clear;
      Edit1.SetFocus;
   end;

Змінну b потрібно описати як глобальну змінну, а саме перед початком виконавчої частини після слів var   Form1: TForm1;  b:integer;

3. Для кнопки перевірити потрібно записати такий код:

procedure TForm1.Button2Click(Sender: TObject);
   var a:integer;
begin
   Label2.Visible:=False;
   a:=StrToInt(Edit1.Text);
   if a=b then
      begin
          Label3.Visible:=True;
          Label2.Visible:=False;
      end
   else
   if not a>b then
      begin
         Label2.Visible:=True;
         Label2.Caption:='МАЛО';
       end
   else
      begin
         Label2.Visible:=True;
         Label2.Caption:='БАГАТО';
     end;
end;

4. Збережіть проект. Запустіть програму на виконання.

Для того, щоб вгадати швидко число потрібно використати так званий метод «половинного ділення».

 

Практичні завдання для статті

 

Ця стаття входить в курс уроків по Delphi.

Зміст курсу лекцій та практичних занять по Delphi.

 

Кузбит І.М.