СОДЕРЖАНИЕ
Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування
Тема 16: Динамічна пам'ять. Адреси і покажчики
Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті
Тема 18: Процедури та функції для роботи з динамічною пам’яттю
Тема 19: Символьний тип даних. Упаковані масиви
Тема 20: Процедури та функції для обробки рядків
Тема 21: Структурований тип даних - безліч
Тема 22: Структурований тип даних – записи
Тема 23: Опис файлових змінних. Обробка типізованих файлів
Тема 24: Послідовний та прямий доступ до файлів
Тема 25: Обробка не типізованих файлів
Тема 26: Робота з текстовими файлами
Тема 28: Поняття та робота з процедурами та функціями
Тема 29: Використання модуля CRT. Програмування клавіатури
Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора
Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph
Тема 32: Бібліотечні модулі користувача
Тема 33: Основні принципи ООП. Створення об’єктів. Використання об’єктів
Основні алгоритми обробки масивів
При роботі з ТР у розпорядженні користувача є наступні стандартні модулі:
|
System
Dos Crt Printer Pverlay |
-містить опис убудованих процедур і функцій ТР (підключається автоматично) -містить процедури і функції відповідні командам Dos -містить процедури і функції, що дозволяють керувати екраном і клавіатурою. -зв'язує текстовий файл із файловою змінною Lst і портом Lpt1; -дозволяє організувати оверлейну структуру програм (перекриття в пам'яті); |
|
Модулі окремих файлів з расширением.tpu |
|
|
Graph.tpu Graph3.tpu |
- містить опис процедур і функцій, використовуваних у графічному режимі; - забезпечує сумісність з 3-й версією ТР |
Модуль Crt і його застосування. Для використання модуля в програмі варто підключити його в розділі Uses:
uses crt;
Після завантаження модуль знаходиться в ОЗУ.
Керування клавіатурою.
Функція keyPressed : boolean повертає True, якщо була натиснута клавіша, і False, якщо буфер клавіатури порожній.
Функція ReadKey : char зчитує код натиснутої клавіші.
Приклади програм.
{Використання функції KeyPressed}
uses crt;
var сh : char;
procedure TestKey(var ch : char);
procedure If_Pressed;
begin
gotoXY(1, Where);
ClrEoL;
Write(‘Клавіша натиснута!');
delay(500); gotoXY(1, Where);
ClrEoL; {очищення рядка}
ch := ReadKey;
if ch = #0 then ch := ReadKey;
end;
begin {TestKey}
ch := #25;
if KeyPressed then If_Pressed
end;
begin {головна програма}
ClrScr; writeln(‘Для закінчення - кл. Esc’);
repeat
TestKey(ch)
until ch = #27;
end.
{Використання процедури ReadKey. Визначення спеціальних символів}
uses crt;
var сh : char;
procedure GetKey(var ch:char);
begin
ch := ReadKey; {прийом першого символу}
gotoXY(1, Where);
ClrEol;
if ch = #0 then {якщо #0 то спецклавіша}
begin
write(‘Спецклавіша’);
ch := ReadKey;
end else write(‘звичайна клавіша: ’,ch);
end;
begin
ClrScr;
writeln(‘Для закінчення - кл. Esc’);
repeat
getkey (ch)
until ch = #27;
end.
Питання для контролю:
Назвіть стандартні модулі ТР. Підключення модулів у програмі.
Модуль Crt, керування клавіатурою.
Установка текстового режиму.
Процедура
TextMode (Mode:word) установлює текстовий режим
виведення інформації. Параметр Mode
задається ім'ям константи чи номером
режиму
(табл. 30.1):
Таблиця 30.1. Текстові режими виведення інформації.
|
Ім'я константи |
Номер режиму |
Екран |
Монітор |
|
bw40 co40 bw80 co80 mono font8x8
|
0 1 2 3 7 256 |
40x25 40x25 80x25 80x25 80x25 80/40x43 80/40x50 |
Ч/б, CGA, EGA Кольор., CGA, EGA Ч/б, CGA, EGA Кольор., CGA, EGA MDA, Hereales Кольор., EGA Кольор., VGA |
Константа Font8x8 самостійно не застосовується і повинна додаватися до інших констант, наприклад:
TextMode(co80+font8x8); - установлюється режим со80, але кількість рядків не 25, а 43 чи 50.
Установка кольору та фону.
Процедура TextColor установлює колір символів. Колір задається назвою чи номером (табл. 30.2).
Таблиця 30.2. Номери та назви кольорів
|
Номер та назва кольору |
Колір |
Номер та назва кольору |
Колір |
|
0(Black) 1(Blue) 2(Green) 3(Cyan) 4(Red) 5(Magenta) 6(Brown) 7(LightGray) |
-чорний -синій -зелений -блакитний -червоний -фіолетовий -коричневий -сірий
|
8(DarkGray) 9(LightBlue) 10(LightGreen) 11(LightCyan) 12(LightRed) 13(LightMagenta) 14(Yellow) 15(White) 128(Blink) |
-темно-сірий -світло-сірий -світло-зелений -світло-блакитний -світло-червоний -світло-фіолетовий -жовтий -білий -мерехтіння |
Мерехтіння задається додаванням до кольору константи Blink:
TextColor(Blue+Blink);
Змінна TextAttr використовується для керування кольором символів, фону, режимом мерехтіння і застосовується за формулою:
TextAttr := колір _символу + 16*колір_фону [ + мерехтіння];
Колір символу = 0...15; колір фону = 0..7; мерехтіння = 128.
Змінна має тип byte, і біти в байті несуть наступну інформацію:
0 - синій компонент кольору символів;
1 - зелений компонент кольору символів;
2 - червоний компонент кольору символів;
3 - яскравість символів(1 - є, 0 - немає);
4 - синій компонент кольору фону;
5 - зелений компонент кольору фону;
6 - червоний компонент кольору фону;
7 - мерехтіння(1- є, 0 - немає).
Процедура TextBackGround (Color byte) установлює колір фону color=0..7.
Керування рядками.
Процедура ClrScr очищає екран чи поточне вікно і поміщає курсор у лівий верхній кут.
Процедура ClrEoL стирає всі символи в рядку, починаючи з поточної позиції курсору до кінця рядка.
Процедура DelLine видаляє рядок, у якому розташований курсор, при цьому нижчестоящі рядки переміщаються нагору на одну позицію.
Установка яскравості символів.
Процедура HighVideo установлює режим максимальної яскравості.
Процедура LowVideo скасовує максимальну яскравість і встановлює нормальний режим яскравості.
Процедура NormVideo відновлює той режим (колір символів, фон, мерехтіння), що був напочатку роботи програми.
Керування курсором.
Процедура GotoXY(x, y:byte) встановлює курсор у позицію X (стовпець) і Y (рядок) щодо поточного вікна.
Функції WhereX:byte і WhereY:byte визначає координати Х та Y місця розташування курсору.
Текстове вікно.
Процедура Window (x1,y1,x2,y2:byte) формує вікно і задається координатами x1, y1 - лівим верхнім і x2, y2 - правим нижнім кутом вікна. Після виконання Window вікно стає поточним.
Керування звуком.
Процедура Sound (Hz : word) включає динамік і генерує звук з частотою Hz.
Процедура NoSound скасовує Sound. Ця процедура обов'язково повинна бути після виконання процедури Sound, інакше динамік буде звучати і після виконання програми.
Процедура Delay (t:Word) виконує затримку часу t у мілісекундах (1000млск. = 1сек.).
Приклади програм.
{Використання процедур TextMode, TextColor, Window, TextBackGround, GotoXY, ClrScr, функції Delay}
uses crt;
var i:byte;
begin
TextMode(c80+Font8x8);
Window(30, 10, 50, 15);
for i := 0 to 7 do begin
TextBackGround(i);
ClrScr;
TextColor(i+1);
GotoXY(3,3);
writeln(‘Тло = ‘,i,’, колір =’,i+1);
delay(2000);
end;
end.
{Використання процедур InsLine, DelLine}
uses crt;
var i : byte;
begin
TextMode(co80);{режим CGA 80/25}
ClrScr;
writeln(‘Натисніть клавішу для переміщення ‘,
’рядка вниз.’);
ReadKey;
write(‘Переміщуваний рядок’);
for i := 2 to 24 do begin
InsLine;
{переміщення рядка вниз додаванням
порожнього}
{рядка
в позицію курсору}
delay(100);
end;
gotoXY(1,1);
writeln(‘Натисніть клавішу для переміщення’,
’рядка нагору.’);
ReadKey;
for i:=2 to 24 do begin
DelLine;{переміщення
рядка нагору видаленням рядка в}
{поточній позиції курсору}
delay(100);
end;
delay(100);
end.
{Використання змінної TextAttr}
uses crt;
var i : byte;
begin
TextBackGround(Black);
ClrScr;
for i := 0 to 7 do begin
TextAttr := i + 8 + 16*i; {установка кольору фону і символів}
Writeln(‘Номер кольору фону:’,i,’,номер кольору символів: ’,i+8);
TextAttr := i + 8 + 16*i +
Blink; {установка тих же кольорів, але з}
{мерехтінням}
Write(‘Те ж саме, але з мерехтінням’);
Readkey;
gotoXY(1,WhereY-1);
end;
end.
{Використання підвищеної і нормальної яскравості}
uses crt;
begin
ClrScr;
writeln(‘Початкова яскравість (фон чорний)’);
TextBackGround(Blue);
HighVideo; {включення високої яскравості}
Writeln(‘Включена висока яскравість (фон синій)’);
LowVideo; {вимикання високої яскравості}
TextBackGround(Brown);
Writeln(‘Виключена висока яскравість (фон коричневий)’);
NormVideo; {відновлення
режиму до моменту початку роботи}
{програми}
Writeln(‘Відновлені початкова яскравість і фон‘);
ReadKey;
end.
{Генерація музичної гами}
uses crt;
const
nota : array[0..7] of word = (262,294,330,349,392,440,494,524);
var i : byte;
begin
ClrScr;
TextBackGround(Blue);
GotoXY(30,2); write(‘Звучить гама:’);
repeat
for i := 0 to 7 do begin
Sound(nota[i]);{звук включений}
Delay(500);
NoSound;{ звук виключений}
end
until KeyPressed;
end.
Питання для контролю:
Модуль Crt, установка текстового режиму.
Модуль Crt, установка кольору символів, фону, режиму.
Модуль Crt, керування рядками.
Модуль Crt, установка яскравості символів.
Модуль Crt, керування курсором.
Модуль Crt, текстове вікно.
Модуль Crt, керування звуком.
Для одержання доступу до графічних процедур і функцій потрібно в розділі Uses підключити модуль Graph. Часто в роботі з графікою необхідні засоби модуля Crt, тому підключаємо і його:
uses crt, graph;
Файли типу .bgi дозволяють настроїтися на конкретний графічний адаптер: CGA, EGA, VGA.
Для ініціалізації графіки і переходу в графічний режим використовується процедура
InitGraph(var GraphDriver : integer; var GraphMode : integer; Path : string);
де змінна GraphDriver задає тип драйвера, що підключається, наприклад:
GraphDriver := EGA;
(можна задати цифрою 3)
Приведемо найбільш розповсюджені драйвери (табл. 31.1).
Таблиця 31.1. Драйвери
|
Драйвер |
Режим |
Розмір |
Файл |
|
CGA (1) |
CGACO, CGAHi |
320x200 (640x200) |
cga.bgi |
|
EGA (3) |
EGALo, EGAHi |
640x200 (640x350) |
egavga.bgi |
|
VGA (9) |
VGALo, VGAHi |
640x200 (640x350) |
egavga.bgi |
Змінна GraphMode задає режим графіки, наприклад:
GraphMode := EGAHi;
у параметрі Path указується шлях до каталогу в якому містяться bgi-файл. У нас на комп'ютерах ці файли розташовані в каталозі
С:\ТР\BGI;
Для автовизначення графічного режиму потрібно змінній GraphDrive привласнити значення константи Detect, наприклад:
GraphDriver:=Detect;
Приклад.
uses Graph;
var Gm, Gd : integer; {драйвер і режим}
begin
Gd := Detect; {режим автовизначення}
InitGraph(Gd, Gm, 'c:\tp\bgi'); {ініціалізація графіки}
Для визначення помилок при ініціалізації графіки використовується функція GraphResult. Якщо після ініціалізації графіки її значення дорівнює 0, то помилок немає, інакше - є. Для видачі повідомлення про тип помилки використовується функція GraphErrorMsg, що перетворює результат функції GraphResult у повідомлення, виведене на екран процедурою Write. Функція має вигляд:
GraphErrorMsg(ErrorCode);
Приклад видачі повідомлення про помилки.
uses Graph;
var Gm, Gd : integer;
ErrorCode : integer; {зберігає номер помилки}
begin
Gd := Detect;
InitGraph(Gd,Gm,'c:\tp\bgi');
ErrorCode := GraphResult; {збереження результ. ініціал.}
if ErrorCode <> 0 then begin
writeln('Помилка графіки: ',GraphErrorMsg(ErrorCode));
Halt(1);
end;
. . .
Процедура CloseGraph застосовується, коли графічна програма завершує свою роботу чи коли потрібно вийти з графічного режиму в текстовий.
Виведення тексту в графічному режимі.
Зображення звичайно супроводжують різними поясненнями. Для виведення тексту використовують процедуру OutTextXY(x,y,text), де х, у - координати точки початку виведення тексту, text - константа чи змінна типу string. Процедура OutText(text) виводить текст, починаючи з поточного положення покажчика.
Для визначення типу шрифту, його напрямку і розміру, використовується процедура
SetTextStyle(font, direction, charsize);
де константа font задає шрифт і вибирається з таблиці 31.2.
Таблиця 31.2. Список констант для визначення шрифту.
|
Ім'я константи |
Номер |
Шрифт і файл, де він зберігається |
|
DefaultFont |
0 |
Матричний 8х8 (Graph.tru) |
|
TriplexFont |
1 |
Напівжирний (trip.chr) |
|
SmallFont |
2 |
Тонкий (ntt.chr) |
|
SansSerifFont |
3 |
Рубаний (sans.chr) |
|
GothicFont |
4 |
Готичний (goth.chr) |
За замовчуванням задається шрифт №0.
Константа direction задає напрямок виводимих символів:
0 - горизонтальне;
1 - вертикальне (знизу нагору),
константа charsize задає розмір символів від 1 до 10.
Приклад. Демонстрація шрифтів.
uses Graph, Crt;
var
gd, gm : integer; i : word;
begin
gd := Detect;
InitGraph(gd, gm, ‘c:\tp\bgi’);
if GraphResult<>0 then Halt(1);
SetColor(2);
SetTextStyle(0,0,2);
OutTextXY(75, 10, ‘П Р И К Л А Д И Ш Р И Ф Т І В’);
SetColor(3); SetTextStyle(0,0,1);
OutTextXY(120,140,
‘DefaultFont. Матричний шрифт 8х8 (за ‘,
‘замовченням)’);
SetColor(4); SetTextStyle(1,0,1);
OutTextXY(160,70,’TriplexFont(SetTextStyle(1,0,1))’);
SetColor(5); SetTextStyle(2,0,5);
OutTextXY(160,110, ‘SmallFont (SetTextStyle(2,0,5))’);
SetColor(6); SetTextStyle(3,0,1);
OutTextXY(160,130, ‘SansSerifFont(SetTextStyle(3,0,1))’);
SetColor(7); SetTextStyle(4,0,4);
OutTextXY(80,170, ‘GothicFont (SetTextStyle(4,0,4))’);
SetColor(15); SetTextStyle(0,1,1);
OutTextXY(300,250, 'Вертикальне виведення');
ReadKey:
CloseGraph;
end.
Для виведення числа потрібно його перетворити процедурою Str у рядок, а потім операцією “+” підключити його до рядку, що виводиться OutTextXY.
Наприклад:
. . .
max := 2.14;
str(max : 4:2,smax); {результат перетворення в smax}
OutTextXY(400,40 ‘Максимум = ‘+smax);
. . .
Можливості Graph
У графічному режимі є невидимий поточний покажчик СР (current pointer), що виконує ті ж функції, що і курсор у текстовому режимі. Система координат починається з верхнього лівого кута (координати 0,0). Значення Х збільшується зліва направо, а Y - зверху вниз. Екран представляється у вигляді прямокутного масиву адресуємих точок. Кількість точок по горизонталі і вертикалі різне для різних адаптерів. Максимальне значення координат можна визначити функціями
GetMax:integer і GetMax:integer.
Процедура ClearDevice очищає екран і поміщає СР у точку (0,0).
Для переміщення СР використовуються процедури:
MoveTo(x,y:integer) - переміщає поточний СР у точку X,Y;
MoveRel(dx,dy:integer) - переміщає СР на dX і dY точок щодо поточного СР.
Функції GetX:integer і GetY:integer дають поточне положення СР.
Процедура PutPixel(x,y,color) виводить крапку в X,Y кольором color.
Функція GetPixel(x,y) повертає номер кольору пикселя в X,Y.
Процедура Line(x1,y1,x2,y2:integer) виводить лінію (X1,Y1 - початок лінії, x2,y2 - кінець лінії; РС у точці x2,y2).
Процедура LineTo(x,y) з'єднує крапку РС із крапкою X,Y і РС переходить у X,Y.
Процедура LineRel(dx,dy) зміщає РС у крапку X+dX, Y+dY і малює лінію (x,y,x+dx,y+dy).
Можна змінювати стиль зображуваних ліній використовуючи процедуру:
SetLineStyle(вид, зразок, товщина);
де параметр “вид” дозволяє задати лінію або 4-х стандартних типів, або за своїм зразком.
0 - безперервна лінія;
1 - крапкова;
2 - штрих-пунктирна;
3 - штрихова;
4 - дозволяє задати вид лини користувача. Для цього призначений параметр “зразок”:word, 2 байти якого задають тип лінії; параметр “товщина” задає товщину лінії в пикселях (1 - нормальна товщина, 3 - велика товщина).
Приклад. Побудова ліній користувача.
uses Graph, Crt;
var
gd, gm : integer; x1,x2,y1,y2: word; ch : char;
begin
gd := Detect;
InitGraph(gd,dm,'c:\tp\bgi');
if GraphResult <> 0 then Halt(1);
Randomize;
repeat
ClearDevice;
OutTextXY(200,10,’Випадкові лінії користувача’);
OutTextXY(140,20,’Зміна лінії - будь-яка клавіша, Esc-вихід');