- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Розділ оголошень і угод
- •Розділ текстів процедур і функцій
- •Розділ основного блоку програми
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •1. Оператор if.
- •2. Оператор вибору (case)
- •Оператори циклів у Паскалі
- •1. Цикл із післяумовою (Repeat)
- •2. Цикл із предумовою (While)
- •3. Цикл із лічильником або параметром (For)
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •If підходить тнеn
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •1. Оголошення файлової змінної і прив'язка до файлу на диску
- •2. Читання даних з файлу
- •3. Запис даних у файл
- •Двійкові файли
- •1. Типізовані файли
- •2. Нетипізовані файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •1. Масив
- •2. Список
- •3. Дерево
- •2. Алгоритми
- •1. Лінійний пошук у масиві
- •2. Двійковий пошук
- •3. Лінійний пошук у списку
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Тип запис
Тип запис, також як і масив, є структурованим типом даних, тобто таким, змінні якого складені з декількох частин. У Турбо-Паскале існує можливість об'єднати в одній змінній дані різних типів (тоді як у масиві всі елементи мають однаковий тип). Приведемо приклад такого типу. Нехай у земінній потрібно зберігати відомості про деяку людину: ПІБ, стать, адреса, телефон. Тоді для збереження цих даних буде зручний такий тип:
type tPerson = record
Name,Surname,SecondName: string[30];
Male: boolean;
Address: string;
Phone: longint;
end;
Оголошення змінної типу запис виконується стандартно, за допомогою var. Частини запису (у нашому випадку: Name, Surname, SecondName, Male, Address, Phone) називаються полями. Звертання до поля запису в програмі виконується за допомогою знака ‘.’ (крапка). Приклад звертання до полів:
var p: tPerson;
...
begin
...
p.Surname:='Іванов';
p.Name:='Іван';
p.SecondName:=’Іванович’;
...
if (p.Phone<0) or (p.Phone>999999)
then writeln(‘Помилка’);
...
end.
Помітимо, що в цьому прикладі постійно приходиться звертатися до полів однієї і тієї ж змінної типу запис, і, отже, постійно писати її ім'я. Існує можливість позбутися від цієї незручності. У Турбо Паскалі є оператор приєднання (with), що дозволяє один раз указати, яким записом ми користаємося і надалі писати лише імена полів. Цей оператор має такий вигляд:
with <ім'я_запису> do <оператор>;
Найчастіше як оператор використовується складений оператор.
Приклад:
with p do begin
Surname:=' Іванов';
Name:=’Іван’;
...
end;
Записи можна включати до складу більш складних змінних, наприклад масивів і інших записів. При необхідності збереження інформації про співробітників деякої організації може виявитися корисним масив:
const N = 30;
type tStaff = array [1..N] of tPerson;
Розглянемо інший приклад, де ілюструється використання вкладених записів. Нехай прямокутник визначається координатами точки, що є його лівим верхнім кутом, шириною, висотою і кольором ліній. На Турбо Паскалі ці відомості можна об'єднати в такий запис:
type tPoint = record
x,y: integer;
end;
tRectangle = record
LeftTop: tPoint;
Width, Height: integer;
Color: integer;
end;
Для такого запису можна застосовувати ще одну форму оператора with, що може «приєднувати» кілька імен записів, наприклад:
var rect: tRect;
with rect, LeftTop do begin
x:=100;
y:=150;
Color:=11;
...
end;
Без використання with з'явилися б вирази виду rect.Color, rect.LeftTop.x, rect.LeftTop.y і т.п.
Покажемо тепер, як можна використовувати масиви усередині записів. Припустимо, що потрібно зберігати інформацію вже не про прямокутник, а про довільний багатокутник. У цьому випадку буде потрібно задати кількість точок у ньому і список усіх цих точок, тобто масив. Потрібно передбачити можливість збереження відомостей про багатокутники з різним числом вершин, тому зробимо масив досить великим, а реальне число вершин будемо зберігати в окремому полі запису. Усе це буде виглядати так:
const MaxVertex = 200;
type tPolygon = record
size: integer;
V: array [1..MaxVertex] of tPoint;
Color: tColor;
end;
Існує різновид записів, що містить так називану варіантну частину. Для кращого розуміння розглянемо їх на прикладі. Нехай запис повинний зберігати повну інформацію про геометричну фігуру: колір, положення і розміри (для окружності — координати центра і радіус, для прямокутника — координати лівої верхньої і правий нижньої вершин, для квадрата — координати лівої верхньої вершини і довжина сторони). У принципі, можна було б включити в запис усі перераховані вище поля, але в такому випадку більшість з них часто залишалися б незайнятими, тому зручніше буде таке рішення:
type tFKind = (fCir,fRect,fSqr);
tFigure = record
Color: integer;
case kind: tFKind of
fCir: (Center: tPoint; r: integer);
fRect: (LeftTop,RightBottom: tPoint);
fSqr: (LT: tPoint; size: integer);
end;
У цьому записі мається одне звичайне поле (Color), а інші 6 і являють собою варіантну частину. Для кола в ній є поля Center і r, для прямокутника — LeftTop і RightBottom, для квадрата — LT і size. Фраза kind: tFKind не є обов'язкової, вона служить для розуміння того, які поля до яких фігур відносяться. Можна написати просто case integer of ... і нумерувати варіанти цілими числами. Помітимо також, що в оголошенні нашого запису немає слова end, що відноситься до case.
З малюнка видно, що варіантна частина зберігається в одній частині пам'яті, тобто поля можуть накладатися один на одного.