вирази Delphi
У програмах Delphi застосовуються- математичні вирази
- логічні вирази
- вираження з рядками
математичні вирази
У математичних виразах використовуються операції присвоювання: =. складання +. віднімання -. множення *. ділення /. цілочисельного ділення div. залишку від ділення mod. При використанні цих операцій важливий пріоритет їх виконання, так як в програмуванні на мові Delphi, як і в звичайній математиці, вирази виконуються не в порядку проходження, а з урахуванням пріоритету. У операцій множення і ділення вищий пріоритет, ніж у операцій додавання і віднімання.
Тобто, результат виразу
буде дорівнювати не 1, як у випадку послідовного виконання, а 6.2.
Якщо ж ми хочемо отримати саме послідовне виконання, то необхідно застосовувати дужки (), відокремлювалися ті операції, які необхідно виконати першими. Дужки можуть бути вкладені одна в одну необмежену кількість разів:
Ось тепер X дорівнюватиме 1.
Крім чотирьох математичних дій в Delphi є безліч математичних функцій, таких, наприклад, як тігонометріческіе, логарифмічні, і т.д. Вони стають доступні в програмі після додавання в секцію Interface uses модуля Math. Їх опис також можна знайти в модулі Math.pas (можна знайти скориставшись пошуком Windows). Багато з них можна реалізувати і самому, але вбудовані функції напевно будуть працювати швидше і краще, тому що написані на мові асемблера.
Логічні вирази
Логічні вирази виконуються над операндами логічного типу, тобто мають тип Boolean Delphi. Вони застосовуються в основному в умовних операторах.
Оператори Delphi
Для створення додатків, що реалізують складну алгоритмічну логіку, потрібні кошти управління ходом роботи програми: зміни порядку виконання операторів в залежності від різних умов, і ефективної організації роботи часто повторюваних фрагментів. Математично доведено, що будь-який алгоритм можна закодувати за допомогою- оператора присвоювання
- умовного оператора
- оператора циклу
На початку фрагмента змінна A дорівнює 3, а в кінці -25.
Умовний оператор дозволяє змінити порядок виконання операторів в залежності від виконання деякого умови. Ось як він записується:
if умова then дію else альтернатива;
Слова if (якщо), then (тоді), else (інакше) - зарезервовані. Дія і else альтернатива - це будь-які оператори Delphi, або кілька операторів, ув'язнених в логічні дужки begin / end. або виклик підпрограми. Якщо умова істинно, то виконується дія. якщо помилково, то виконується альтернатива.
Умова являє собою логічне вираження. У ньому порівнюються значення виразів (в тому числі також і логічних), виклик функцій, які повертають значення типу Boolean. і комбінування цих значень за допомогою логічних операцій:
Логічні операції можуть комбінуватися за допомогою зв'язок:
and (логічне І)
or (логічне АБО)
xor (виключає АБО)
Для деяких типів даних є додаткові операції. Наприклад, для множин - оператор in. яка перевіряє, чи входить деяке значення в безліч. наприклад:
X: = [2, 4, 5, 7, 8, 10];
Вираз 2 in X істинно (має значення true);
Вираз 6 in X ложно (має значення false);
Логічне Чи не - заперечення
Результат виконання операції логічного І рівний true. якщо обидва операнда рівні true.
Результат виконання операції логічного АБО дорівнює true. якщо хоча б один з операндів дорівнює true.
Результат виконання операції виключає АБО дорівнює true. якщо операнди не рівні один одному.
Оператори циклу дозволяють організувати багаторазове повторення однієї і тієї ж послідовності дій. У Delphi є три оператора, що дозволяють це зробити:
- "Простий" оператор циклу
- умовний оператор циклу
- умовний оператор повторення
Простий оператор циклу застосовується, коли відома кількість повторень циклу. Він записується так:
forсчётчік: = вираз-1toвираженіе-2
do дію;
Лічильник - це змінна, яка повинна бути оголошена перед логічним блоком, в якому оператор циклу розташований, і її тип повинен належати до одного з перелічуваних типів, зазвичай Integer.
Вираз-1 і вираз-2 можуть бути як константою або ідентифікатором, так і викликом функції.
Дія - один або кілька операторів Delphi. Якщо це група операторів, то вони повинні бути укладені в логічні дужки begin / end.
На початку роботи оператора змінна-лічильник отримує значення виразу-1. Якщо при цьому значення лічильника виявиться менше або дорівнює значенню виразу-2. то виконуються оператори, що входять в дію. Це і є один цикл. Потім змінна-лічильник приймає значення, що випливає за поточним, і починається новий цикл, тобто порівняння лічильника і вирази-2. виконання дії. і так далі, до тих пір, поки значення змінної-лічильника не перевищить значення виразу-2.
Можлива робота оператора циклу, при якому змінна-лічильник буде не збільшуватися, а зменшуватися. У цьому випадку ключове слово to замінюється на downto:
for лічильник: = вираз-1 downto вираз-2 do дію;
Відповідно, вираз-1 має бути більше або дорівнює висловом-2.
Умовний оператор циклу зручно використовувати в тому випадку, коли кількість повторень заздалегідь невідомо:
while умова do
тіло циклу;
Цей цикл буде виконуватися до тих пір, поки істинно умова (логічний вираз, що повертає значення типу Boolean). При цьому якщо цей вислів відразу одно false. тіло циклу не буде виконано жодного разу.
Потрібно дуже уважно стежити за написанням умови і контролем завершення циклу, так як в результаті помилки цикл while буде повторюватися нескінченну кількість разів, що призведе до "зациклення" і "зависання" програми.
Умовний оператор повторення спочатку виконує тіло циклу. а потім вже перевіряє виконання умови:
repeat
тіло циклу
until умова;
Таким чином, цей варіант циклу гарантує, що тіло циклу буде виконано принаймні один раз. І буде виконуватися до тих пір, поки умова не стане істинним (тобто true). Варто відзначити, що це єдиний оператор Delphi. в якому тіло циклу не потрібно укладати в логічні дужки begin / end. Початок і кінець тіла циклу визначаються за ключовими словами repeat і until.
- команда переривання циклу
- команда продовження циклу
Break;
При її виконанні управління передається на перший оператор, наступний за оператором циклу.
Команда продовження циклу дозволяє негайно продовжити виконання циклу, пропустивши всі залишилися оператори в тілі циклу, тобто почати наступну ітерацію. Ось ця команда:
Continue;
Справедливості заради варто розповісти про ще один операторі, що дозволяє змінити послідовність виконання програми. Це оператор переходу:
goto мітка;
В якості мітки може використовуватися будь-який допустимий ідентифікатор або число в діапазоні від 0 до 9999. мітку попередньо необхідно оголосити в розділі опису змінних, але з допомогою не ключового слова var. а ключового слова label:
label меткa;
або
label список міток;
Переходити можна як вниз, так і вгору по програмі. Двокрапка відокремлює мітку від оператора, на який відбувається перехід. Приклад використання оператора переходу:
З цього прикладу видно, що оператор end; завершальний програму, ніколи не буде виконано, то є програма зациклиться. Саме тому, взагалі, використання оператора переходу є поганим стилем програмування. і без його використання цілком можна обійтися використанням умовних операторів і операторів циклу. Єдиний випадок, коли використання оператора goto може бути виправдано - це вихід з декількох вкладених циклів, що інакше вимагає застосування декількох операторів Break.
Сортування масивів - типова задача, де використовуються цикли. Існує безліч методів сортування масивів. У розглянутому прикладі розглядається сортування масиву методом "бульбашки". В ручному режимі роботи програми можна бачити, як числа піднімаються вгору по масиву, подібно спливаючого бульбашки, і стає зрозумілим таку назву методу.
type Point = Record // Оголошуємо тип: Запис
n, digit: Integer; // номер і значення: цілі числа
end;
var
Form1: TForm1;
tab: array [1..20] of Point; // Створюємо масив записів типу Point
procedure TForm1.FormCreate (Sender: TObject);
begin
StringGrid1.Cells [0, 0]: = 'Номер'; // ініціалізувавши стовпці таблиці
StringGrid1.Cells [1, 0]: = 'Значення';
end;
procedure TForm1.Button1Click (Sender: TObject);
var i: Integer;
begin
Randomize; // ініціалізувавши "випадкову" процедуру
For i: = 1 to StringGrid1.RowCount-1 do
begin
tab [i] .n: = i; // Надаємо осередкам масиву порядкові номери
tab [i] .digit: = Random (100); // Надаємо осередкам масиву випадкові значення в діапазоні від 0 до 100
StringGrid1.Cells [0, i]: = IntToStr (i) + '.'; // нумеруємо таблицю
StringGrid1.Cells [1, i]: = IntToStr (tab [i] .digit); // Переписуємо в таблицю значення
end;
end;
procedure TForm1.Button3Click (Sender: TObject);
begin
Application.Terminate; // Процедура завершення програми
end;
Є можливість трохи поліпшити процедуру сортування, що прискорить її приблизно на чверть. Справа в тому, що після кожного завершеного циклу найбільший ще невідсортоване елемент переміщається на своє місце в низ таблиці. Тобто, черговий k-й цикл вже останні k елементів може не переглядати. Для реалізації цього потрібно ввести змінну - лічильник циклів, і відняти її від змінної циклу. При цьому ті ж 100 000 елементів упорядковано вже за 24 секунди! Реалізацію цього варіанту надаю читачеві, з огляду на його крайній простоти.