Ноу Інти, лекція, числа
Зверніть увагу, тут діапазон і розмір Integer збігається з LongInt. Взагалі-то, це залежить від режиму компілятора FPC. Проект можна скомпілювати в різних режимах, з підтримкою Delphi, наприклад, або TP (Turbo Pascal). За замовчуванням, виставлений режим Object Pascal. це можна перевірити, виконавши в середовищі Lazarus команду меню Проект -> Параметри проекту. потім в розділі Параметри компілятора вибрати Обробка. У верхній частині там вказано Режим синтаксису. за замовчуванням це Object Pascal. але при необхідності його можна і поміняти.
Так ось, якщо там виставлений режим Object Pascal або Delphi. тоді Integer має розмір 32 біта, або 4 байта. Якщо ж виставлений старий режим Turbo Pascal або Free Pascal. то Integer матиме розмір в 16 біт або 2 байта, і буде відповідати типу Smallint.
Навіщо потрібна така різноманітність цілих типів? У минулі часи оперативна пам'ять була досить маленькою. Якщо зараз у мене на ПК встановлена оперативна пам'ять 4 Гб, то колись давно я був змушений обходитися комп'ютером з процесором 486 і оперативкою аж в 16 мегабайт. і можете повірити, це був далеко не найгірший комп'ютер. В ті часи програмісти боролися за кожен байт пам'яті, переписуючи і мінімізуючи код, вибираючи найменші з можливих типи даних. Це називалося оптимізацією коду. Припустимо, вам потрібно виконати якийсь цикл 10 разів. Для підрахунку кроків циклу вам доведеться створити змінну цілого типу. Але навіщо використовувати змінну Integer в 4 байта, коли цілком можна обійтися однобайтового Byte. Зараз звичайно, це не грає такої великої ролі, як раніше, але все одно, оптимізація коду - це ознака хорошого програміста, це хороший тон в програмуванні. Так що намагайтеся не витрачати даремно зайву пам'ять.
Рекомендації тут такі: якщо ви знаєте, що число буде без знака, то і вибирайте беззнакові типи. Якщо ви точно знаєте, що максимальне число у змінній буде маленьким, вибирайте типи поменше. Якщо вам невідомо, якого розміру число потрапить в змінну, то вибирайте Integer - це універсальний тип, придатний для більшості випадків. Ну а якщо ви впевнені, що число буде дуже великим, то використовуйте 4-х або навіть 8-ми байтові типи.
речові числа
Речовими називаються числа з дробовою частиною, причому, якщо дрібна частина дорівнює нулю, її все одно потрібно вказати. наприклад:
Такі числа ще називають числами з плаваючою точкою. оскільки кількість цифр після точки може бути різним. Записуються речові числа за певними правилами. Якщо в математиці ми дробову частину відокремлюємо коми, в Lazarus для цього використовують точку. При вказівці дуже великого числа можна вибрати скорочену форму. Якщо в математиці для цього число множать на десяткову ступінь, наприклад,
то в Lazarus замість 10 вказують букву E (від англ. exponent - показник ступеня):
Ступені можуть бути і негативними:
Речових типів теж багато. У характеристиці дійсних чисел роль відіграє не тільки розмір, займаний в пам'яті, але і кількість значущих цифр:
Таблиця 8.2. речові числа
Як бачите, речові числа куди більше цілих, процесорного часу на обробку таких чисел витрачається теж більше. Тому речові числа можна буде застосувати в разі потреби, коли цілими числами явно не обійтися. Не слухайте тих, хто пропонує на всі випадки життя використовувати тип Real - і для цілих, і для дійсних чисел.
Рекомендації тут такі ж, як і для цілих чисел - вибирайте типи за потребою. Особливо виділю тип Currency - його створили спеціально для фінансових розрахунків, тому для будь-якого роду бухгалтерських розрахунків краще вибирати саме цей тип, як найбільш точний. Але найчастіше обходяться типом Real (або Double).
Операції над цілими і дійсними числами
Цілі числа можна складати (+), віднімати (-) і множити (*) один на одного. З поділом справа йде складніше. Припустимо, нам потрібно 10 розділити на 3. Вийде 3,33333 ..., а це вже не ціле число. Тому для цілих чисел в Паскалі передбачено розподіл без остачі. Операція div забезпечує розподіл без остачі, і повертає цілу частину, відкидаючи дробову. Наприклад, 10 розділити на 8 дорівнюватиме 1,25. Якщо застосувати цілочисельне ділення. то 10 div 8 = 1. Щоб дізнатися залишок від такого поділу, застосовують операцію mod. 10 mod 8 = 2.
Арифметика над числами ще простіше, тут застосовують такі стандартні операції. + (Додавання), - (віднімання), * (множення), / (ділення).
Крім того, як цілі, так і речові числа можна порівнювати між собою, використовуючи для цього логічні оператори. = (Дорівнює), <> (Не дорівнює),> (більше), <(меньше),>= (Більше або дорівнює), <= (меньше или равно).
Дуже часто доводиться використовувати великі і складні вирази, де разом з арифметичними використовуються і логічні оператори. Тут головне - не забувати про пріоритети. візьмемо вираз
Що потрапить в змінну r. Якщо ви відповіли 11, то ви маєте рацію. Щоб спочатку виконати складання. його потрібно помістити в дужки, які мають вищий пріоритет:
В цьому випадку, в змінну r потрапить число 14.
Дякуємо за Ваш чудовий курс!
У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера
mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands
Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?
У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код
їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if
Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?