Файл: ОП Конспект лекций - Паскаль.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 28.06.2020

Просмотров: 1686

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Тема 13: Складні типи. Масиви

Тема 14: Багатомірні масиви

Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування

Тема 16: Динамічна пам'ять. Адреси і покажчики

Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті

Тема 18: Процедури та функції для роботи з динамічною пам’яттю

Тема 19: Символьний тип даних. Упаковані масиви

Тема 20: Процедури та функції для обробки рядків

Тема 21: Структурований тип даних - безліч

Тема 22: Структурований тип даних – записи

Тема 23: Опис файлових змінних. Обробка типізованих файлів

Тема 24: Послідовний та прямий доступ до файлів

Тема 25: Обробка не типізованих файлів

Тема 26: Робота з текстовими файлами

Тема 27: Типізовані константи

Тема 28: Поняття та робота з процедурами та функціями

Тема 29: Використання модуля CRT. Програмування клавіатури

Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора

Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph

PointType = record

Тема 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.


Питання для контролю:

  1. Доступ до графічних процедур і функцій.

  2. Ініціалізація графіки і перехід у графічний режим.

  3. Автовизначення графічного режиму.

  4. Визначення і видача помилок при ініціалізації графіки.

  5. Виведення тексту в графічному режимі.

  6. Виведення числа в графічному режимі.

  7. Система координат і визначення максимальної кількості по осях.

  8. Очищення графічного екрана.

  9. Визначення поточного положення покажчика і його переміщення.

  10. Виведення крапки заданого кольору.

  11. Побудова ліній.

  12. Зображення окружності, дуги, дуги еліпса й еліпса.

  13. Зображення прямокутника.

  14. Зображення заштрихованого за шаблоном прямокутника.

  15. Зображення паралелепіпеда з заштрихованою лицьовою стороною.

  16. Завдання кольору ліній, тексту і фону в графічному режимі.

  17. Зображення ламаних ліній, що задаються крапками зламу.

  18. Штрихування геометричних фігур заданим стилем.

  19. Зображення заштрихованого еліпса.

  20. Завдання зразка штрихування.

  21. Визначення розміру зображення.

  22. Виділення буферу в області динамічної пам'яті для збереження зображення.

  23. Переміщення зображення у виділений буфер динамічної пам'яті.

  24. Виведення на екран збереженого в буфері зображення.

  25. Операції одержання зображення, що рухається.


Тема 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;