Змінні та константи
Якщо ключові слова мають наперед визначений зміст, то значення констант і змінних визначає програміст. Але перш, ніж приступити до дослідження констант і змінних, розглянемо знак, який використовується для деяких операцій, оскільки без цього неможливе подальше просування. Йдеться про знак рівності (=), який використовується в Delphi у двох значеннях – як оператор присвоювання та як оператор порівняння.
У разі застосування в якості оператора присвоювання знак рівності використовується спільно з символом двокрапки і має наступний загальний синтаксис:
При присвоєнні використовується 2 операнда, при цьому мається на увазі, що лівого операнда (змінної) буде присвоєно значення правого. Такий запис називається виразом.
ПРИМІТКА Більше точно вираз можна визначити наступним чином: вираз - це набір даних, змінних, операторів та інших виразів, що приводяться до загального значення.
Інший варіант - це використання знака рівності для порівняння двох операндів. У такому разі він використовується самостійно:
Такий запис означає, що порівнюються ліве (операнд1) і праве (операнд2) значення виразу. Однак спеціально для констант передбачено третій варіант, при якому константі надається значення правого операнда (як у випадку звичайного присвоєння), але використовується знак рівності без двокрапки:
Таким чином, ми переходимо до самих константів і змінних, і почнемо з констант, як найбільш типового прикладу підстановки.
Суть використання констант у тому, що замість будь-якого явного значення вказується його умовне позначення - константа. Допустимо, що ви пишете програму, в якій неодноразово слід обчислювати ПДВ. Зрозуміло, ви можете використовувати вВирази явне значення - 0.18 (18%). Але швидше за все, у програмі знайдеться кілька місць, де обчислення потребують значення ПДВ. Таким чином, якщо ПДВ у черговий раз змінять, то вам доведеться відшукувати у програмі всі ці рядки та вносити редагування. У таких випадках на допомогу приходять константи - досить один раз її визначити, а потім у всіх місцях, де потрібне її значення, вказувати ім'я константи.
Визначаються константи за допомогою ключового слова const (від англ. Constant):
Тепер у всіх висловлюваннях, де потрібне значення ПДВ, просто використовується ця константа:
VATsumm := price * VAT;
У цьому вся вираженні задіяна константа VAT і 2 змінних - VATsumm, якій присвоюється значення, і price, що використовується його обчислення. Втім, ціна в даному випадку теж може бути константою, на відміну від VATsumm. Справа в тому, що константи визначаються в момент написання програми, а при компіляції в код автоматично підставляються дійсні значення. Відповідно, для значень, що обчислюються, так само як і для значень, які може вводити користувач, потрібні не константи, а змінні. Так, якби константа VAT була змінною, можна було б передбачити у програмі опцію зміни значення ПДВ.
Змінні визначаються за допомогою ключового слова var (від англ. variable):
Зверніть увагу, що для змінних потрібно вказувати як її ім'я, а й тип даних. Власне, константи теж отримують той чи інший тип даних, тільки це відбувається автоматично, у момент компіляції. Тож розглянь типи даних, передбачених у Object Pascal.
ПРИМІТКА Починаючи з Delphi 4, в Object Pascal підтримуються типізовані константи, значення яких можна змінювати під час виконанняпрограми. Оголошення констант такого типу провадиться так: "const : тип = значення". Від звичайних змінних вони відрізняються відмінностями в обробці компілятором, а також тим, що для них завжди є певне значення.
Типи даних
- Цілочисельні (Integer);
- Речові (Real);
- Булеви (Boolean);
- Символьні (Character);
- Рядкові (String).
Загалом у сучасних версіях Delphi передбачено 7 різних типів даних цілих чисел, всі вони наведені у таблиці 3.2.
ПРИМІТКА Тут слід відразу обмовитися про розуміння пам'яті в програмуванні. Так, пам'ять рахують у байтах. Кожен байт складається із 8 біт. Біт - це мінімальна одиниця інформації, біт може набувати лише 2 значення, 0 або 1. Кожна змінна, залежно від типу, займає ту чи іншу кількість байт у пам'яті. Зазначимо також, що 2 байти утворюють слово (word), а 4 байти - подвійне слово.
Крім перелічених основних типів, Delphi є ще 2 автоматичних цілочисельних типу - Integer і Cardinal. Перше, у разі, є синонімом для LingInt, хоча може бути наведено і типу Int64. Наприклад, якщо оголосить змінну типу Integer і спробувати записати в неї значення, що перевищує максимально допустимий розмір типу LongInt, то вона автоматично перетворюється в Int64:
var x: integer; . x: = 21474483647; // тут x має тип LongInt x: = x + 1;
Що стосується Cardinal, то це - застаріле визначення для LongWord, ви зможете зустріти його, якщо переглядатимете вихідні коди, написані за часів перших версій Delphi. Найпоширенішим практично цілочисловим типом даних є Integer.
Перейдемо до речових типів. Дляних так само передбачені фіксовані типи (щоправда, на відміну від цілих, їх не 7, а 6), і один автоматичний. Розглянемо основні типи таблиці 3.3.
Є також і автоматичний тип - Real, введений для сумісності з програмами, написаними в Delphi 2 або 3. Зараз той тип, що був у ранніх версіях Delphi, називається Real48 і практично не використовується. Замість нього рекомендується використовувати такі типи як Single або Double. Якщо ж задати тип Real у програмі, він буде автоматично приведений до типу Double.
Щось подібне можна сказати і про тип Comp - цей 64-розрядний речовий тип даних зжив себе з моменту появи цілого типу Int64, і присутній лише з метою сумісності зі старим програмним кодом.
Проте тип Currency активно використовується, особливо при роботі з базами даних. Як випливає з його назви (Currency – валюта), даний тип переважно використовуватиме фінансові розрахунки. І хоча Currency відноситься до речових типів даних, компілятор поводиться з ним як з цілим, що дозволяє досягти менших помилок при округленнях.
Загалом, що стосується цілих і речових типів, досить запам'ятати лише дві речі: речовим типам даних можна надавати будь-які чисельні значення, а цілочисловим - лише цілі:
var x: integer; y: double; . x: = 5; y: = 5.25; // Зверніть увагу, що дробова частина відокремлюється точкою y: = x + y; // Так можна робити x := x + y; // а так - не можна, оскільки результатом має бути ціле
Булеві, чи логічні типи даних представлені у Delphi типами Boolean, ByteBool, WordBool і LongBool. Всі вони відрізняються тільки розміром пам'яті, що виділяється для зберігання значення, причому значень може бути тільки 2 - false (брехня) та true (істина):
varx, y: Boolean; . x: = true; y := false;
Основним типом є 1-байтовий Boolean (він же ByteBool), 2-байтовий WordBool і 4-байтовий LongBool призначені лише для сумісності з метою взаємодії з іншими мовами та платформами.
Що ж до символьних типів даних, то Delphi передбачено 2 їх типу - ANSIChar і WideChar. Перший є однобайтовим і може зберігати в собі один символ з безлічі символів ANSI, яких налічується 256. Другий тип є 2-байтовим і призначений для зберігання 2-байтових же символів Unicode. Як і в інших випадках, Delphi має синонім для символьних типів – Char, який на сьогодні є аналогом ANSIChar. Що стосується присвоєння значень, то звичайні символи (літери та цифри) надають змінним символьного типу як є, лише укладаючи їх у поодинокі лапки. А спеціальні символи, наприклад повернення каретки (Enter) призначають за допомогою їх номера в таблиці ANSI, і виділяють знаком решітки:
var x, y: Char; // x і y отримують тип ANSIChar. x: = a; // Звичайні символи y:= #13; // Повернення каретки в таблиці ANSI має номер 13
Нарешті, ще одним, причому, загалом, не зовсім простим типом даних є рядки. Рядкові типи даних від символьних тим, що можуть зберігати не одиничний символ, а безліч символів. У Delphi є 3 типи рядків: ShortString, AnsiString та WideString. Перший тип рядків - ShortString - дістався у спадок від мови Pascal та 16-бітної Delphi 1.0. Такі рядки можуть мати не більше 255 символів, і займають від 2 до 256 байт пам'яті, залежно від розміру: Що стосується сучасних рядкових типів – AnsiString та WideString, то вони можуть мати практично необмежену довжину (AnsiString – до 2 млрд. символів, WideString - до 1 млрд.) і позичати,відповідно, від 4 байт до 2 гігабайт пам'яті. При цьому за аналогією з символьними типами тип AnsiString призначений для зберігання звичайних рядків, а WideString - для рядків у форматі Unicode. Ну і ще один тип рядків – String є синонімом для типу AnsiString:
var str1: ShortString; // Короткий рядок var str2: AnsiString; // Довгий рядок var str3: String; // теж довгий рядок. str1 := Початок.; // Строкові значення полягають у одинарні лапки str2 := Кінець.; str3: = str1 + str2; // Отримаємо довгий рядок, що містить Початок.
Загалом, незважаючи на уявну різноманітність типів даних, на практиці найчастіше обмежуються лише 5-6 основними типами. Це: Integer, Double, Boolean, Char, String, і іноді – ще й Currency.
Дані та значення
Очевидно, що самі собою типи даних нічого не означають. Головне їхнє призначення - зберігати ті чи інші значення, чи дані. Так, для зберігання числових даних застосовують цілі чи речові типи, залежно від того, якого типу числа слід використовувати. Насправді це означає, що будуть застосовуватися типи Integer і Double.
ПРИМІТКА Хоча речові типи і є більш універсальними, використовувати їх треба тільки при реальній необхідності, оскільки вони набагато менш зручні для обчислень комп'ютера. Говорячи конкретніше, математичні операції над речовими числами виконуються набагато повільніше, ніж над цілими, а ряд інших операцій (наприклад, побітові, інкременти або декременти) взагалі неприпустимі.
Рядкові дані вимагають для свого зберігання рядкових типів, тобто. String. Виняток може становити той випадок, коли слід зберегти один і лише один символ – у такому випадку переважно (а іноді – необхідно) використовувати типChar. Ну а в тому випадку, якщо потрібно привести якесь значення однозначного висновку, використовують логічний тип Boolean. Наприклад, якщо порівнювати одне число з іншим щодо того, чи є воно більше, то результатом порівняння буде або "так", або "ні", тобто. true або false:
var x: boolean; . x := 5 > 6; // Отримуємо false, т.к. 5 не більше 6
Операції та їх типи
Будь-якою мовою програмування є знаки операцій. Крім того, деякі ключові слова, такі як div або mod також позначають операції. Всі операції в Object Pascal можна розділити на такі типи: логічні, арифметичні, логічні, операції присвоєння та відносини, а також спеціальні операції. Для їхнього позначення використовуються математичні символи або ключові слова. Значення, що беруть участь в операціях (змінні), називаються операндами. У цьому та чи інша операція може працювати з операндами певного типу. А результатом може бути дані як такого ж типу, так і іншого (наприклад, для того ж порівняння).
Почнемо ознайомлення з арифметичних операцій, як найпоширеніших (не тільки й не так у програмуванні, як у реальному житті). З повним їх переліком, а також з типами вихідних та результуючих даних можна ознайомитись у таблиці 3.4.