Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posibnik_paskal.pdf
Скачиваний:
230
Добавлен:
11.02.2016
Размер:
2.43 Mб
Скачать

«Turbo Pascal »

Значенко О.П.

ТЕМА 12. КОМП'ЮТЕРНА ГРАФІКА

Засоби мови Паскаль дозволяють будувати зображення на екрані дисплея. Для цього використовується спеціальна бібліотека підпрограм, яка називається Graph. До неї входять графічні процедури і функції для побудови різних за формою фігур і ліній, а також засоби організації графічного режиму. Ці засоби призначені для аналізу можливостей використовуваного дисплея, розподілу поля екрана на різну кількість дрібних квадратиків, кожний з яких вважається окремою точкою зображення і називається пікселем. Для дисплея типу VGA кількість точок може бути 640x480, а кількість використовуваних кольорів - 16. Складніші засоби Паскаля дозволяють збільшити кількість кольорів до 256. Колір, як і координати екранної точки, задається цілим числом. Початок координат екрана знаходиться в лівому верхньому куті (точка (0,0)), вісь Ох - направлена вправо, Оу - вниз. Цю особливість направленості вісі Оу необхідно враховувати при побудові зображень, особливо графіків функцій і діаграм. Центру екрана відповідають координати (319. 239), права нижня точка (639,479).

Програми, що виконують графічні побудови переважно є лінійними і складаються з викликів стандартних графічних процедур та функцій зібраних у модулі Graf. Сам модуль може бути в бібліотеці Turbo.tpl або в деякому каталозі на диску. В останньому випадку модуль треба приєднати командою USES на початку програми.

Приклад підключення до програми модуля Graph

Program P1;

Uses Graph;

Begin

End.

Щоб графічні об’єкти могли виводитися на екран, необхідно перевести їх в графічний режим – ініціалізувати. Тобто запустити відповідний драйвер.

Ініціалізація графічного режиму відбувається викликом процедури

ІnitGraph

ІnitGraph (GraphDriver, GraphMode, DriverPath)

63

«Turbo Pascal »

Значенко О.П.

GraphDriver <номер драйвера> - цілочислова змінна, яка має номер необхідного драйвера у таблиці драйверів., якщо в якості змінної задати „0”, то драйвер буде визначено автоматично.

GraphMode <номер режиму> - цілочислова змінна, яка містить допустимий номер графічного режиму для даного графічного драйвера (для випадку 640-480-16 використовується „0”)

DriverPath <шлях до файлу драйвера> - параметр використовується для того щоб вказати розташування файлу драйверу так як графічні драйвери можуть знаходитися у будь-якому місці файлової системи. Якщо драйвер знаходиться в стандартному каталозі а ТР встановлено на диск С:\ то ‘C:\ВР\BGI’. Якщо файл драйвера знаходиться в одному каталозі з програмою яка розробляється, то в якості параметра використовується пустий рядок ‘ ‘.

Приклад Ініціалізації графічного режиму

Program P2;

Uses Graph;

Var GrDriver, GrMode: integer;

Begin

GrDriver:= Detect; {detect - стандартна стала, присвоює „0”}

GrMode:= 0;

ІnitGraph (GrDriver, GrMode, ‘ ‘ );

CloseGraph;

End.

Для закриття графічного режиму та відновлення текстового режима використовується процедура без параметрів CloseGraph. Таким чином рекомендується викликати дану процедуру у кінці програми коли графічний режим вже не буде використовуватися

Параметри графічних об’єктів

При побудові зображень також використовуються графічні об’єкти. Можна виділити такі групи: точки та лінії; замкнуті багатокутники та ізометричні проекції куба; коло; еліпс; дуга та сектор; текст; складні зображення.

64

«Turbo Pascal »

Значенко О.П.

Всі графічні об’єкти е плоскими, тобто існують у двовимірному просторі.

Таким чином кожна точка об’єкта має дві координати

- по горизонталі (х) и по

вертикалі (у). Конфігурація фігури задається опорними точками – точками, які однозначно визначають положення та форму фігури. Для побудов ряда фігур використовуються додаткові параметри. Так для побудови кола необхідно задати опорну точку – центр кола та додатковий параметр – радіус кола.

Візуальне представлення всіх об’єктів, крім тексту, визначається двома параметрами контуром та заливкою.

Контур характеризується трьома параметрами товщиною, стилем,

кольором.

Колір встановлюється процедурою:

SetColor (< номер кольору (0-15)>);

Товщина та стиль контуру встановлюється процедурою:

SetLineStyle (<стиль лінії>,<зразок стиля>,<товщина>);

де товщина контура (1-тонка лінія, 3-товста), стиль - порядок чередування штрихів (0-4), зразок – для визначення особливих стилів (при ігноруванні –„0”)

Заливка характеризується двома параметрами: стилем та кольором та встановлюється процедурою

SetFillStyle(<зразок стиля (0-12) >,<колір заливки (0-15)>);

Останньою характеристикою екрана в графічному режимі – є колір фону. Колір фону – область екрана на яку ще не виводилося зображення. Для зміни кольору фона використовується процедура:

SetBkColor(<номер кольору>);

Виведення точок та ліній

Точка. Кожне зображення можна будувати по точках, вказуючи для кожної точки її координати й колір. Для видачі точки на екран використовується процедура

PutPixel (<x>,< у>, <номер кольору>); де х, у— координати точки

65

«Turbo Pascal »

Значенко О.П.

За допомогою цього оператора можна побудувати графік функції.

Приклад програми виведення лінії з точок спочатку на чорному екрані потім на білому

Program P5;

Uses Graph, Crt;

Var GrDriver, GrMode: integer;

Begin

GrDriver:= Detect;

GrMode:= 0;

ІnitGraph (GrDriver, GrMode, ‘ ‘ );

PutPixel (50, 100, Red);

 

PutPixel (51, 100, Red);

 

PutPixel (52, 100, Red);

 

PutPixel (53, 100, Red);

 

PutPixel (54, 100, Red);

 

SetBkColor (White);

{зміна чорного фону на білий фон}

ReadKey;

{зупинка програми до натискання

клавіші}

 

CloseGraph;

 

End.

 

Робота з поточним вказівником

Після ініціалізації графічного режиму, поточний вказівник знаходиться в точці з координатами (0,0). Переміщення вказівника відбувається за допомогою процедур:

MoveTo (<горизонтальна координата х>,<вертикальна координата

у>)

MoveRel (<горизонтальне зміщення>,<вертикальне зміщення>)

При використанні процедури MoveRel параметри можуть бути від’ємними числами, що свідчить про зміщення вліво на кількість точок, яка рівна модулю значення, яке знаходиться в даному параметрі.

Приклад

MoveTo (100, 67);

MoveRel (-2, -3); {вказівник в точці (98,64)}

66

«Turbo Pascal » Значенко О.П.

Визначення координат поточного вказівника

Функції GetX, GetY повертають горизонтально та вертикальну координату. Обидві функції викликаються без параметрів

Приклад

X:=GetX; Y:=GetY;

Процедур малювання ліній

Переміщення поточного вказівника в точку, задану параметрами. Залишаючи за собою лінію здійснюється за допомогою процедури

LineTo(<x>,<y>)

LineRel(<горизонтальне зміщення>,<вертикальне зміщення>)

Процедура яка дозволяє вивести відрізок прямої за один виклик процедури має вигляд Line (<x1>,<y1>,<x2>,<y2>)

Для знищення всієї графічної інформації з екрану використовується процедура, без параметрів ClearDevice;

Виведення багатокутників

Побудувати будь-який багатокутник можливо за допомогою процедур MoveTo, MoveRel, Line, LineRel. Але багатокутники відносяться до фігур, яки будуються досить часто, тому існують процедури які спрощують їх виведення.

Виведення не зафарбованого прямокутника зі сторонами паралельними сторонам екрану (визначає розташування однієї з діагоналей прямокутника)

Rectangle (<x1>,<y1>,<x2>,<y2>)

Виведення зафарбованого прямокутника (колір заливки встановлюється процедурою SetFillStyle) Вar (<x1>,<y1>,<x2>,<y2>). Параметри даної процедури аналогічні параметрам процедури Rectangle. Вона заливає поточною заливкою прямокутну область, яка задається діагоналлю, але не має обводки (контура).

Малювання паралелепіпеда:

Вar3D (<x1>, <y1>, <x2>, <y2>, <глубина>, < виведення верхньої грані>)

Координати задають положення передньої грані паралелепіпеда на екрані,

глибина задає довжину бокової грані, необхідність виведення верхньої грані

67

«Turbo Pascal » Значенко О.П.

представляє собою логічний тип. (TopOn-виводити TopOff – не виводити).

Заливка замкнутих областей

Процедура FloodFill призначена для заливки довільної області поточним кольором. Область, яка заливається має бути замкнута та обмежена лінією одного кольору.

Для своєї роботи процедура вимагає координати точки, яка знаходиться в межах області, яку необхідно залити, то колір границі цієї області. Заливка області починається з цієї точки. В процесі заливки знищується вся інформація, яка знаходиться в області заливки.

FloodFill (<х>,<у>,<колір контура>)

Основними помилками при роботи з даною процедурою є:

1.Область не замкнута, як результат заливка займає наступну область, або весь екран.

2.Замкнута область побудована не суцільною лінією.

3.В якості початкової точки заливки вказана точка з кольором як і границя області. Процедура вважає, що область залита і припиняє роботу.

Виведення кривих ліній

Коло. Для виведення на екран кола використовується процедура Circle.

Circle (<x>,<y>,<r>) де r – радіус

Колір кола визначається поточним кольором контура, та задається процедурою SetColor, а товщина задається процедурою SetLineStyle, причому стиль лінії задати у багатокутників не можливо він завжди тільки суцільний.

Дуга.Процедура Arc виводить не повне коло а лише дугу задану початковим та кінцевим кутом.

Arc (<x1><y1><початковий кут><кінцевий кут><R>)

Для малювання дуги та сектора передбачено параметри [початковий кут], [кінцевий кут], що визначають відповідно кут початку та кут завершення дуги. Кути відраховуються від нульового кута, направленого по вісі ОХ проти годинникової стрілки.

68

«Turbo Pascal »

Значенко О.П.

Сектор

дуги. Для виведення сектора дуги передбачено процедуру

PieSlice, яка використовує поточні параметри заливки та контура.

PieSlice (<x1><y1><початковий кут><кінцевий кут><R>))

Зафарбований еліпс. Процедура FillEllipse призначена для виведення зафарбованого еліпса. Еліпс будується по опорній точці - центру еліпса, та двум радіусам – горизонтальному та вертикальному. Заливка внутрішньої області еліпса та товщина лінії контура визначається по поточним параметрам.

FillEllipse (<x1>,<y1>,< х-R >,<у - R>) Незафарбований еліпс. Процедура Ellipse аналогічна процедурі Arc

але на відміну від неї виводить не дугу кола а дугу еліпса.

Ellipse (<x1>,<y1>,<початковий кут>,<кінцевий кут>,< х-R >,<у - R>)

Еліптичний сектор. Процедура Sector аналогічна процедурі побудови сектора круга.

Sector (<x1>,<y1>,<початковий кут>,<кінцевий кут>< х-R >,<у - R>))

Приклад програми виведення 200 довільно розташованиз кіл різного радіуса.

Program g1; Uses graph,crt;

Var gd, gm,i,x,y,r:integer;

Begin gd:=0;

gm:=detect;

InitGraph(gd,gm,'');

SetBkColor(white);

Randomize;

For i:=1 to 200 do

Begin x:=random(640); y:=random(480); r:=random(100);

SetColor(random(15)); circle(x,y,r);

Delay(10000); { затримка на 10000 мс }

End;

ReadKey;

CloseGraph;

End.

69

«Turbo Pascal »

Значенко О.П.

Робота з текстом

Відображення тексту в графічному режимі має ряд відмінностей від текстового режиму. Основна відмінність полягає в тому що всі дії в графічному режимі виконуються тільки з рядковими константами та змінними. Вся числова інформація повинна попередньо перетворюватися у символьну. Друга відмінність

– це можливість використання різних шрифтів.

Спеціально для графічного режиму розроблено процедури, які забезпечують виведення повідомлень різними шрифтами у горизонтальному та вертикальному напрямках зі змінами розмірів у стандартних шрифтах. У шрифтах розроблених фірмою BORLAND відсутня кирилиця, але розроблено ряд шрифтів які дозволяють виводити повідомлення російською мовою.

Для виведення текстового рядка, який починається з поточної позиції курсору викликається процедура

OutText (<рядкова змінна>)

Рядок виводиться у відповідності із встановленим стилем та вирівнюванням. Якщо текст виходить за межі екрану, то у випадку стандартного шрифту він не виводиться, а при використанні штрихових шрифтів відсікається.

Для виведення рядка з визначеної позиції використовується процедура

OutTextXY (<x>, <y>, <рядкова змінна>)

Для виведення числової інформації в графічному режимі здійснюється перетворення числової інформації в символьну за допомогою функції

Str(x[:N[:M]], s)

X – числова змінна

S – рядкова змінна

m, n – формат представлення змінної

Для встановлення стилю текстового виведення на екран використовується процедура

SetTextStyle(<код шрифту>,<напрямок>,<розмір>)

Коди:

0- точковий шрифт (входить в модуль GRAPH використовується за замовчуванням)

70

«Turbo Pascal »

Значенко О.П.

Всі інші шрифти векторні, головна особливість - це легка зміна розміру без

втрати якості. Кожен шрифт зберігається

в окремому файлі з розширенням

*.CHR.

Щоб шрифт був доступний, відповідний файл повинен знаходитися в поточному каталозі

1 - потроєний шрифт

2 - зменшений шрифт

3 – прямий шрифт

4 – готичний шрифт

5 – рукописний

6 - одно штриховий

7 – наклонний та ін.

В якості напрямку використовуються константи модуля GRAPH

0 – зліва напрва

1 – знизу вверх.

Розмір приймає значення від 1 до 10 (точковий від 1 до 32). Якщо значення параметру рівне 0, то встановлюється розмір 1, якщо більше 10 то 10.

Створення рухомих зображень.

1 спосіб.

Намалювати об’єкт, та перемалювати його кольором фону в результаті чого зображення зникне. Після чого знову намалювати зображення змістивши його на декілька пікселів екрану. В результаті створюється ефект руху.

2 спосіб

Можна виділити наступні етапи побудови рухомого зображення:

1.Вивести зображення на екран.

2.За допомогою функції ImageSize обчислити розмір рухомого фрагменту.

3.Виділити участок оперативної пам’яті за допомогою процедури GetMem.

4.Записати у виділену область пам’яті необхідний фрагмент зображення за допомогою процедури GetImage.

5.Вивести зображення на екран за допомогою процедури PutImage з параметром Mode рівним XorPut що приведе до зникнення зображення.

6.Повторно вивести зображення на екран змістивши не декілька точок.

7.5 та 6 пункт повторити.

71

«Turbo Pascal »

Значенко О.П.

Побудова графіка функції.

Щоб побудувати графік функції y=f(x), необхідно спочатку вказати відрізок, на якому задана функція, і відобразити цей відрізок на вісь Ох екрана дисплея. Точці х відрізка [а, b] з області задання функції повинна відповідати точка х1 екрана дисплея, а точці у— f(x) (значенню функції) —точка у1 екрана. Таким чином, відбувається масштабування графіка, що дозволяє відображати на екран будь-який відрізок області задання функції. Тут необхідно враховувати роздільну здатність екрана і добирати масштаби так, щоб побачити поведінку функції. Точки на екрані, на відміну від точок геометричної прямої, мають дискретні значення. Точки осі Ох нумеруються від 0 до 639, тобто х1=0, 1, 2, 3, ..., 639.

З пропорції (х-а)/(b-а)=х/640 дістанемо розрахункову формулу для обчислення аргументу функції, що відповідає заданій точці екрана:

х = а + х1 (b - а)/хmax, де xmax = 640. Для одержаного значення аргументу обчислюється значення функції: у = f(х).

Тепер необхідно помножити одержане значення функції на коефіцієнт масштабування, який показує, скільки пікселів (фізичних точок екрана) міститься у вибраній одиниці масштабу: k = хmax /(b-a).

Використовуючи цей масштабний коефіцієнт, знаходимо значення координати у на екрані: у1 = у*хmax /(b — a).

Тепер слід врахувати особливість розташування осі Оу на екрані і «перевернути» графік з урахуванням традиційного положення осей координат, а також змістити графік так, щоб його зручно було аналізувати.

З одержаними координатами х1 і у1 точка виводиться на екран. Оскільки реальні координати графіка функції, із якими вона обчислюється, — дійсні числа, а координати точок екрана — цілі, то при обчисленні у1 необхідно округлювати отриманий результат до найближчого цілого числа. Округлення виконується за допомогою функції trunc, аргументом якої є вираз дійсного типу:

у1 := trunc(y * xmax / (b - а));

Програма побудови графічних зображень повинна починатися з оператора підключення бібліотеки графічних процедур і спеціальної бібліотеки, яка дозволяє

72

«Turbo Pascal »

Значенко О.П.

використовувати функції операційної системи (бібліотеки Crt). Цей оператор розміщується відразу за заголовком програми і має вигляд:

uses Graph, Crt;

Сама програма складається з описів процедур побудови зображень, опису функції, для якої будується графік, і опису спеціальної процедури установки графічного режиму. Головна програма при цьому містить оператори виклику цих процедур і оператор

repeat until keypressed; {виконати пустий цикл до натиснення будь-якої клавіші }

Оператор затримує зображення на екрані до натискання будь-якої клавіші (інакше після побудови останньої точки зображення воно зникає).

Програма побудови графіка функції y=sin(x) на відрізку [ -π; π] має такий вигляд:

Program E37;

Uses Graph, Crt;

Var gr, gm: integer;

xmax, ymax, x1, y1: integer; x,y,a,b:real;

Begin

gr := 0;

ІnitGraph( gr, gm, ' '); xmax := 640;

ymax := 480; a := -pi;

b := pi;

For x1 := 1 to xmax do

Begin

x := a + x1 * (b - a) / xmax; у := sin(x);

y1 := trunc(y * xmax / ( b - a)); y1 := ymax div 2 - y1;

PutPixel(x1, y1, 2) { виведення точки зеленим кольором }

End;

repeat until keypressed; End.

73

«Turbo Pascal »

Значенко О.П.

 

ТЕМА 14. CТАНДАРТННІ МОДУЛІ ТР

Можливості Турбо Паскаля розширюються завдяки використанню модулів. Модуль – це бібліотека, яка містить константи, описи типів даних,зміні,

процедури та функції.

Кожен модуль транслюється окремо і може бути використаний у пограмі. Існують стандартні (вбудовані) модулі. Найчастіше використовуються модулі, що знаходяться у файлі Turbo.tpl. Інші модулі знаходяться у файлі з розширенням *.tpu.

Файл Turbo.tpl містить модулі System, Overlay, Dos, Crt, Printer. Модуль

Graph знаходиться у файлі graph.tpu, модулі Turbo3 та Graph3 – у файлах graph3.tpu та turbo3.tpu. Модулі Strings, WinDos також розміщені в окремих файлах з розширенням *.tpu.

Модуль System підтримує всі стандартні процедури та функції, забезпечує введення-виведення даних, обробку рядків, динамічний розподіл оперативної памяті.

Модулі Dos та WinDos підтримують багаточисельні процедури та функції, деякі еквівалентні командам DOS.

Модуль Overlay підтримує системи оверлеїв, що дозволяє зменшити об’єм пам’яті, що потрібна програмам які виконуються в реальному режимі DOS.

Модуль Crt містить процедурі та функції, які забезпечують роботу з клавіатурою, екраном дисплея в текстовому режимі та керування звуком.

Модуль Printer дозволяє виводити інформацію на принтер.

Модуль Strings надає можливість програмі використовувати рядки з завершаючим нулем, що разом з розширеним синтаксисом дозволяють писати програми, сумісні з Windows – додатками.

Модуль Graph - це бібліотека підпрограм універсального призначення для роботи з графікою. Для роботи модуля потрібен набір файлів автономних драйверів графічного адаптера, а у випадку використання штрихових шрифтів – файли з цими шрифтами.

Модулі Turbo3 та Graph3 включено лише для забезпечення сумісності з ранніми версіями Турбо Паскаля.

Для того щоб використати модулі в програмі, їх необхідно підключити:

Uses <модуль>

74

«Turbo Pascal »

Значенко О.П.

Модуль SYSTEM

Модуль System – це бібліотека підтримки Турбо Паскаля. Модуль забезпечує виконання низькорівневих програм підтримки для всіх вбудованих можливостей та підключається до програми автоматично. До модуля System відносяться такі процедури та функції:

Процедури керування виконанням програми

BREAK – примусовий вихід із циклу

CONTINUE – перехід до виконання наступної ітерації циклів

EXIT – вихід з поточної програми (та ін.) Функції перетворення типів

ROUND – округлює значення дійсного типу до найближчого цілого

TRUNС – відкидає дробову частку

ORD – повертає порядковий номер значення порядкового типу (та ін.). Процедури та функції для змінних порядкового типу.

DEC – зменшує значення змінної на задану величину

INC – збільшує значення змінної на задану величину

ODD – перевіряє, чи е аргумент непарним числом (та ін.). Математичні функції

COS, SIN, SQR, SQRT, LN, EXP,PI (та ін.). Процедури та функції роботи з рядками

COPY, DELETE, INSERT, POS (та ін.).

Процедури та функції керування динамічною пам’яттю

NEW – створює нову динамічну змінну

DISPOSE – знищує динамічну змінну

FREEMEM - знищує динамічну змінну заданого розміру (та ін.). Функції роботи з вказівниками та адресні функції

ADDR – повертає адресу заданого об’єкта

OFS – повертає зміщення заданого об’єкта (та ін.).

Процедури введення-виведення та роботи з файлами та каталогами ASSIGN, APPEND, CLOSE, MkDir, READ, WRITE (та ін.).

75

«Turbo Pascal » Значенко О.П.

Крім процедур та функцій, в модулі описано ряд об’явлених змінних та типізованих констант.

Модуль CRT

Модуль CRT містить підпрограми керування екранним режимом, читання розширених кодів клавіатури, використання кольорів, вікон та звуку. Даний модуль може бути використаний лише на ПК IBM PC та сумісних з ними.

Основні процедури та функції модуля CRT

Робота з екраном дисплея.

Процедура TEXTMODE призначена для опису одного з можливих текстових режимів роботи адаптера. Код режиму, встановленого за допомогою даної процедури запам’ятовується в глобальній змінній LASTMODE модуля CRT і може бути використаний для початкового стану екрану.

В модулі CRT е глобальна змінна TEXTATTR в якій зберігаються поточні атрибути кольорів мерехтіння та кольори символів, а також для кольору тла. Дана змінна може бути використана для керування режимами кольорів виведення символів на екран за допомогою формули

TEXTATTR = „колір символів”+16 *”колір тла” [+128]

Додавання 128 призводить до мерехтіння символів. Об задати колір фону та символу використовуються мнемонічні константи, визначені в модулі CRT (black = 0, white=15 …..)

Для встановлення кольору фона та символів в модулі CRT існують дві процедури TEXTCOLOR , TEXTBACKGROUND.

Процедура WINDOW(х1, у1, х2, у2) визначає текстове вікно з координатами лівого верхнього та правого нижнього кутів.

Для очистки екрану використовується процедура CLRSCR. Після звертання до даної процедури вікно заповнюється кольором фону та курсор переміщується в лівий верхній кут.

Процедури GOTOXY(x,y) переводить курсор до позиції екрану з координатами (x,y), які задаються відносно меж екрану.

Робота з клавіатурою.

Керування клавіатурою здійснюється двома функціями READKEY,

76

«Turbo Pascal »

Значенко О.П.

KEYPRESSED. KEYPRESSED – функція логічного типу. Вона описує стан буфера клавіатури та приймає значення true, якщо в буфері е хоча б один символ, и false, якщо він пустий.

Основи програмування звука.

В модулі CRT існують процедури завдяки яким можливо запрограмувати будьяку послідовність звуків.

Процедура SOUND (f) – де f вираз, що визначає частоту звука в герцах. При виклику даної процедури вмикається динамік до виклику процедури, що зупиняє його роботу NOSOUND.

Процедура DELAY(t) - забезпечує затримку виконання програми на t мілісекунд. (для сучасних комп’ютерів параметр необхідно підбирати).

Виведення псевдографіки і спецсимволів.

Оператор Write дозволяє виводити довільний символ на екран. Для цього в операторі Write необхідно набрати символ # та код символу.

Write(# 191) ( на екрані - alt+191 = ┐)

Модуль PRINTER

Призначення модуля – встановлювати зв’язок програми з пристроями друку. Модуль містить одну змінну LST.

Writeln( ‘х = ‘,х, ‘у=‘,у) – виведення на екран Writeln(LST, ‘х = ‘,х, ‘у=‘,у) – виведення на принтер

Модуль STRINGS

Турбо Паскаль підтримує клас символьних рядків з завершуючим нулем. Такі рядки введено для суміщення типів даних програм написаних на мові Турбо Паскаль, з типами даних програм, що працюють в середовищі Windows, а також для встановлення відповідності з іншими мовами. Функції роботи з такими рядками об’єднані в модулі STRINGS та дозволяють обробляти їх та перетворювати рядки типу STRING та навпаки.

В Турбо Паскалі максимальна довжина рядка рівна 255 символів. Таким чином рядок займає від 1 до 256 байт пам’яті. Рядки з завершаючим нулем не містять байта

77

«Turbo Pascal »

Значенко О.П.

довжини. На відміну від звичайних рядків вони складаються з послідовності ненульових символів, за якими слідує символ NULL(#0). Ніяких обмежень на довжину рядка з завершаючим нулем не накладаються. Ці рядки описуються стандартним типом PCHAR

Модуль OVERLAY

Модуль OVERLAY є засобом створення програм, розділених на окремі модулі. Розмір модуля не повинен перевищувати 64 Кб., але їх кількість не обмежена. Це дозволяє створювати програми, які вимагають великого об’єму оперативної пам’яті.

При виконанні програми побудованої по оверлейному принципу, в пам’яті знаходяться тільки ті процедури та функції, які необхідні в даний момент. Оверлейні модулі загружаються в оверлейний буфер і використовуються по черзі. Оверлеї корисні лише в програмах DOS, що працюють в реальному режимі, оскільки для Windows пам’яттю керує сама ОС.

Турбо Паскаь керує оверлеями на рівні модулів, які є найменшою частиною програми, що утворює оверлей. При компіляції програми, Турбо Паскаль одночасно з файлом (ЕХЕ) генерує оверлейний файл (розширення OVR). Файл з розширенням ЕХЕ містить статичні частини програми, а файл з розширенням OVR – всі оверлейні модулі, які при виконанні програми будуть завантажуватися в пам’ять та вивантажуватися з неї на диск.

Модуль DOS

Модуль DOS містить ряд підпрограм для роботи з файлами та доступа до засобів оперативної пам’яті. Жодна з програм модуля DOS не визначена у стандартному Паскалі, тому вони поміщені в окремий модуль. Щоб використати підпрограми, які містяться у модулі DOS цього необхідно описати. USES DOS;

Процедури та функції модуля DOS умовно поділяють на групи:

Функції керування операційним середовищем.

Процедури керування процесами.

Процедури обслуговування переривань.

Процедури роботи з датою та часом.

78

«Turbo Pascal »

Значенко О.П.

Процедури та функції перевірки стану диску.

Процедури та функції роботи з файлами.

Процедури та функції різного призначення.

Функції керування операційним середовищем

Програма написана мовою Турбо Паскаль має можливість отримати інформацію про оточення, що зберігаються в певній області операційної системи и являють собою набір текстових рядків, в яких описані змінні оточення. Значення деяких змінних встановлюються системою, значення інших задаються користувачем або прикладною програмою.

ВТурбо Паскалі є три функції для роботи зі змінними оточення.

Функція EnvCount – на має параметрів та повертає загальне число змінних оточення

Функція EnvStr – має один параметр та повертає рядок, який містить ім’я та значення змінної, яка відповідає значенню вказаного індексу.

Функція GetEnv – дозволяє по імені змінної оточення отримати її значення.

Процедури та функції роботи з дисками, файлами та каталогами.

Вмодулі Dos є дві функції аналізу дисків.

DiskFree ( Drive: BYTE) : LongInt; – повертає об’єм вільного місця

DiskSize ( Drive: BYTE) : LongInt; – визначає кількість байт на диску.

Drive - задает номер диска (0 - диск з якого запущена програма, 1 - диск А, 2 - диск В, 3 - диск С, 4 - диск D)

Приклад програми використання функцій DiskFree, DiskSize

Progran D3; Uses Dos;

Begin

WriteLn('Объeм памяти вашего диска ', DiskSize (1) DIV 1024,' Kb'); WriteLn('На диске свободно ', DiskFree(1) DIV 1024,'Kb');

Readln;

End.

Для роботи з файлами в модулі Dos призначено ряд процедур:

79

«Turbo Pascal »

Значенко О.П.

Процедура FindFirst призначена для пошуку першого потрібного файлу на диску. FindFirst ( Path:String; Attr:Word; var FR:SeachRec)

Path – рядок, в якому зберігається параметр пошуку (С:\BP\Bin\ *.pas)

Attr – атрибути файлів, що шукаються. Атрибути додаються. (ReadOnly +Hidden – тільки для читання та скритий)

(AnyFile – Directory – всі файли виключаючи каталоги)

FR повертає параметр першого знайденого файлу, для роботи з параметрами знайдених файлів в модулі Dos введено тип даних SeachRec.

Процедура FindFirst готує спеціальний системний запис в пам’яті, яка буде використана процедурою пошуку наступного файлу. Для цього одразу необхідно викликати процедуру пошуку наступного файлу FindNext.

Приклад програми використання функцій DiskFree, DiskSize

Program DV3; {Использование функции FindFirst, FindNext }

Uses Dos;

Var s:SearchRec;

Begin

FindFirst('*.PAS' , AnyFile,S); While DosError = 0 Do

Begin

Write(S.Name);

FindNext(S); Readln;

End;

End.

Для пошуку файлів також можна застосувати функцію FSearch

FSearch (Path:PathStr; DirList:String):PathStr

Path – визначає ім‘я файлу, який шукається. У рядку DirList зберігається список каталогів, розділених крапкою з комою в яких здійснюється пошук. Функція повертає ім’я файлу з параметру Path або пустий рядок, якщо файл не знайдено.

Для встановлення атрибутів файла використовують процедуру

80

«Turbo Pascal »

Значенко О.П.

 

 

 

 

 

 

SetFAttr (var f; Attr:Word)

 

 

 

 

 

Файлу, пов’язаному з файловою змінною f присвоюється атрибут, який визначається параметром Attr. Для коректного присвоєння атрибутів файлу файлова змінна повинна бути пов’язана з реальним файлом на диску за допомогою процедурі

Assign.

Процедура GetFAttr (var f; var Attr:Word) повертає атрибути файла, пов’язаного з файловою змінною f у змінній Attr.

Процедури роботи з датою та часом

Для перевірки та встановлення дати та часу в модулі Dos існує чотири процедури:

SetDate (Year, Manth, Day :Word) – встановлює нову системну дату в операційній системі (рік – значення повинно знаходитися в межах 1980-2099, місяць від 1-12, день в межах 1-31 ) Якщо введено недопустиме значення системна дата не зміниться.

GetDate (Var Year, Manth, Day, DayOfWeek :Word) – повертае системну дату (день тижня 0-неділя 1-понеділок.....)

SetTime(Hour, Minute, Second, Hund: Word) – Встановлює новий системний час в операційній системі( години – значення повинно знаходитися в межах 0-23, хвилини та секунди – в межах 0-59, соті долі секунди в межах 0-99)

GetTime( Var Hour, Minute, Second, Hund: Word) – повертає системний час

Модуль WINDOS

Модуль WINDOS містить ряд підпрограм для роботи з файлами та доступу до засобів операційної системи. Цей модуль рекомендується використовувати якщо необхідно надалі використовувати програму в середовищі Windows. Процедури та функції модуля WINDOS умовно поділяють на групи аналогічні групам модуля DOS , але на відміну модуль WINDOS використовує особливий вид рядків з завершаю сим нулем.

81

«Turbo Pascal »

Значенко О.П.

ТЕМА 15. ДИНАМІЧНІ ЗМІННІ ТА ПОКАЖЧИКИ

Всі оголошені у програмі статичні змінні, які розглядалися раніше, розташовувалися у одній неперервній області оперативної пам’яті, яка називається сегментом даних. Його довжина визначається структурою мікропроцесора і містить 65536 байт. Це може викликати проблеми при обробці великих масивів, цим і обумовлено обмеження на розмір масиву 64Кб.

Для роботи з великими масивами можна скористатися динамічною пам’яттю, тобто оперативною пам’яттю ПК, яка виділяється програмі при її роботі. Розмір динамічної пам’яті визначається всією доступною пам’яттю ПК (не менше 200-300 Кб).

Динамічне розташування даних здійснюється компілятором безпосередньо в процесі виконання програми, причому попередньо невідомо кількість даних та до них не можна звертатися по іменам як до статичних змінних.

Оперативна пам’ять ПК являє собою сукупність елементарних комірок для збереження інформації – байтів, кожен з яких має власних номер. Ці номера називаються адресами, які дозволяють звертатися до будь якого байту пам’яті.

Для керування оперативною пам’яттю у мові Паскаль використовуються вказівники. Покажчик змінна яка в якості свого значення містить адресу байту пам’яті. Один покажчик дозволяє адресувати 64 Кб. Покажчик займає 2 байти.

Як правило покажчик пов’язується з певним типом даних тоді він називається типізованим. Для його оголошення використовується символ „^”.

 

Приклад Var

a:^integer; b,c: ^real;

 

 

У Турбо Паскалі можна оголосити покажчик, непов’язаний з конкретним типом

 

даних. Для цього призначено стандартний тип POINTER. Покажчик такого виду

називається нетипізованим.

 

 

 

 

 

 

 

Приклад

Var d: pointer;

Оскільки такі вказівними непов’язані з конкретним типом, з їх допомогою зручно динамічно розташовувати данні, структура та тип яких змінюється в процесі роботи програми. У Турбо паскалі значення можна передавати лише покажчикам, які пов’язані одним типом даних.

82

«Turbo Pascal »

Значенко О.П.

 

 

 

 

 

Приклад

Var a:^integer; b,c: ^real; d: pointer;

 

 

У цьому випадку

для типізованих покажчиків допустиме лише присвоєння

 

b:=c,але це обмеження не стосується нетипізованих покажчиків, отже b:= d; d:= a Вся динамічна пам’ять у Турбо Паскалі є суцільним масивом байтів, який

називають купою. Фізично вона розташовується за областю пам’яті, яку займає тіло програми. Початок купи зберігається у стандартній змінній – НeapОrg, кінець у змінній - НeapЕnd, поточна межа незайнятої динамічної пам’яті зберігається у покажчику - НeapРtr.

Пам’ять під будь яку динамічну змінну виділяється процедурою NEW, параметром якої є типізований покажчик. У результаті звертання покажчик приймає значення, яке відповідає динамічній адресі, починаючи з якої можна розміщати данні.

Приклад

Var a:^integer; b: ^real;

Begin New(a); New(b);

У результаті виконання першого оператора покажчик (a) приймає значення, яке перед цим належало покажчику купи heapptr. Сам покажчик heapptr збільшує своє значення на два, так як довжина внутрішнього представлення типу integer - 2 Байта. А оператор New(b) викличе, ще одне зміщення покажчика heapptr, але вже на 6 байт, що відповідає довжині внутрішнього представлення типу real. Після того, як покажчик почав визначати конкретний фізичний байт пам’яті, по цій адресі можна розташувати будь яке значення відповідного типу.

Приклад a^:=4+3;

b^:=2*pi;

 

Таким чином, значення,

на які вказує покажчик, розташовані в купі,

позначаються символом “^” який ставиться одразу за покажчиком. Якщо символ “^” відсутній, то мається на увазі адреса, за якою розташовані данні. Динамічно розташовані дані можна використовувати для констант та змінних відповідного типу в будь якому місці де це допустимо.

Приклад b^:=sqr(b^) + sin(b^+a^)-2.3

Динамічну пам’ять можна не лише забирати з купи, але й повертати її. Для цього використовується процедура Dispose(p) де р – покажчик, який не змінює значення, а лише повертає в кучу пам’ять, яка була раніше пов’язана з покажчиком.

83

«Turbo Pascal »

Значенко О.П.

При роботі з покажчиками та динамічною пам’яттю необхідно самостійно слідкувати за використанням процедур New та Dispose та роботи з адресами та динамічними змінними, так як транслятор не контролює ці помилки.

Друга можливість полягає у вивільненні цілого фрагменту купи. З цією метою перед початком виділення динамічної пам’яті поточне значення покажчика heapptr запам’ятовується у змінній-покажчику за допомогою процедури mark. Після чого можна у будь який момент звільнити фрагмент купи, починаючи з тої адреси, яку запам’ятала процедура mark і до кінця динамічної пам’яті. Для цього використовується процедура release.

Робота з динамічними масивами та матрицями

Для роботи з покажчиками будь якого типу використовується процедура

GetMem та FreeMem.

Процедура GetMem(p, size) резервує за покажчиком фрагмент динамічної памяті визначеного розміру, де p – покажчик, а size – розмір у байтах.

Процедура FreeMem (p, size) повертає в кучу фрагмент динамічної пам’яті, який було зарезервовано за покажчиком, де p – покажчик, а size – розмір у байтах. При застосуванні процедури до вже звільненого участку пам’яті виникає помилка.

Приклад програми визначення мінімального елементу масиву.

Program mas_1;

Var x:array [1..15] of real; i:integer; min:real;

Begin

For i:=1 to 15 do

Begin

Write('x[',i,']='); Readln(x[i]);

End; min:=x[1];

For i:=2 to 15 do

If x[i]<min then min:=x[i]; Writeln('min=', min:6:2);

End.

84

«Turbo Pascal »

Значенко О.П.

Приклад програми з використанням покажчиків. Розподіл памяті відбувається за допомогою процедур NEW-DISPOSE

Program mas_2;

Type mas=array [1..150] of real; Var x:^mas;

i:integer; min:real;

Begin

 

New(x);

{Виділення пам’яті під динамічний масив}

For i:=1 to 150 do

Begin

Write('x[',i,']='); Readln(x^[i]);

End;

min:=x^[1];

For i:=2 to 150 do

If x^[i]<min then min:=x^[i]; Writeln('min=', min:6:2);

Dispose(x);

{вивільнення пам’яті}

End.

 

При роботі з динамічними змінними необхідно дотримуватися певного порядку роботи:

1.Описати вказівними.

2.Розподілити пам’ять.

3.Обробити динамічний масив.

4.Звільнити пам’ять.

Поняття динамічного масиву можна застосувати і до матриць. Динамічна матриця представляє собою масив покажчиків, кожен з яких адресує один рядок або один стовпець.

85

«Turbo Pascal »

Значенко О.П.

Приклад програми з використанням покажчиків. Розподіл памяті відбувається за допомогою процедур GETMEM-

FREEMEM

Program mas_3;

Type mas=array [1..150] of real; Var x:^mas;

i, n:integer; min:real;

Begin

Writeln(‘n=’); Readln(n);

GetMem(x, n*sizeof(real)); {Виділення пам’яті під N елементів масиву, де SizeOf –функція, що повертає число байт які займає параметр }

For i:=1 to N do

Begin

 

Write('x[',i,']=');

 

Readln(x^[i]);

 

End;

 

min:=x^[1];

 

For i:=2 to 150 do

 

If x^[i]<min then min:=x^[i];

 

Writeln('min=', min:6:2);

 

FreeMem(x, n*sizeof(real));

{вивільнення пам’яті}

End.

86

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]