2.10. Обчислити значення та побудувати графіки функцій Y=А*(1-е-х) та Z=В*соs(С*х-рі/3) при зміні аргументу Х від нуля до 5 з кроком 0,01. Значення коефіцієнтів А, В, С задати у вигляді констант. Значення аргументу та функцій вивести в три стовпці на екран з відповідними заголовками та записати у файл. Графіки вивести на весь екран на одну координатну сітку різним кольором. Підписати координатні осі та вивести максимальні значення функцій.
3. КОНТРОЛЬНІ ЗАПИТАННЯ
3.1. Як відкрити графічний режим дисплея.
3.2. За допомогою яких команд можна будувати графіки функцій.
3.3. Як змінити тип, товщину та колір лінії.
3.4. За допомогою яких команд виводиться на екран текстова інформація у графічному режимі роботи.
3.5. Як змінити шрифт, розмір та напрямок виводу тексту.
3.6. Чим визначаються масштаби по координатних осям.
Комп'ютерний практикум № 7
БІБЛІОТЕЧНИЙ МОДУЛЬ НА МОВІ "ПАСКАЛЬ"
Мета практикуму – розробка програмного забезпечення на мові програмування "Паскаль" з використанням створених бібліотечних модулів програміста.
1. ТЕОРЕТИЧНІ ВІДОМОСТІ
1.1. Створення та використання бібліотечного модуля програміста на мові "Паскаль" здійснюється в такій послідовності:
1) Відповідно до вимог записується текст програми бібліотечного модуля;
2) Текст програми компілюється звичайним способом шляхом натискання комбінації клавіш Alt-F9. Попередньо перед компіляцією за допомогою меню Compile\Destination\Disk задається місце розміщення модуля у файлі на диску. Після компіляції створюється файл модуля з розширенням .TPU, наприклад, файл BIBLIO.TPU;
3) В основній програмі для використання команд бібліотечного модуля він підключається у розділі Uses, наприклад, Uses BIBLIO;
4) В обов’язковому порядку створюється опис використання команд модуля.
1.2. Текст програми бібліотечного модуля записується відповідно до наступної структури модуля:
Unit <ім”я модуля>;
{$ глобальні директиви компілятора}
Interface
Uses <доступні бібліотечні модулі>;
Label <доступні мітки>;
Const <доступні константи>;
Type <доступні типи даних>;
Var <доступні змінні>;
Procedure <ім”я 1-ої доступної процедури>;
Procedure <ім”я N-ої доступної процедури>;
Function <ім”я 1-ої доступної функції>;
Function <ім”я N-ої доступної функції>;
Implementation
Uses <бібліотечні модулі для реалізації>;
Label <мітки для реалізації>;
Const <константи для реалізації>;
Type <типи даних для реалізації>;
Var <змінні для реалізації>;
Procedure <ім”я 1-ої процедури>;
<тіло 1-ої процедури>;
Procedure <ім”я N-ої процедури>;
<тіло N-ої процедури>;
Function <ім”я 1-ої функції>;
<тіло 1-ої функції>;
Function <ім”я N-ої функції>;
<тіло N-ої функції>;
Begin
<оператор 1>;
<оператор N>;
End.
1.3. Заголовок бібліотечного модуля починається із зарезервованого слова Unit та імені модуля, яке повинно співпадати з іменем файлу модуля, тому може вміщувати не більше 8 символів.
Далі йдуть глобальні директиви компілятора, що будуть діяти при підключенні модуля в основній програмі.
Інтерфейсна частина Interface вміщує елементи, які доступні користувачу після підключення модуля. Це можуть бути інші бібліотечні модулі, мітки, константи, типи даних, зміні, процедури й функції, що вказуються у відповідних розділах Uses, Label, Const, Type, Var, Procedure, Function. Причому для процедур та функцій вказуються тільки їх заголовки без відповідних тіл. Будь-який розділ, в тому числі й усі, можуть бути відсутні. В останньому випадку ключове слово Interface залишається.
Реалізаційна частина Implementation служить для реалізації інтерфейсної частини. Це внутрішня складова модуля, що недоступна користувачу після його підключення. В цій частині процедури та функції записуються повністю. Будь-який розділ реалізаційної частини, в тому числі й усі, можуть бути відсутні, проте ключове слово Implementation завжди залишається.
Ініціалізаційна частина вміщує оператори між ключовими словами Begin та End, що виконуються у програмі, в якій підключено модуль, найпершими, тобто перед командами її виконавчого блоку. Найчастіше ініціалізаційна частина порожня.
1.4. Приклад 1. Створити бібліотечний модуль, який уміщує тільки наступні константи А=2002; Н=0,02; К=2,73.
Unit Constant;
Interface
Const
A=2002;
H=0.02;
K=2.73;
Implementation
Begin
End.
1.5. Приклад 2. Створити бібліотечний модуль, ініціалізаційна частина якого здійснює очистку екрана в текстовому режимі.
Unit ScrClear;
Interface
Implementation
Uses Crt;
Begin
ClrScr;
End.
1.6. Приклад 3. Створити бібліотечний модуль, що вміщує дві процедури, за допомогою яких можна задати колір символів й фону в текстовому режимі екрана та подати короткочасний звуковий сигнал.
Unit Biblio;
Interface
Procedure CF (Color, Fon:byte);
Procedure Beep;
Implementation
Uses Crt;
Procedure CF;
Begin
TextColor (Color);
TextBackGround (Fon);
End;
Procedure Beep;
Begin
Sound (3000);
Delay (1000);
NoSound;
End;
Begin
End.
2. ЗАВДАННЯ НА РОБОТУ
Розробити та запустити у роботу програму на мові програмування "Паскаль", яка вирішує задачу відповідно до заданого нижче варіанта.
2.1. Створити масив з 4 елементів типу даних "запис" із наступними полями: № групи студента, ПІБ студента, оцінка з математики, оцінка з хімії, оцінка з фізики. Підрахувати середній бал та вивести список студентів на отримання стипендії, якщо середній бал не менше "4'. Ввід даних у масив та обчислення середнього балу реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.2. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ студента, кількість "З", кількість "4", кількість "5", оцінка за дипломний проект. Вивести список студентів на отримання диплома з відзнакою, якщо відсутні "З", а "4" не більше 25% та "5" за дипломний проект. Ввід даних у масив та визначення умов реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.3. Створити масив з 4 елементів типу даних "запис" із наступними полями: марка автомобіля, пройдений шлях, ціна, об'єм двигуна. Вивести список із даними автомобілів, ціна яких нижче заданої. Ввід даних у масив та визначення умови реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.4. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ продавця, об'єм продажу, посадовий оклад, стаж роботи. Вивести список продавців та отриману премію, як відсоток від об'єму продажу. Відсоток дорівнює стажу роботи. Ввід даних у масив та обчислення премії реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.5. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ студента, кількість "З", кількість "4", кількість "5". Вивести список студентів із відносною кількістю (відсотки) "З", "4" та "5". Ввід даних у масив та обчислення відсотків реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.6. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ студента, стать, кількість "З", кількість "4", кількість "5". Вивести список студентів чоловічої статі, яким дозволено навчання за додатковою програмою, якщо середній бал не нижче 3,9. Ввід даних у масив та обчислення середнього балу реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.7. Створити масив з 4 елементів типу даних "запис" із наступними полями: № групи студента, ПІБ студента, оцінка за контрольну роботу, оцінка за розрахункову роботу, оцінка за лабораторні роботи. Вивести список студентів на отримання заліка із дисципліни, якщо оцінки "4" та "5". Ввід даних у масив та визначення умови реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.8. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ студента, кількість "З", кількість "4", кількість "5", іноземна мова. Вивести список трьох студентів із найвищими середніми балами для навчання за додатковою програмою, якщо іноземною є німецька мова. Ввід даних у масив та визначення умови реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.9. Створити масив з 4 елементів типу даних "запис" із наступними полями: № групи, ПІБ студента, стать, оцінка з іноземної мови, оцінка з обчислювальної техніки. Вивести список студентів жіночої статі для участі в міжнародній олімпіаді, якщо оцінка з обчислювальної техніки "5", а з іноземної мови не нижче "4'. Ввід даних у масив та визначення умови реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
2.10. Створити масив з 4 елементів типу даних "запис" із наступними полями: ПІБ студента, кількість "З", кількість "4", кількість "5", наявність пільг. Вивести список студентів та середній бал окремо для студентів із пільгами та окремо без пільг. Ввід даних у масив та обчислення реалізувати у вигляді бібліотечного модуля з двома відповідними підпрограмами.
3. КОНТРОЛЬНІ ЗАПИТАННЯ
3.1. В якій послідовності створюється бібліотечний модуль.
3.2. Яку структуру має бібліотечний модуль.
3.3. Які вимоги до імені бібліотечного модуля.
3.4. Які функції виконує інтерфейсна частина модуля.
3.5. Які функції виконує реалізаційна частина модуля.
3.6. Які функції виконує ініціалізаційна частина модуля.
3.7. Як підключається бібліотечний модуль програміста в програмі.
Комп'ютерний практикум № 8
ДИНАМІЧНІ ЗМІННІ МОВИ "ПАСКАЛЬ"
Мета практикуму – розробка програмного забезпечення на мові прграмування "Паскаль" з використанням динамічних змінних.
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>,<вказівник>);
5) З динамічної пам'яті цей прямокутний фрагмент зображення відтворюється на екрані у заданому місці процедурою
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) | Заповнення користувача |
За згодою встановлено суцільне заповнення білим кольором, тобто
SetFillStyle (1, white);
Прямокутник із цілочисленими координатами лівого верхнього кута 100, 50 та правого нижнього кута 300, 150 креслиться командою
Rectangle (100,50,300,150);
Коло з координатами центра 300, 200 та радіусом 50 створюється командою
Circle (300,200,50);
Дуга кола з координатами центра 300, 200, із початковим й кінцевим кутом 90 й 270 градусів та радіусом 50 малюється командою
Arc (300,200,90,270,50);
Кут вимірюється як і в математиці від додатного напрямку осі абсцис проти годинникової стрілки.
Сектор круга з координатами центра 300, 200, із початковим й кінцевим кутом 90 й 270 градусів та радіусом 50 створюється командою
PieSlice (300,200,90,270,50);
Еліптична дуга з координатами центра 300, 200, із початковим й кінцевим кутом 90 й 270 градусів та радіусом за віссю абсцис 50 й віссю ординат 150 креслиться командою
Ellipse (300,200,90,270,50,150);
Еліптичний сектор із координатами центра 300, 200, із початковим й кінцевим кутом 90 й 270 градусів та радіусом за віссю абсцис 50 й віссю ординат 150 малюється командою
Sector (300,200,90,270,50,150);
Заповнений еліпс із координатами центра 300, 200 та радіусом за віссю абсцис 50 й віссю ординат 150 креслиться командою
FillEllipse (300,200,50,150);
Стовпець із координатами лівого верхнього кута 100, 50 та правого нижнього кута 200, 250 створюється командою
Bar (100,50,200,250);
Тривимірний стовпець із координатами лівого верхнього кута 100, 50 й правого нижнього кута 200, 250 та глибиною 10 із видимою вершиною, що задається логічною константою TopON чи її значенням True, малюється командою
Bar3D (100,50,200,250,10,TopON);
Невидима вершина використовується для розміщення стовпця один на одному і задається константою TopOFF чи її значенням False.
Ламана лінія або багатокутник викреслюється на основі масиву координат точок x та y, які зберігаються в зарезервованому записі PointType. Багатокутник виходить, якщо координати першої та останньої точки співпадають. Для малювання необхідно також задати кількість точок (вершин) фігури
DrawPoly (<кількість точок:word>,
<масив координат точок:PointType>);
Приклад 3. Створити трикутник, контур якого має зелений колір.
Uses Graph;
Const
{ Завдання координат 4-х точок }
Triangle:array [1..4] of PointType=
((x:50; y:100), (x:100; y:100),
(x:150; y:150), (x:50; y:100));
Var
grDriver:Integer;
grMode:Integer;
ErrCode:Integer;
Begin
grDriver:= Detect;
InitGraph (grDriver, grMode,'F:\TP\BGI');
ErrCode:= GraphResult;
if ErrCode = grOk then
begin
{ Завдання зеленого кольору }
SetColor (green);
{ Креслення трикутника }
DrawPoly (4, Triangle);
Readln;
CloseGraph;
end
else
Writeln(GraphErrorMsg(ErrCode));
End.
Заповнений багатокутник малюється при обов'язковій рівності координат першої та останньої точки
FillPoly (<кількість точок:word>,
<масив координат точок:PointType>);
1.10. Замкнуті області зображень можна заповнювати (зафарбовувати) заданим шаблоном та кольором, які встановлені командою SetFillStyle. Кордон заповнення задається кольором лінії, яка обмежує замкнуту область. Для команди заповнення необхідно вказати також координату будь-якої точки всередині області
FloodFill (<x,y:integer>,<колір кордону:word>);
Приклад 4. Заповнити червоне коло суцільним синім шаблоном.
Uses Graph;
Var
grDriver:Integer;
grMode:Integer;
ErrCode:Integer;
Begin
grDriver:= Detect;
InitGraph (grDriver, grMode,'F:\TP\BGI');
ErrCode:= GraphResult;
if ErrCode = grOk then
begin
{ Малювання кола червоним кольором }
SetColor (red);
Circle (200, 100, 50);
Readln;
{ Завдання суцільного заповнення
синім кольором }
SetFillStyle (1, blue);
{ Заповнення до червоної межі }
FloodFill (200, 100, red);
Readln;
CloseGraph;
end
else
Writeln(GraphErrorMsg(ErrCode));
End.
1.11. Приклад 5. Безперервно переміщувати червону кулю за годинниковою стрілкою паралельно сторонам екрана.
Uses Graph, Crt;
Const
Radius=20;
Var
grDriver:Integer;
grMode:Integer;
ErrCode:Integer;
Size,X,Y,I:Word;
P:Pointer;
Begin
grDriver:= Detect;
InitGraph (grDriver, grMode,'F:\TP\BGI');
ErrCode:= GraphResult;