Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_OT-1.doc
Скачиваний:
16
Добавлен:
17.03.2016
Размер:
1.15 Mб
Скачать

Динамічні змінні мови "паскаль"

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

  1. ТЕОРЕТИЧНІ ВІДОМОСТІ

1.1. Після запуску програми на виконання вона розміщується в оперативній пам’яті комп’ютера в певному порядку. Кожному логічному блоку програми виділяється окремий сегмент пам’яті розміром 64К. Послідовно розташовуються сегменти машинного коду основної програми, бібліотечні модулі, що підключені в розділ Uses, а потім ідуть сегменти даних й стека. Константи та змінні, що знаходяться в сегменті даних, називаються статичними й доступ до їх значень здійснюється за іменами, описаними у розділах програми Const та Var.

Уся інша вільна частина стандартної оперативної пам’яті, що не зайнята програмою, називається динамічною пам’яттю або Heap-областю й закріплюється для потреб програми на весь час її роботи. Величину Heap-області та стека можна змінити директивою компілятора {$M} чи через меню Options\Compiler\Memory Size. За згодою встановлено розмір стека 16384 байта, мінімальний та максимальний розмір динамічної пам'яті – нуль та 655360 байт, тобто

{$M 16384, 0, 655360}

1.2. В Heap-області можна розміщувати необхідні для роботи програми дані за допомогою динамічних змінних. Виділення пам'яті для динамічних змінних здійснюється не на етапі компіляції програми, а під час її роботи, тобто у виконавчій частині програми, тому й звільнення динамічної пам'яті від даних можна зробити ще до завершення роботи програми.

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

1.3. Динамічна змінна – це вказівник на комірки динамічної пам'яті, де знаходяться дані. Вказівники описуються в розділі Var й можуть бути типізованими й нетипізованими.

Типізовані вказівники описуються за допомогою символу “ ^ ” (циркумфлекс) й зв'язуються з певним типом даних. Наприклад, вказівник Alfha, що вказує на дійсний тип та вказівник I, що вказує на цілочислений тип описуються наступним чином

Var

Alfha : ^real;

I : ^integer;

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

New (Alpha);

New (I);

а звільнення динамічної пам'яті – процедурою

Dispose (Alpha);

Dispose (I);

Пам'ять виділяється порціями по 8 байт, тому 6-байтний тип real й 2-байтний тип integer отримують однакові порції по 8 байт.

Нетипізовані вказівники описуються за допомогою зарезервованого слова pointer й не зв'язуються з конкретним типом даних. Наприклад, описання нетипізованого вказівника Beta має наступний вигляд

Var

Beta :pointer;

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

GetMem (Beta, 32);

а для звільнення – процедура

FreeMem (Beta, 32);

Об'єм пам'яті, що виділяється та звільняється для однієї динамічної змінної, повинен співпадати. Об'єм пам'яті можна задавати за допомогою значень змінних типу word.

1.4. При виділенні значних об'ємів динамічної пам'яті корисно користуватися функціями MemAvail й MaxAvail цілочисленого типу longint, які визначають загальний об'єм вільної пам'яті й об'єм неперервної ділянки пам'яті відповідно.

1.5. Після виділення пам'яті для динамічних змінних, тобто після створення динамічних змінних, із ними можна працювати як із звичайними змінними, виконуючи над ними всі допустимі операції. Єдиною відмінністює позначення динамічної змінної символом “^ ” (циркумфлекс) після її імені.

Приклад 1. Знайти суму двох дійсних чисел на основі використання динамічних змінних.

Program Dinamic_Var;

Uses Crt;

Var

a, b, c : ^real;

Begin

TextColor (blue);

TextBackground (lightgray);

ClrScr;

New (a);

New (b);

New (c);

Write ('Введіть два дійсних числа: ');

Readln (a^,b^);

c^:=a^+b^;

Writeln ('Сума чисел дорівнює: ',c^:9:2);

Dispose (a);

Dispose (b);

Dispose (c);

Readln;

End.

1.6. Безпосередньо над вказівникамиможна виконувати операції порівняння та присвоєння, в т.ч. присвоєння порожнього значенняNil

Beta:= Nil;

1.7. Часто динамічні змінні застосовуються для створення одно- та двонаправлених списків. Список – це скінчена сукупність елементів, кількість яких може безперервно змінюватися. В однонаправленому списку кожен елемент зв'язаний тільки з наступним, тому для доступу до конкретного елемента потрібно пройти через усі попередні. Кожен елемент складається з інформаційних полів та вказівника на наступний елемент. Вказівник останнього елемента має значення Nil. У двонаправлених списках можна рухатися в обидва напрямки. Елементи списку зручно реалізовувати у вигляді запису.

Приклад 2. Створити на основі однонаправленого списку телефонний довідник, що включає ПІБ абонента, його адресу та номер телефону.

Program SimpleList;

Uses Crt;

{ Опис елементу списку }

Type

PhonePtr=^PhoneRec;

PhoneRec=record

Name :string[30];

Address :string[50];

Phone :string[15];

Next :PhonePtr;

end;

Var

FirstPhone, CurrPhone,

PrevPhone, WritePhone :PhonePtr;

Ch :char;

{ Підпрограма вводу даних про абонента }

Procedure EnterPhone;

begin

with CurrPhone^ do

begin

ClrScr;

Write ('Введіть ПІБ: ');

readln (Name);

Write ('Введіть адресу: ');

readln (Address);

Write ('Введіть номер телефону: ');

readln (Phone);

end;

end;

{ Підпрограма створення нового абонента }

Procedure NewPhone;

begin

if FirstPhone=Nil then

begin

New(CurrPhone);

EnterPhone;

FirstPhone:=CurrPhone;

PrevPhone:=CurrPhone;

CurrPhone^.Next:=Nil;

end

else

begin

PrevPhone:=CurrPhone;

New (CurrPhone);

EnterPhone;

PrevPhone^.Next:=CurrPhone;

CurrPhone^.Next:=Nil;

end;

end;

{ Підпрограма виводу даних про абонента }

Procedure OutputPhones;

begin

WritePhone:=FirstPhone;

While WritePhone <> Nil do

begin

with WritePhone^ do

Writeln (Name, ',',Address, ',',Phone);

WritePhone:=WritePhone^.Next;

end;

Repeat Until KeyPressed;

end;

BEGIN

FirstPhone:=Nil;

{ Організація простого меню програми }

ClrScr;

GotoXY (1,24);

TextColor (yellow);

Writeln ('(Н)овий абонент, (Ч)итати абонентів,

(В)ихід');

Window (1,1,80,23);

TextColor (red);

Repeat

ClrScr;

Repeat

Ch:=Readkey;

Until Ch IN ['Н','н','Ч','ч','В','в'];

Case Ch of

'Н','н':NewPhone;

'Ч','ч':OutputPhones;

end;

Until Ch IN ['В','в'];

ClrScr;

END.

1.8. Динамічна пам'ять використовується для збереження зображення з екрана та його наступного відтворення. Рухомі зображенняформуються шляхом вилучення графічної інформації із заданої області екрана та її послідовного відтворення в іншому місці екрана. Указані дії здійснюються в наступній послідовності:

  1. На екрані формується необхідне зображення у графічномурежимі роботи дисплея;

  2. За допомогою функції цілочисленого типу word

ImageSize (<x1,y1,x2,y2 :integer>);

виділяється необхідна прямокутна область на екрані з координатами лівого верхнього кута x1,y1 й правого нижнього кута x2,y2 та обчислюється її об'єм, який не повинен перевершувати 64К, інакше необхідна область виділяється декількома прямокутниками;

3) Створюється динамічна змінна за допомогою команди GetMem, для якої виділяється об'єм, обчислений функцією ImageSize;

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

GetImage (<x1,y1,x2,y2 :integer>,<вказівник>);

  1. З динамічної пам'яті цей прямокутний фрагмент зображення відтворюється на екрані у заданому місці процедурою

PutImage (<x,y :integer>,<вказівник>,<режим>);

Координата лівого верхнього кута прямокутника задається аргументами x та y, а аргумент <режим> визначає спосіб поєднання зображення фрагмента з поточним зображенням на екрані. Порівнюються між собою відповідні пікселі зображень. Режим можна задавати словами чи цифрами відповідно до табл. 1.1.

Табл. 1.1.

Режим

Примітка

CopyPut або NormalPut

(або цифра 0)

Заміна поточного зображення

XORPut (або цифра 1)

Порівняння за логічною функцією “Виключаюче АБО”

ORPut (або цифра 2)

Порівняння за логічною функцією “АБО”

ANDPut (або цифра 3)

Порівняння за логічною функцією “І”

NOTPut (або цифра 4)

Порівняння за логічною функцією “НІ”

(негативне зображення)

1.9. Для створення зображень у графічному режимі дисплея використовуються команди малювання геометричних фігур. Контур фігур викреслюється лінією, колір якої встановлюється відомою командою SetColor. Фігури, що мають поверхню, (наприклад, круг) заповнюються заданим шаблоном та кольором установленими у команді

SetFillStyle (<шаблон>,<колір>);

Стандартні шаблони задаються цифрами від нуля до 11 або еквівалентною назвою згідно табл. 1.2.

Табл. 1.2.

Шаблон

Примітка

EmptyFill (або цифра 0)

Суцільний колір фона

SolidFill (або цифра 1)

Суцільний поточний колір

LineFill (або цифра 2)

Тире

LtSlashFill (або цифра 3)

Косі лінії нормальної товщини

SlashFill (або цифра 4)

Косі лінії подвоєної товщини

BkSlashFill (або цифра 5)

Зворотні косі лінії подвоєної товщини

LtBkSlashFill (або цифра 6)

Зворотні косі лінії нормальної товщини

HatchFill (або цифра 7)

Клітинки

InterLeaveFill (або цифра 8)

Косі рідкі клітинки

WideDotFill (або цифра 9)

Косі густі клітинки

CloseFill (або цифра 10)

Рідкі точки

Fill (або цифра 11)

Густі точки

UserFill (або цифра 12)

Заповнення користувача

За згодою встановлено суцільне заповнення білим кольором, тобто

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