
- •“Київський політехнічний інститут” обчислювальна техніка та програмування - 1
- •Обчислювальна техніка та програмування - 1
- •Символи кодової таблиці ascii
- •Умовні переходи на мові "паскаль"
- •1: Begin
- •Цикли на мові "паскаль"
- •Підпрограми на мові "паскаль"
- •Function Alfha(a,b:real; c:byte):real;
- •Function Beta:integer;
- •Procedure Sorter (a,b:real; c:byte; Var X,y:real);
- •Procedure Beep;
- •Uses crt;
- •Window (x1,y1,x2,y2);
- •Window (10,5,45,15);
- •Window (1,1,80,25);
- •TextColor (yellow);
- •TextColor (14);
- •Текстові та типізовані файли мови "паскаль"
- •Assign (f1, ’Data.Pas’);
- •Reset (f2);
- •Rewrite (f2);
- •Seek (f2, 7);
- •FileSize (f2),
- •FilePos (f2).
- •Побудова графіків функцій на мові "паскаль"
- •MoveTo (200, 100);
- •SetLineStyle (0,0,1);
- •OutText (’Текст для виводу’);
- •OutTextXy (200,100,’Текст для виводу’);
- •SetTextStyle (0,0,0);
- •SetTextJustify (1,1);
- •PutPixel (150,50,green);
- •ClearDevice;
- •Бібліотечний модуль на мові "паскаль"
- •Interface
- •Implementation
- •Динамічні змінні мови "паскаль"
- •SetFillStyle (1, white);
- •Об’єктно-орієнтоване програмування на мові "паскаль"
- •New (Person, Init);
- •Destructor Done; Virtual;
- •Dispose (Person, Done);
- •Форматований ввід та вивід даних на мові “cі”
- •Printf(“керуючий рядок”,аргумент1,аргумент2, ...);
- •Scanf(“керуючий рядок”,аргумент1,аргумент2,...);
- •Scanf(“%d %f %c %s”,&I,&j,&k,l);
- •Scanf(“%d %*d %d”, &I,&j);
- •Scanf(“%d,%d”,&n,&m);
- •Оператори організації переходів на мові "сі"
- •1.2. Для організації умовного переходу по одному із багатьох варіантів доцільно використовувати оператор switch. Він має наступний формат:
- •Організація циклів на мові "сі"
- •Одновимірні та двовимірні масиви на мові "сі"
- •Char b[30];
- •Char a[10][20];
- •Записи, вкладені записи, масиви записів на мові "сі"
- •Int month;
- •Int year;};
- •Int class, age;};
- •Робота із бінарними та текстовими файлами
- •File *lst;
- •Int fflush (вказівник_на_файл);
- •Int fgetc(вказівник_на_файл);
- •Int fputc(вказівник_на_файл);
- •Int fread (вказівник_на_масив, розмір_об’єкта, кількість_об’єктів , вказівник_на_файл);
- •Int fwrite(вказівник_на_масив, розмір_об’єкта, кількіст_об’єктів , вказівник_на_файл);
- •Int fseek(вказівник_файла, зміщення, поч. Значення);
- •3. Контрольні запитання
- •Робота з функціями на мові “сі”
- •Тип_функції назва_функції(тип1 параметр1, ..., тип_n параметр_n);
- •Int main(int argc, char *argv)
- •3.1. Який синтаксис функцій у мові “сі”.
- •Комп’ютерний практикум № 17 графічний режим екрану на мові “ci”
- •Initgraph(int *driver, int *mode, char *path);
- •Void *pimage;
- •Void *malloc(об'єм_пам’яті_в_байтах);
- •Imagesize(x1,y1,x2,y2);
- •Putimage(x1, y1, вказівник, вид_вставки);
- •Вирішення диференційних рівнянь методом ейлера
- •Основи роботи в середовищі “turbo pascal 7.0” та “turbo c 3.0”
- •Комп’ютерний практикум № 17. Графічний режим екрану
Динамічні змінні мови "паскаль"
Мета практикуму – розробка програмного забезпечення на мові прграмування "Паскаль" з використанням динамічних змінних.
ТЕОРЕТИЧНІ ВІДОМОСТІ
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. Динамічна пам'ять використовується для збереження зображення з екрана та його наступного відтворення. Рухомі зображенняформуються шляхом вилучення графічної інформації із заданої області екрана та її послідовного відтворення в іншому місці екрана. Указані дії здійснюються в наступній послідовності:
На екрані формується необхідне зображення у графічномурежимі роботи дисплея;
За допомогою функції цілочисленого типу word
ImageSize (<x1,y1,x2,y2 :integer>);
виділяється необхідна прямокутна область на екрані з координатами лівого верхнього кута x1,y1 й правого нижнього кута x2,y2 та обчислюється її об'єм, який не повинен перевершувати 64К, інакше необхідна область виділяється декількома прямокутниками;
3) Створюється динамічна змінна за допомогою команди GetMem, для якої виділяється об'єм, обчислений функцією ImageSize;
4) Виділений фрагмент зображення вирізається з екрана й розміщується у динамічній пам'яті за вказівником процедурою
GetImage (<x1,y1,x2,y2 :integer>,<вказівник>);
З динамічної пам'яті цей прямокутний фрагмент зображення відтворюється на екрані у заданому місці процедурою
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) |
Заповнення користувача |
За згодою встановлено суцільне заповнення білим кольором, тобто