- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови 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. Лінійний пошук у списку
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
2. Побудова елементарних зображень
Система координат при роботі з графікою має початок (точку (0,0)) у лівому верхньому куті екрана. Вісь x спрямована вправо, вісь y униз. Очевидно, що всі точки екрана мають цілочисельні додатні координати.
При побудові найпростіших елементів зображень використовуються наступні процедури і функції:
Назва |
Призначення |
PutPixel(x,y: integer; c: word); |
Поставити точку (x,y), використовуючи колір c. Значення кольору звичайно міняється від 0 до 15, замість номера кольору можна вживати колірні константи модуля Graph. |
SetColor(c: word); |
Установити поточний колір для малювання відрізків, окружностей і т.п. Усі лінії після вживання цього оператора будуть малюватися встановленим кольором. |
SetBkColor(c: word); |
Установити поточний колір для фону (тобто колір всього екрана). |
GetMax; GetMax; |
Ці функції повертають максимальні припустимі значення координат x і y, відповідно. |
Line(x1,y1,x2,y2: integer); |
Малювати відрізок з (x1,y1) у (x2,y2) поточним кольором. |
Rectangle(x1,y1,x2,y2: integer); |
Малює поточним кольором прямокутник, лівий кут якого – (x1,y1), а правий нижній – (x2,y2). |
Circle(x,y: integer; r: word); |
Малює поточним кольором коло з центром у точці (x,y) радіуса r. |
Arc (x,y: integer; a1,a2,r: word); |
Малює дугу кола a1 і a2 – початковий і кінцевий кути (у градусах), відповідно. Кут відраховується традиційно, проти годинникової стрілки, кут величиною 0 відповідає променю y=0, x>0. |
Ellipse(x,y: integer; a1,a2,xr,yr: word); |
Малює дугу еліпса з півосями xr і yr від кута a1 до a2. |
DrawPoly(n: word; P); |
Малює багатокутник, кількість сторін у якого – n, а інформація про вершини зберігається в нетипізованому параметрі P. У якості P зручніше за усе використовувати масив із записів, кожна з який містить поля x,y: integer; |
MoveTo(x,y: integer); |
Ця процедура спирається на поняття поточної позиції. Вона «запам'ятовує» позицію (x,y) на екрані, а надалі з цієї позиції можна малювати відрізки. |
LineTo(x,y: integer); |
Малює відрізок з поточної позиції в точку (x,y). При цьому поточна позиція переміщається в кінець намальованого відрізка. |
MoveRel(dx,dy: integer); |
Переміщає поточний покажчик з колишнього положення (x,y) у точку (x+dx,y+dy). |
LineRel(dx,dy: integer); |
Те ж, що і попередня процедура, але при переміщенні малює відрізок від (x,y) до (x+dx,y+dy). |
Get; Get; |
Повертають координати поточного покажчика (окремо). |
ClearDevice; |
Очищає екран. |
Усі приведені вище процедури для малювання виконують тільки контурні малюнки (не зафарбовуючи прямокутник, коло чи еліпс усередині). За замовчуванням малювання відбувається з використанням тонкої суцільної лінії, однак товщину і вид лінії можна змінювати за допомогою процедури SetLineStyle(style,pattern,width: word). Розглянемо призначення параметрів цієї процедури.
style ( вид лінії). Тут зручно задавати не конкретні числа, а константи: SolidLn, DottedLn, CenterLn, DashedLn, UserBitLn. Перша позначає суцільну лінію, три наступні – різні види переривчастих ліній, остання — лінію, вид якої визначається користувачем (див. нижче).
pattern – зразок для виду лінії, обумовленого користувачем. Цей параметр вступає в дію лише тоді, коли в попередньому зазначене UserBitLn. Зразок – це фрагмент лінії, заданий у виді числа. Перехід від конкретного фрагмента до числа виконується, наприклад, так:
Зручніше за все переводити отримане число в шістнадцятьковий вид, у нашому прикладі вийде $999C. При зображенні лінії закодований нами фрагмент буде повторюватися стільки разів, скільки потрібно.
width ( товщина лінії. Можна використовувати числа, однак визначені 2 константи: NormWidth і ThickWidth (нормальна і товста лінії).
Перейдемо тепер до малювання зафарбованих фігур. За замовчуванням внутрішня область фігури буде зафарбовуватися білим кольором, причому зафарбування буде суцільним. Для керування кольором і видом зафарбування використовується процедура SetFillStyle(style, color: word); Також як і для стилю лінії, для style передбачені константи: EmptyFill, SolidFill, LineFill, LtSlashFill, SlashFill, BkSlashFill, LtBkSlashFill, HatchFill, XHatchFill, InterleaveFill, WideDotFill, CloseDotFill, UserFill. Перша позначає відсутність зафарбування, друга — суцільне, наступні — різні специфічні види зафарбування, сама остання — афарбування, що задається користувачем. Щоб задати користувальницький зразок зафарбування, потрібно використовувати процедуру SetFillPattern(Pattern: FillPatternType; Color: Word); FillPatternType визначається як array[1..8] of byte, кожен елемент масиву кодує один рядок зразка зафарбування (як і для ліній), а всього таких рядків 8. У результаті зафарбування виконується за допомогою однакових квадратиків 8x8.
Нижче приводяться процедури малювання зафарбованих фігур.
Назва |
Призначення |
Bar(x1,y1,x2,y2: integer); |
Малює зафарбований прямокутник. |
FillEllipse(x,y: integer; xr,yr: word); |
Зафарбований еліпс. |
FillPoly(n: word; P); |
Зафарбований багатокутник. |
PieSlice(x,y: integer; a1,a2,r: word); |
Зафарбований круговий сектор. |
Sector (x,y: integer; a1,a2,xr,yr: word); |
Зафарбовує еліптичний сектор. |
FloodFill(x,y: integer; Cborder: word); |
Виливає фарбу в точку (х,у), звідки вона розтікається в усі сторони, поки не досягне границі кольору Cborder. Якщо такої границі немає чи вона незамкнута, то фарба може залити весь екран. |