ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 28.06.2020
Просмотров: 1686
Скачиваний: 3
СОДЕРЖАНИЕ
Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування
Тема 16: Динамічна пам'ять. Адреси і покажчики
Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті
Тема 18: Процедури та функції для роботи з динамічною пам’яттю
Тема 19: Символьний тип даних. Упаковані масиви
Тема 20: Процедури та функції для обробки рядків
Тема 21: Структурований тип даних - безліч
Тема 22: Структурований тип даних – записи
Тема 23: Опис файлових змінних. Обробка типізованих файлів
Тема 24: Послідовний та прямий доступ до файлів
Тема 25: Обробка не типізованих файлів
Тема 26: Робота з текстовими файлами
Тема 28: Поняття та робота з процедурами та функціями
Тема 29: Використання модуля CRT. Програмування клавіатури
Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора
Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph
Тема 32: Бібліотечні модулі користувача
Тема 33: Основні принципи ООП. Створення об’єктів. Використання об’єктів
Основні алгоритми обробки масивів
SetLineStyle(4,Random(65535),1);
Line(10,100,GetMaxX,100);
ch := ReadKey;
until ch = #27;
CloseGraph;
end.
Зображення окружності, дуги еліпса й еліпса будується за допомогою наступних процедур:
окружність Circle(x, y, R);
дуга Arc(x, y, нач.знач.кута, кінц.знач.кута, R);
дуга еліпса й еліпс Ellipse(x, y, нач.знач.кута, кінц.знач.кута, Rx, Ry);
Розбивка окружності на сектори:
PieSlice(x, y, нач.знач.кута, кінц.знач.кута, R);
де X,Y:integer - центр окружності, чи дуги еліпса; “нач.знач.кута” і “кінц.знач.кута” – початковий і кінцевий кути в градусах, відлічувані від горизонтальної осі проти годинникової стрілки; R:word - радіус окружності чи дуги, Rx і Ry - півосі. Еліпс зображується при “нач.знач.кута”=0, ”кінц.знач.кута”=360.
Приклад побудови дуги, еліпса й окружності.
uses Graph,Crt:
var
gd, gm : integer; x,y :word;
begin
gd := Detect;
InitGraph(gd, gm, ’c:\tp\bgi’);
if GraphResult<>0 then Halt(1);
x := GetMax div 2; {координати центра}
y := GetMax div 2; {фігур}
SetColor(2);
OutTextXY(230,10,’Побудова окружності’);
Circle(x,y,150);
ReadKey; ClearDevice;
OutTextXY(240,10,’Побудова еліпса’);
Ellipse(x,y,0,360,180,120);
ReadKey; ClearDevice;
OutTextXY(200,10,’Побудова еліптичної дуги’);
Ellipse(x,y,0,180,180,120);
ReadKey; ClearDevice;
OutTextXY(250,10,’Побудова дуги’);
Arc(x,y,0,180,GetMaxY div 3);
ReadKey;
CloseGraph;
end.
Зображення прямокутника (внутрішня область збігається з кольором з фону):
процедура Rectangle(x1,y1,x2,y2:integer), де X1,Y1 і X2,Y2 відповідно координати лівого верхнього і нижнього правого кута.
Зображення заштрихованого за шаблоном прямокутника:
процедура Bar(x1,y1,x2,y2:integer), де X1,Y1 і X2,Y2 - координати діагоналі.
Зображення паралелепіпеда, лицьова сторона якого заштрихована за поточним шаблоном, а глибина задається:
процедура Bar(x1,y1,x2,y2:integer,d3:word,top:boolean), де X1,Y1 і X2,Y2 - координати діагоналі передньої грані, d3 - глибина в пикселях, top - задає режим відображення верхньої площини: True - відображати, False - не відображати. Для цієї процедури в Graph визначені дві константи:
TopOn = true; {верхня площина відображається}
TopOff = false; {верхня площина не відображається}
{Приклад побудови прямокутника, паралелепіпеда без верхньої площини і з верхньою площиною}
uses Graph,Crt;
var
gd, gm : integer; x1, x2, y1, y2 : word;
begin
gd := Detect;
InitGraf(gd,gm,’c:\tp\bgi’);
if GraphResult<>0 then Halt(1);
{координати вершин прямокутника по діагоналі}
x1 := GetMaxX div 4;
y1 := GetMaxY div 4;
x2 := 2*GetMaxX div 3;
y2:=GetMax div 5;
OutTextXY(210,50,’Звичайний прямокутник’);
OutTextXY(190,60,’(Продовження – будь-яка кл.)’);
Rectangle(x1,y1,x2,y2);
ReadKey; {в цьому випадку використовуємо як процедуру}
ClearDeviсe;
OutTextXY(210,50,’Залитий прямокутник’);
OutTextXY(190,60,’(Продовження – будь-яка кл.)’);
Bar(x1,y1,x2,y2);
ReadKey; ClearDevice;
OutTextXY(200,10,’Паралелепіпед без верхньої площини’);
OutTextXY(240,20,’(Продовження – будь-яка кл.)’);
Bar3D(x1,y1,x2,y2,(x2-x1) div 4, TopOff);
ReadKey; ClearDevice;
OutTextXY(200,10,’Паралелепіпед з верхньою площиною’);
OutTextXY(250,20,’(Вихід – будь-яка кл.)’);
Bar3D(x1,y1,x2,y2,(x2-x1) div 4, TopOn);
ReadKey;
CloseGraph;
end.
Завдання кольору ліній і тексту SetColor(color);
Завдання кольору фону SetBkColor(color);
Приклад керування кольором букв і фону.
uses Graph,Crt;
var
gd, gm : integer; ch : char; i : word;
begin
gd := Detect;
if GraphResults<>0 then Halt(1);
Randomize;
repeat
SetBkColor(i); SetColor(Random(GetMaxColor));
OutTextXY(190,10,’Послідовний перебір кольору фону’);
OutTextXY(210,20,’(Вибір кольору букв - випадковий)’);
OutTextXY(180,30,’(Продовження – будь-яка кл., вихід - Esc)’);
if i < GetMaxColor then inc(i)
else i := 0;
until ch = #27;
CloseGraph;
end.
Для зображення ламаних ліній, що задаються крапками зламу, використовується процедура
DrawPoly(кількість, координати);
Де ”кількість” - кількість крапок зламу, ”координати” - їхні координати. Координати задаються у виді масиву, кількість компонентів якого дорівнює кількості крапок зламу, а кожен компонент типу запис:
PointType=record
x, y : integer;{координати крапок}
end;
Процедура DrawPoly малює ламану лінію. Для одержання багатокутника потрібно першу та останню крапку зламу з'єднати.
Приклад побудови випадкових багатокутників.
uses Graph, Crt;
type
PointType = record
x,y : integer; {координати крапок}
end;
var
gd, gm : integer; i : byte; ch : char;
points : array[1..6] of pointtype; {масив вершин}
begin
gd := Detect;
InitGraph(gd,gm,’c:\tp\bgi’);
if GraphResults <> 0 then Halt(1);
Randomize;
SetColor(2);
OutTextXY(140,10,’Побудова випадкових кольорових багатокутників’);
SetColor(4);
OutTextXY(100,20,’(Для продовження – будь-яка кл., вихід - Esc)’);
ch := ReadKey;
if ch = #27 then begin
ClearDevice; Halt;
end;
repeat
ClearDevice;
for i := 1 to 6 do begin
{визначення випадкових координат}
points[i].x := Random(GetMaxX);
points[i].y := Random(GetMaxY);
end;
{для одержання багатокутника з'єднуємо}
{координати першої та останньої вершини}
points[6].x := points[1].x;
points[6].y := points[1].y;
SetColor(Random (15)+1);{вибір випадкового кольору}
DrawPoly(6, points); {будуємо багатокутник}
сh := ReadKey;
until ch = #27;
CloseGraph;
end.
Модуль Graph. Штрихування геометричних фігур.
Процедура для штрихування заданим стилем:
FloodFill(x,y, колір контуру);
де (x,y) - координати точки усередині замкнутого контуру чи поза ним. Штрихування складних геометричних фігур, що задаються координатами в масиві:
FillPoly(кількість, координати);
де ”кількість” - кількість крапок зламу, ”координати” - їхні координати. Координати задаються так само як у процедурі DrawPoly, але зв'язувати першу та останню вершини не потрібно, тому що процедура FillPoly малює замкнутий багатокутник, тобто перша та остання вершини з'єднуються відрізком.
Зображення заштрихованого еліпса:
FillEllipse(x,y,Rx,Ry);
де (x,y) - координати центра еліпса, Rx і Ry - півосі.
Завдання зразка штрихування:
SetFillStyle(тип штрихування, колір);
Тип штрихування обирається по таблиці 31.3.
Таблиця 31.3. Список констант для штрихування геометричних фігур.
Константа |
Тип штрихування |
Константа |
Тип штрихування |
0 |
Колір фону |
7 |
Клітка |
1 |
Поточний колір |
8 |
Коса рідка клітка |
2 |
------- |
9 |
Коса часта клітка |
3 |
//нормальна товщина |
10 |
Рідка крапка |
4 |
//подвоєна товщина |
11 |
Часта крапка |
5 |
\\подвоєна товщина |
12 |
Визначення користувачем |
6 |
\\нормальна товщина |
Приклад штрихування фігур.
uses Graph,Crt;
type PointType=record
x, y : integer;
end;
var
gd, gm : integer; i, x1, x2, y1, y2 : word;
points : array[1..4] of PointType;
begin
gd := Detect;
InitGraph(gd, gm, ’c:\tp\bgi’);
if GraphResults<>0 then Halt(1);
OutTextXY(240,10,’Кругова діаграма’);
SetColor(1); SetLineStyle(0,0,3); {стиль лінії}
SetFillStyle(10,2); {вибір стилю заповнення}
PieSlice(GetMaxX div 2, GetMaxY div 2, 47, GetMaxY div 3);
SetFillStyle(11,4);
PieSlice(GetMaxX div 2, GetMaxY div 2, 47, 170, GetMaxY div 3);
SetFillStyle(9,5);
PieSlice(GetMaxX div 2, GetMaxY div 2, 170, 210, GetMaxY div 3);
SetFillStyle(8,6);
PieSlice(GetMaxX div 2, GetMaxY div 2, 210, 260, GetMaxY div 3);
SetFillStyle(7,7);
PieSlice(GetMaxX div 2, GetMaxY div 2, 260, 360, GetMaxY div 3);
ReadKey; ClearDevice; SetColor(2);
OutTextXY(240,10,’Заповнення еліпса’);
SetFillStyle(1,8);
FillEllipse(GetMaxX div 2,GetMaxY div 2, 200, 150);
ReadKey; ClearDevice; SetColor(3);
OutTextXY(220,10,’Заповнення еліптичного сектора’);
SetFillStyle(6,4);
Sector(GetMaxX div 2,GetMaxY div 2, 45, 90, 200, 150);
ReadKey; ClearDevice;
OutTextXY(250, 10, ‘Заповнення граней паралелепіпеда’);
x1 := GetMaxX div 4;
y1 := GetMaxY div 3;
x2 := 3*GetMaxX div 4;
y2 := 2*GetMaxX div 3;
SetColor(2); SetFillStyle(2,4);
Bar3D(x1, y1, x2, y2, (x2-x1) div 4, TopOn);
SetFillStyle(6,3);
SetFillStyle(3,4);
FloodFill(x1+50,y1-10,2);
FloodFill(x2+10,y2-50,2);
ReadKey; ClearDevice;
OutTextXY(220, 10, ’Заповнення прямокутника’);
points[1].x := GetMaxX div 3;
points[2].x := 2*GetMaxX div 3;
points[3].x := 2*GetMaxX div 3;
points[4].x := GetMaxX div 3;
points[1].y := GetMaxY div 3;
points[2].y := GetMaxY div 3;
points[3].y := 3*GetMaxY div 3;
points[4].y := 3*GetMaxY div 3;
FillPoly(4, Points);
ReadKey;
CloseGraph
end.
Збереження і виведення зображень на екран. Одержання зображення, що рухається.
Модуль Graph дозволяє запам'ятовувати в буфері і відновлювати з нього фрагменти зображень на екрані. Зображення для збереження міститься в динамічну область пам'яті, розмір якої повинний відповідати розміру зображення в прямокутній області екрана в байтах.
Для обчислення розміру використовують функцію:
ImageSize(x1, y1, x2, y2:integer):word;
де X1,Y1 і Х2,Y2 - координати лівого верхнього і правого нижнього кутів прямокутника частини екрана, у якому розташоване зображення. Розмір зображення, що зберігається, не повинний бути більш 64 kb.
Для збереження зображення процедурою GetMem в області динамічної пам'яті виділяють буфер обчисленого розміру:
GetMem(p,Size);
де p - виділений буфер, Size - його розмір у байтах.
Зображення частини екрана міститься в буфер (р^) за допомогою процедури:
GetImage(x1, y1, x2, y2, p^);
де Х1, У1, Х2, У2 - координати фрагмента.
Процедура
PutImage(x, y, p^, вид);
виводить на екран раніше збережене в буфері (р^) зображення, де Х, У -координати лівого верхнього кута виведеного зображення;
параметр “вид”:word визначає яким чином виводиться зображення щодо наявного на екрані. Значення цього параметра наступні (задається ім'ям чи значенням):
NormalPut = 0 - очищується область і виводиться зображення;
XorPut = 1 - зображення затирається, а при повторному використанні виводиться в іншому (в заданому) місці;
OrPut = 2 - накладення зображення;
AndPut = 3 - перетинання двох зображень;
NotPut = 4 - зображення негативне.
Отже, одержання зображення, що рухається, зводиться до наступних – операцій (рис. 31.1).
Рисунок 31.1. Одержання зображення, що рухається
Size := ImageSize(x1,y1,x2,y2);- визначаємо розмір зображення в байтах;
GetMem(p,Size); - виділяємо область динамічної пам'яті для збереження зображення;
GetImage(x1,y1,x2,y2,p^); - поміщаємо зображення у виділену пам'ять (у р^);
PutImage(x1,y1,p^,1); - затираємо зображення;
PutImage(x2,y2,p^,1) - малюємо зображення в іншім місці.
Приклад руху фігури.
uses Graph, Crt;
var
gd, gm : integer;
Size : word; x1, y1, x2, y2 : word; p : pointer;
begin
gd := Detect;
InitGraph(gd, gm, ’c:\tp\bgi’);
if GraphResult <> 0 then Halt(1);
OutTextXY(120,1,’Одержання
зображення, що рухається,‘,
‘(натисни
будь-яку клавішу)’);
ReadKey;
{координати прямокутника}
x1 := GetMax div 300; y1 := GetMax div 200;
x2 := GetMax div 10; y2 := 2*GetMax div 10;
{малюємо прямокутник}
Rectagle(x1,y1,x2,y2);
Size := ImageSize(x1,y1,x2,y2);
GetMem(p,Size);
GetImage(x1,y1,x2,y2,p^);
{затираємо зображення}
PutImage(x1,y1,p^,XorPut);
{малюємо зображення в іншому місці}
PutImage(x2+500,y2+250,p^,1); {замість XorPut можна ставити 1}
ReadKey;
CloseGraph;
end.
Питання для контролю:
-
Доступ до графічних процедур і функцій.
-
Ініціалізація графіки і перехід у графічний режим.
-
Автовизначення графічного режиму.
-
Визначення і видача помилок при ініціалізації графіки.
-
Виведення тексту в графічному режимі.
-
Виведення числа в графічному режимі.
-
Система координат і визначення максимальної кількості по осях.
-
Очищення графічного екрана.
-
Визначення поточного положення покажчика і його переміщення.
-
Виведення крапки заданого кольору.
-
Побудова ліній.
-
Зображення окружності, дуги, дуги еліпса й еліпса.
-
Зображення прямокутника.
-
Зображення заштрихованого за шаблоном прямокутника.
-
Зображення паралелепіпеда з заштрихованою лицьовою стороною.
-
Завдання кольору ліній, тексту і фону в графічному режимі.
-
Зображення ламаних ліній, що задаються крапками зламу.
-
Штрихування геометричних фігур заданим стилем.
-
Зображення заштрихованого еліпса.
-
Завдання зразка штрихування.
-
Визначення розміру зображення.
-
Виділення буферу в області динамічної пам'яті для збереження зображення.
-
Переміщення зображення у виділений буфер динамічної пам'яті.
-
Виведення на екран збереженого в буфері зображення.
-
Операції одержання зображення, що рухається.
Тема 32: Бібліотечні модулі користувача
Крім убудованих стандартних модулів користувач може створювати власні бібліотечні модулі. Для цього, готові програми, оформлені у виді процедур і функцій, поєднують у модулі Unit, які можна підключати до розроблювальних програм.
Модуль Unit - це програмна одиниця, текст якої компілюється незалежно від головної програми. Структура модуля подібна до структури програми і може містити опис міток, констант, типів, змінних, процедур і функцій, що після підключення модуля стають доступними основній програмі чи іншому модулю.
Використання модулів дозволяє зняти обмеження в 64 kb на обсяг програми і даних, а також дозволяє автономно налагоджувати окремі фрагменти програмного проекту, підключаючи їх потім до основної програми.
Створення модуля вимагає визначеної організації з застосуванням слів Unit, Interface, Implementation, Begin, End.
Загальна структура модуля.
unit ім'я бібліотечного модуля;
{$N+} - директиви компілятора;
interface {интерфейсная секція}
uses - використовувані при оголошенні модулі;
label - оголошення глобальних міток;
const - оголошення глобальних констант;
type - оголошення глобальних типів;
var - оголошення глобальних змінних;
procedure - заголовки процедур із вказівкою параметрів;
function - заголовки функцій із вказівкою параметрів;
implementation {секція реалізації}
uses - використовувані при реалізації модулі;
label - оголошення локальних міток;
const - оголошення локальних констант;
type - оголошення локальних типів;
var - оголошення локальних змінних;
procedure - заголовки і тіло процедур;
function - заголовки і тіло функцій;
begin {ініціалізаційна частина}
оператори;
end.
Ім'я бібліотечного модуля повинне збігатися з ім'ям дискового файлу, де знаходиться вихідний текст модуля. Наприклад, якщо файл має ім'я My_Lib.pas, то модуль повинен бути
unit My_Lib;
Інтерфейсна секція може містити речення використання існуючих готових модулів. Потім описуються ті мітки, константи, типи, змінні, процедури і функції, що є глобальними, тобто доступними основній програмі чи модулю, що використовує даний модуль. При описі процедур і функцій указуються тільки їхні заголовки з параметрами без опису тіл. Інтерфейсна секція може бути порожньою.
У секції реалізації можуть підключатися модулі, а також міститися описи міток, констант, типів, змінних, процедур і функцій, що є локальними, тобто вони доступні тільки для даного модуля і недоступні основній програмі. Тут описуються тіла процедур і функцій, заголовки яких містилися в інтерфейсній секції, причому їхній порядок повинний збігатися. Заголовки процедур і функцій можна вказати повністю, у цьому випадку вони повинні точно збігатися з тими заголовками, що були в інтерфейсній секції, а можна вказувати коротко, тобто після слова procedure чи function указати тільки ім'я.
Наприклад:
. . .
interface
function fact(n : integer) : word;