Логічні вирази та змінні й операції над ними

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

Можна перевіривши умову х > 0? Якщо відповідь буде так, то ми будемо обчислювати у за формулою 1, а якщо ні, то за формулою 2. Таким чином ми матимемо два шляхи розв’язку даної системи рівнянь.

Умова
В повсякденному житті умова звичайно формулюється у вигляді питання, на яке можна відповісти Так чи Ні. Наприклад:
Радіус кола дорівнює нулю?
Відповідь правильна?
Сума покупки більше 100 грн.?
В програмі умова — це вираз логічного типу (Boolean), який може приймати одне з двох значень: True (істина) або False (хибно).
Проста умова складається з двох операндів і оператора порівняння. В загальному вигляді умова записується таким чином:
Операнд1 Оператор Oперанд2, де:
Oперанд1 і Операнд2 — операнди умови, замість яких може виступати змінна, константа, функція або вираз;
Оператор — оператор порівняння.
В мові Lazarus є шість операторів порівняння, які  приведені в таблиці нижче.

Оператори порівняння
Оператор
Опис
Результат порівняння
Більше
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 здійснює вибір формули, по якій буде виконаний розрахунок.
іf  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
Вартість роботи в Інтернеті
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.

Комментариев нет:

Отправить комментарий