- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •Оператори циклів у Паскалі
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •Двійкові файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •2. Алгоритми
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Безтипові параметри
Крім двох звичайних способів передачі параметрів у підпрограми при їх виклику - за значенням і по посиланню - Turbo Pascal допускає третій спосіб передачі, при якому тип параметра не фіксується. У цьому випадку специфікація формального параметра в заголовку підпрограми має наступний загальний вид:
var Ident,
де Ident - ідентифікатор формального параметра.
У випадку виклику підпрограми фактичний параметр, що відповідає формальному не типізованому параметру, повинний являти собою змінну будь-якого типу (але не вираз; у цьому мається визначена подібність з передачею параметра по посиланню).
Оскільки тип формального параметра не заданий, то, строго говорячи, він несумісний ні з якою іншою змінною, тобто не може входити ні в які конструкції. Тому єдиним способом використання таких параметрів у тілі підпрограми є "наділення" їх визначеним типом. Цього можна досягти двома основними способами: застосувавши до них операцію приведення типу чи описавши в підпрограмі локальну змінну визначеного типу зі сполученням її в пам'яті з не типізованим параметром.
Приведення типів.
Turbo Pascal, на відміну від авторської версії мови, містить спеціальну конструкцію явного перетворення типу. Ця конструкція зветься приведення типу змінної. Приведення не здійснює ніяких операцій з змінної (як, наприклад, операції Round чи Trunc), а просто дозволяє трактувати змінну одного типу, як змінну деякого іншого типу. Загальний вид приведення типу наступний:
ТИП (ЗМІННА)
Іншими словами, для того. щоб використовувати змінну як таку що має деякий інший тип, необхідно взяти її в круглі дужки, а ліворуч приписати ідентифікатор цього типу. Пояснимо це на простому прикладі. Нехай мається ціла змінна SI з наступним описом:
var
SI : 0..255;
Якщо необхідно присвоїти цій змінній значення символьного типу, то присвоювання виду
SI := 'А'
буде неприпустимо через невідповідність типів у лівій і правій частинах. Однак, уживши приведення типу, ми можемо досягти мети:
char(SI) := 'A'
Конструкція приведення типу може знаходитися у всіх позиціях, у яких допускається входження змінної. При цьому слід пам'ятати, що тип даної конструкції завжди визначається ідентифікатором типу перед дужками. Крім того, варто враховувати, що розмір змінної (число байтів, які займає ця змінна) ПОВИНО БУТИ РІВНИМ розміру типу, ідентифікатор якого зазначений у приведенні.
Наведемо ще один приклад. Нехай мається такий опис:
type
Days = (Monday,Tuesay,Wednesday,Thursday,Friday, Satuday,Sunday);
var
aDay : Days
Num : byte;
Тоді припустимі такі оператори:
Days(Num) := Monday; { Num = 0 }
aDay := Days(Num); { aDay = MonDay }
Num := byte(Friday); { Num = 4 }
Зверніть увагу, що еквівалентом останнього присвоювання буде наступне:
Num := Ord(Friday);
Дуже близької по синтаксису і за змістом є конструкція приведення типу значення. Ця конструкція дозволяє перетворити тип довільного виразу, що записується в круглих дужках після ідентифікатора типу, , і може зустрічатися скрізь, де припустимий вираз (наприклад, у правих частинах операторів присвоювання). Маючи на увазі опис з попереднього приклада, можна проілюструвати приведення типу значення наступними операторами:
aDay := Days(Num+l);
Num := byte(Pred(Friday));
Тип виразу в дужках і ідентифікатор типу перед дужками повинні бути або обидва дискретними типами, або обидва посилковими типами. Якщо один дискретний тип перетвориться до іншого, то таке перетворення може привести до усікання чи збільшення розміру пам'яті, у порівнянні з вихідним значенням. При цьому можлива перевірка на перебування значення в припустимих границях. Наприклад, виконання наступної програми:
var
li: longint;
I : integer;
begin
LI := 1234567;
I := integer (li+1) ;
Writeln(I)
end.
приведе до виведення на екран значення -10616 (значення типу longint у процесі приведення до типу integer буде "обрізане").
У тому випадку, якщо значення розширюється (тобто приводиться до більшого по розмірах типу), його знак завжди зберігається.