Розгалуження (умови) у 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.
Кузбит І.М.