Міністерство освіти України
Національний університет "Львівська політехніка"
Кафедра автоматизованих систем управління
Курсова робота
з дисципліни
"Системне програмування та операційні системи"
на тему
Середовище для демонстрації графічних
бібліотек мови програмування
( Turbo C )
ЗМІСТ
Вступ............................................................................................................3
Огляд літератури.........................................................................................4
Постановка задачі.......................................................................................5
Алгоритм розв'язку задачі..........................................................................6
Програмна реалізація алгоритму...............................................................9
Контрольні приклади.................................................................................14
Висновки.....................................................................................................16
Список літератури......................................................................................17
Додатки........................................................................................................18
Вступ
Створення програмного продукту, з допомогою якого можна було б ознайомити користувача із можливостями розглядуваної мови програмування щодо побудови стандартних графічних об'єктів, таких як лінія, коло, еліпс, дуга та цілий ряд інших є метою даної роботи.
Такі побудови надалі можуть використовуватись для створення більш складних малюнків, виступаючи у ролі їх складових частин, тому актуальним буде його застосування у сфері освіти для демонстрації програмістам-початківцям, оскільки ця програма показує не лише кінцевий результат виклику тієї чи іншої функції з графічної бібліотеки, але й вимагає від користувача задання необхідних для цього параметрів.
Існує кілька підходів та методів, що використовуються для вирішення задач такого класу. Серед них можна виділити такі: спосіб, який вимагає вибору функції для демонстрації, але при цьому параметри графічного об'єкта визначені програмно і користувач не може їх змінити; другий спосіб відрізняється від попереднього тим, що є наявною можливість редагування розмірів при побудові графічного примітиву; метод, застосований у даній реалізації характеризується вибірковим доступом до функцій із заданням параметрів, необхідних для їх виклику. Останній підхід є, на мою думку, раціональнішим для використання із усіх наведених вище, оскільки дає змогу ознайомитись із специфікою виклику стандартних графічних функцій та необхідними для досягнення даної мети параметрами при почерговому звертанні до кожної з них, що гарантує повноту ознайомлення з усіма можливостями графічної бібліотеки.
Основним ресурсом, що забезпечує можливість реалізації графічних функцій у мові програмування С++ є файл graphics.h, який містить усі їхні прототипи. Серед них є такі, як: putpixel, line, circle, ellipse, bar, sector. Слід відзначити, що їх можливості не вичерпуються двовимірними побудовами, на прикладі цих функцій можна продемонструвати і рисування деяких тривимірних об'єктів (наприклад функція bar3d,яка забезпечує малювання об'ємного еліпса за означеними користувачем параметрами). Характерною рисою є різномаїття стилів ліній, заповнення, що значно розширює можливості щодо реалізації стандартних, означених вище можливостей.
Необхідно також згадати про різномаїття шрифтів, розмірів, які використовуються для виведення написів та повідомлень у графічному режимі. Визначення точок прив'язки тексту та напрямку виведення дозволяє задовільнити найнеобхідніші аспекти даної процедури.
Слід зазначити, що стандартні графічні функції мови програмування С++ гарантують побудову об'єктів у тій повноті, яка може і не задовільнити вимогливих користувачів. Однак вона дозволяє здійснити ознайомлення із найрозповсюдженішими примітивами та способами їх опрацювання.
ОГЛЯД ЛІТЕРАТУРИ
Стандартним продуктом, що використовується для демонстрації можливостей графічної бібліотеки мови С є програма, яка міститься у файлі bgidemo.c ( у піддиректорії BGI ) програмного середовища. Даний ресурс дає змогу ознайомитись із серією рисунків, виконаних з допомогою графічних примітивів при почерговій їх демонстрації.
Слід зазначити, що для демонстрації графічної бібліотеки мови С необхідно скористуватись спеціальним файлом graphics.h, що містить прототипи усіх стандартних функцій рисування, загальна кількість яких близько п'ятидесяти.
Для реалізації поставленої задачі у літературі вказується кілька підходів, які можуть бути використані. Зупинимось детально на кількох із них:
1. вибір користувачем пункту головного меню приводить до реалізації відповідної графічної функції. Позитивним у даному підході є те, що що користувач сам обирає потрібну йому для ознайомлення властивість графічного середовища, уникаючи при цьому зайвих витрат часу для перегляду всіх пунктів вибору. Негативним же тут є, безперечно, відсутність можливості зміни параметрів об'єкту, що рисується.
Даний підхід може використовуватись для ознайомлення ( хоча й не у всій повноті) з однією, кількома чи усіма функціями, однак він не є раціональним для повної демонстрації властивостей середовища.
2. метод, відмінний від означеного у попередньому пункті тим, що ознайомлення із графічним середовищем йде уже не через вибір конкретного пункту меню, а з почерговим переходом від одного з них до іншого. Позитивним тут є момент ознайомлення користувача із властивостями функцій, негативним же залишається неможливість зміни вхідних параметрів та обов'язкова демонстрація усіх функцій рисування у випадку, коли користувачеві необхідний перегляд лише кількох із них.
3. повним та всебічним висвітленням функціонування графічних процедур є такий метод: послідовний доступ до застосування на практиці всіх можливих стандартних примітивних побудов забезпечує повноту ознайомлення з бібліотекою. Механізм роботи кожної з них роз'яснюється також вибором параметрів для них безпосередньо самим користувачем.
Недоліком тут залишається нераціональність витрат часу, якщо необхідно продемонструвати лише вибіркові процедури.
4. здійснивши логічне підсумовування наведених вище фактів, реалізуємо для досягнення бажаного результату спосіб, основними характеристиками якого є: вибірковий доступ до потрібних функцій рисування; вибір користувачем розмірів для реалізації рисунку; можливість завершення програми за бажанням користувача під час вибору ним одного із пунктів головного меню.
ПОСТАНОВКА ЗАДАЧІ
На узагальненнях, здіснених у попередньому розділі, сформулюємо завдання так: демонструвати користувачеві ту чи іншу функцію з графічної бібліотеки за умови, якщо він сам її обере з попередньо виведеного на екрані головного меню. При введенні значення певного параметру обов'язково здійснювати його перевірку на коректність задання. У разі неправильного значення виводити на дисплей повідомлення відповідного змісту та дати змогу ввести нове значення. Одразу ж після вибору пункту головного меню ( один із яких дає можливість завершення програми ) повинно з'являтись підменю із запитом про задання властивостей рисування означеного об'єкту. Аналогічно здійснюється перевірка введених користувачем значень на коректність. Після демонстрації обраної функції на екрані знову з'являється головне меню, що дає змогу повторного вибору функції для рисування, також з його допомогою можна реалізувати вихід із поточного демонстраційного середовища.
Оскільки у різних меню ( орієнтованих на ілюстрацію певної властивості ) є підменю, що повторюються ( наприклад колір рисування, стиль лінії, стиль заповнення, координати точок тощо ), то доцільним у даному випадку буде використання окремих процедур ( підпрограм ), які забезпечуватимуть вивід на екран того чи іншого підменю.
Для виводу меню найбільш доцільним є використання текстового режиму, для цього раціональним буде створення підпрограми ініціалізації графічного режиму і застосовувати її безпосередньо перед прорисовуванням малюнку і одразу ж після демонстрації кінцевого результату знову повертатись у текстовий режим з допомогою спеціальної функції закриття графічного режиму int closegraph ( void ) для рисування на екрані головного меню.
У ході програми реалізувати:
Встановлення кольору фону;
Встановлення піксела в означеному користувачем місці екрану;
Рисування лінії до вказаної точки;
Рисування лінії між двома вказаними позиціями;
Малювання кола;
Малювання еліпса;
Малювання заповненого еліпса;
Рисування сектора;
Малювання прямокутника;
Малювання заповненого прямокутника;
Малювання паралелепіпеда;
Рисування багатокутника;
Рисування заповненого багатокутника;
Використання динамічної пам'яті для побудови рухомих об'єктів;
Завантаження палітри;
Завантаження RGB-палітри.
АЛГОРИТМ РОЗВ'ЯЗКУ ЗАДАЧІ
Реалізацію поставленої задачі слід виконувати послідовністю дій, наведених у блок-схемі:
ПРОГРАМНА РЕАЛІЗАЦІЯ АЛГОРИТМУ
Загальна характеристика програми:
Ім'я програми
Назва файла
Мова програмува-ння
Розмір програми
байти/рядки
StandartGraphLib
Coursewk.cpp
C++
20642/1040
Призначення програми:
Розглядувана програма має на меті демонстрацію властивостей стандартної графічної бібліотеки мови програмування С++ при вибірковій реалізації процедур рисування графічних примітивів. Вона може використовуватись для ознайомлення програмістів-початківців із можливостями даного програмного середовища при одночасному вказуванні на ті параметри та розміри, які мають бути вказані для того, щоб зреалізувати використання тієї чи іншої побудови.
Параметри програми:
При написанні даного продукту були задіяні такі стандартні графічні процедури малювання, як:
Void setbkcolor (int col) - встановлення кольору фону;
Void putpixel (int x, int y, int col) - встановлення піксела із заданими параметрами;
Void lineto (int x, int y) - рисування лінії від поточної до вказаної позицій екрану;
Void line (int xs, int ys, int xe, int ye) - рисування лінії між двома позиціями екрану;
Void circle (int x, int y, int radius) - малювання в заданому центрі з вказаним радіусом;
Void arc (int x, int y, int stangle, int andangle, int radius) - малювання дуги за заданим центром, початковим та кінцевим кутами та радіусом;
Void ellipse (int x, int y, int xradius, int yradius) - рисування еліпса з означеним центром та півосями;
Void fillellipse (int x, int y, int xradius, int yradius) - рисування еліпса з означеним центром та півосями, зарисовування його згідно з ораним стилем;
Void sector (int x, int y, int stangle, int andangle, int xradius, int yradius) - рисування сектора з означеним центром, початковим і кінцевим кутами та півосями;
Void pieslice (int x, int y, int stangle, int andangle, int radius) - рисування фрагменту шматкової діаграми з означеним центром, початковим і кінцевим кутами та радіусом;
Void rectangle (int left, int top, int right, int bottom) - малювання прямокутника за вказаними лівою верхньою та правою нижньою вершинами;
Void bar (int left, int top, int right, int bottom) - малювання зарисованого прямокутника за вказаними лівою верхньою та правою нижньою вершинами і обраним стилем заповнення;
Void bar3d (int left, int top, int right, int bottom, int depth, int topflag) - малювання зарисованого паралелепіпеда за вказаними лівою верхньою та правою нижньою вершинами і обраним стилем заповнення, наявністю видимості зовнішньої вершини;
Void drawpoly (int numpoints, int polypoints[ ]) - прорисовування багатокутника за вказаною кількістю вершин та масивом, де містяться їх координати;
Void fillpoly (int numpoints, int polypoints[ ]) - прорисовування заповненого багатокутника за вказаною кількістю вершин, масивом, де містяться їх координати та стилем заповнення;
Void outtextxy (int x, int y, char* textstring) - виведення означеного тексту відносно вказаних кординат;
Int setrgbpalette (int colornum, int red, int green, int blue) - встановлення палітри за кількістю кольорів та вказанням їх червоної, зеленої та синьої компонент;
Int setpalette (int colornum, int color [ ]) - встановлення палітри за кількістю кольорів та місцем їх знаходження.
Для реалізації вищезгаданих функцій рисування було використано цілий ряд "невидимих" для користувача процедур, ось деякі з них:
Int initgraph (int grdr, int grmd, char* path) - процедура, яка ініціалізує графічні побудови за заданими графічним драйвером, графічним режимом та та шляхом до драйвера, у разі некоректного задання параметрів повертає відповідний код помилки;
Void closegraph (void) - завершує попередньо ініціалізований графічний режим та здіснює повернення до текстового;
Void setcolor (int col) - встановлення обраного кольору малювання;
Void setlinestyle (int linestyle, int upattern, int thickness) - встановлення стилю лінії рисування за палітрою та товщиною;
Void setfillstyle (int pattern, int col) - встановлення стилю заповнення за палітрою та обраним кольором;
Void settextjustify ( int horiz, int vert) - встановлення точки прив'язки для виведення тексту;
Void settextstyle (int font, int dir, int charsize) - встановлення стилю тексту для виведення за шрифтом, напрямком виведення та розміром літер.
Структура програми:
Void menu (void) - функція виведення головного меню;
Void color_menu (void) - виведення підменю кольорів;
Void widht_menu (int x, int y) - виведення підменю товщин ліній;
Void fillstyle_menu (int x, int y) - виведення підменю стилей заповнення;
Void linestyle_menu (int x, int y) - виведення підменю стилей ліній;
Void point_menu (int x, int y) - виведення підменю запиту координат точки;
Void points_menu (int x, int y) - виведення підменю запиту координат точок;
Void angles_menu (int x, int y) - виведення підменю запиту кутів;
Void font_menu (int x, int y) ) - виведення підменю шрифтів;
Void direction_menu (int x, int y) - виведення підменю напрямків виведення;
Void draw_arrow (int col, int size) - рисування малюнку;
Void message (void) - виведення повідомлення про помилку;
Void test_color (void) - перевірка введеного значення кольору;
Void test_linestyle (int mp) - перевірка введеного значення стилю лінії;
Void test_fillstyle (int mp) - перевірка введеного значення стилю заповнення;
Void test_nump (int mp) - перевірка введеного значення номера процедури;
Void test_widht (int mp) - перевірка введеного значення товщини лінії;
Void test_pointx (int mp) - перевірка введеного значення координати по х;
Void test_pointy (int mp) - перевірка введеного значення координати по у;
Void test_topflag (int mp) - перевірка введеного значення прапорця;
Void error_test (int np) - загальна перевірка на помилки введених значень;
Void process (int np) - опрацювання даних;
Void process1 (int np) - опрацювання даних функцією poly;
Void process2 (int np) - опрацювання даних функцією fillpoly;
Void background (void) - рисування кольору фону;
Void pixel_lineto (void) - рисування піксела та лінії від нього;
Void line (void) - малювання лінії;
Void circle (void) - малювання кола;
Void arc (void) - малювання дуги;
Void ellipse (void) - рисування еліпса;
Void fillellipse (void) - рисування заповненого еліпса;
Void sector (void) - рисування сектора;
Void pieslice (void) - малювання шматкової діаграми;
Void rectangle (void) - встановлення прямокутника;
Void bar (void) - встановлення заповненого прямокутника;
Void bar3d (void) - встановлення заповненого еліпса;
Void poly (void) - рисування багатокутника;
Void fillpoly (void) - рисування заповненогобагатокутника;
Void outtext (void) - виведення тексту;
Int setrgbpalette (void) - завантаження RGB палітри;
Int setpalette (void) - завантаження палітри;
Int dynam_mem (void) - демонстрація "рухомих" об'єктів;
Void functn (int a) - передача управління на обрану функцію;
Void proc (void) - опрацювання головного меню;
Таблиця ідентифікаторів:
Ідентифі-катор
Тип
Розмір-ність
Вид
даних
Значення
A
Int
2
Вхідна
Містить номер функції для демонстрації по порядку
I
Int
2
Проміжкова
Використовується у різноманітних функціях та для передачі у інші підпрограми реалізації певної дії
J
Int
2
Проміжкова
Використовується у лічильниках з метою запам'ятовування порядкового номера поточного підменю
T
Int
2
Проміжкова
Прапорець (приймає значення 0 або 1 ) відповідно до якого здійснюється повторний ввід даних
Num
Int
2
Вхідна
Кількість вершин багатокутника
Point
Struc
4
Проміжкова
Одиниця координати точки, відносно якої має здійснюватись введення вхідної інформації
Coords [25]
Point
4*25=100
Проміжкова
Містяться координати точок, відносно яких має здійснюватись введення вхідної інформації
Mas [20]
Int
2*20=40
Вхідна
Вміст: координати точок для рисування багатокутника
Choice [12]
int
2*12=24
вхідна
Містяться дані, що передаються у процедури як відповідні параметри для прорисовування об'єктів
Вхідна інформація:
При запуску програми на екрані з'являється головне меню, на якому відображені усі можливі пункти вибору для передачі управління в процедуру, метою якої є прорисовування стандартного графічного примітиву. Введені дані зчитуються у спеціально створений з цією метою масив і передаються в спеціальну підпрограму для перевірки на коректність. Якщо виявлено помилку на даному рівні функціонування програми, то на дисплей виводиться відповідне повідомлення, що супроводжується звуковим сигналом, після цього існує необхідність повторного вводу вхідних даних. Далі перевірка на правильність здійснюється аналогічно.
Якщо дані введено вірно, то на екрані знову з'являється меню, але цього разу в його склад входять декілька підменю для задання відповідних параметрів стосовно реалізації конкретної процедури. Так само як і у попередньому пункті реалізувати перевірку на правильність введених параметрів.
Після демонстрації кінцевого результату на екрані знову з'являється головне меню, після чого далі можна обирати для перегляду функції або ж здійснити вихід із програми.
Вихідна інформація:
Одразу ж після введення даних у підменю на екрані з'являється обраний для демонстрації рисунок. Тепер зникає можливість зміни розмірів та властивостей об'єкту. Малюнок перебуватиме на дисплеї доти, поки користувач не натисне будь-яку клавішу.
Середовище реалізації програми:
Для того, щоб дана програма функціонувала повноцінно, необхідно у директорію з якої її завантажують помістити ряд файлів ( наприклад egabgi, файли, що містять шрифти тощо ) або ж сам виконавчий модуль скопіювати у піддиректорію BGI програмного середовища С++. У випадку, якщо цього не зробити, результатом виконання програми буде лише виведення повідомлення про помилку при вказуванні шляху до графічного драйвера.
КОНТРОЛЬНІ ПРИКЛАДИ
Після запуску програми з'являється головне меню з переліком функцій, що пропонуються для демонстрації:
FUNCTION TO DRAW
Background color
Pixel & line from it
Line
Circle
Arc
Ellipse
Fill ellipse
Sector
Pieslice
Rectangle
Bar
Three-dimensional bar
Polygon
Fill polygon
Print the text
Setting the RGB palette
Setting the palette
Using dynamic memory
Exit
Enter choice: 4
DRAWING THE CIRCLE
Colors: X coordinate: 300
black Y coordinate: 200
blue
green
cyan Radius: 150
red
magenta
brown
lightgray
darkgray
lightblue
lightgreen
lightcyan
lightred
lightmagenta
yellow
white
Enter choice: 7
Після введення таких даних на дисплеї з'явиться зображення:
Одним із недоліків є те, що при виборі чорного кольору рисування ми не зможемо побачити результату, оскільки колір фону є також чорним.
ВИСНОВКИ
Дана програма служить для ознайомлення із основними принципами функціонування графічного середовища на програмному рівні мови С++. Тут ілюструються усі функції рисування простих геометричних фігур, реалізація яких означена системно програмним середовищем. Вибір функцій та малювання здійснюється за значеннями, заданими безпосередньо самим користувачем. Оскільки щоразу після введення вхідних даних здійснюється їх перевірка на правильність, то коректність функціонування програми гарантується.
Так як завантаження палітри потребує наявності певних знань про послідовність, кількість та місце розташування ресурсів, то ця процедура здійснюється програмно, при цьому на дисплей виводиться відповідне повідомлення .
При подальшому вдосконаленні цього програмного продукту можна здійснювати завантаження палітри за повними інструкціями користувача, однак цей підхід не буде доцільним, оскільки розглядуване середовище слугує в основному для ознайомлення з можливостями графічного режиму роботи програмістів-початківців, а, отже, під цим розуміється обмеженість знань про механізм його роботи.
Можливі подальші покращення стосовно виведення та вибору пунктів меню, однак вони будуть несуттєвими.
Для того, щоб інтерфейс був більш прийнятнішим для користувача, можна здійснити його покращення шляхом використання графічного режиму для виведення програмних запитів та виведення різноманітних підказак щодо розмірів параметрів.
Вцілому дана програма демонструє усі наочні функції рисування, а у її ході застосовано практично весь набір процедур, прототипи яких містяться у файлі graphics.h.
СПИСОК ЛІТЕРАТУРИ.
1) Довгаль С. І., Литвинов Б.Ю., Сбитнев А.І. Персональные
ЭВМ: обьектное програмирование, локальные сети.
Учебное пособие. - Информ система сервис,
1993.
2) Фаронов В.В., Програмивание на персональных ЭВМ в среде
C - МГТУ,1991.
3) Бартків А.Б., Гринчишин Я.Т., Ломакович А.М.,
Римський Ю.С. Turbo C: алгоритми і програми. – Вища
школа, 1992.
4) Герберт Шилдт, Справочник програмиста . - "Вильямс", 2000.
5) Зуев Е.А., Язык програмирования Turbo Pascal 6.0. – Унитех,
1992.
6) Попиков Д.Б., Круглов И.Ю. Програмирование в среде Tubo C
- МАИ а/о “РосВУЗНаука”, 1992.
ДОДАТОК
Реалізація алгоритму мовою С++
#include <graphics.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
char *Colors[] = {
"1.black\n","2.blue\n","3.green\n","4.cyan\n","5.red\n","6.magenta\n",
"7.brown\n","8.lightgray\n","9.darkgray\n","10.lightblue\n","11.lightgreen\n",
"12.lightcyan\n","13.lightred\n","14.lightmagenta\n","15.yellow\n",
"16.white\n"
};
char *FillPatterns[]={
"1.empty\n","2.solid\n","3.line\n","4.ltslash\n","5.slash\n","6.ltbkslash\n",
"7.hatch\n","8.xhatch\n","9.interleave\n","10.wide dot\n","11.close dot\n",
};
char *LineStyles[] = {
"1.solidln\n","2.dottedln\n","3.centerln\n","4.dashedln\n","5.userbitln\n"
};
char *Widhtes[]={
"1.normal(1)\n","2.thick(3)\n"
};
char *Fonts[]={
"1.default\n","2.triplex\n","3.small\n","4.sans serif\n","5.gothic\n",
"6.script\n","7.simplex\n","8.triplex scr\n","9.complex\n","10.european\n",
"11.bold\n"
};
char *Func[]={
"1.Background color\n","2.Pixel & line from it\n","3.Line\n","4.Circle\n",
"5.Arc\n","6.Ellipse\n","7.Fill ellipse\n","8.Sector\n","9.Pieslice\n",
"10.Rectangle\n","11.Bar\n","12.Tree-dimensional bar\n","13.Polygon\n",
"14.Fill polygon\n","15.Print text\n","16.Setting the RGB palette\n",
"17.Setting the palette\n","18.Using dynamic memory\n","19.Exit\n"
};
struct point{
int x;
int y;
} coords[24];
int choice[12],mas[20];
int i,j,t,num;
void init()
{ int GraphDriver,GraphMode,errorcode;
GraphDriver = DETECT;
initgraph( &GraphDriver, &GraphMode, "" );
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
void menu(void)
{
clrscr();
init();
closegraph();
printf(" FUNCTION FOR DEMONSTRATION:\n");
for(i=0;i<19;i++)
printf(Func[i]);
printf("\n");
printf("Enter choice:");
}
void color_menu(void)
{
printf("Colors:\n");
for(i=0;i<16;i++)
printf(Colors[i]);
printf("\n");
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void widht_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Widhtes:\n");
gotoxy(xs,++ys);
printf(Widhtes[0]);
gotoxy(xs,++ys);
printf(Widhtes[1]);
gotoxy(xs,ys+2);
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void fillstyle_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Fill styles:\n");
for(i=0;i<11;i++){
gotoxy(xs,++ys);
printf(FillPatterns[i]);
}
gotoxy(xs,ys+2);
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void linestyle_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Line styles:\n");
for(i=0;i<5;i++){
gotoxy(xs,++ys);
printf(LineStyles[i]);
}
gotoxy(xs,ys+2);
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void point_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("X coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
gotoxy(xs,++ys);
printf("Y coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void points_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Start point:\n");
gotoxy(xs,++ys);
printf("X coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
gotoxy(xs,++ys);
printf("Y coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
ys+=1;
gotoxy(xs,++ys);
printf("End point:\n");
gotoxy(xs,++ys);
printf("X coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
gotoxy(xs,++ys);
printf("Y coordinate:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void angles_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Start angle:");
coords[j].x=wherex();
coords[j++].y=wherey();
gotoxy(xs,++ys);
printf("End angle:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void font_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Font:\n");
for(i=0;i<11;i++){
gotoxy(xs,++ys);
printf(Fonts[i]);
}
gotoxy(xs,ys+2);
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void direction_menu(int xs,int ys)
{
gotoxy(xs,ys);
printf("Direction:\n");
gotoxy(xs,++ys);
printf("1.horizontaly");
gotoxy(xs,++ys);
printf("2.verticaly");
gotoxy(xs,ys+2);
printf("Enter choice:");
coords[j].x=wherex();
coords[j++].y=wherey();
}
void draw_arrow(int x,int y)
{
moveto(x,y);
setcolor(choice[0]-1);
linerel(4*choice[1], 0);
linerel(-2*choice[1], -1*choice[1]);
linerel(0, 2*choice[1]);
linerel(2*choice[1], -1*choice[1]);
}
void message(void)
{
gotoxy(30,25);
printf("Error:illegal size. Try again.\a\a\a");
delay(1500);
gotoxy(30,25);
printf(" ");
}
void test_color(void)
{
if((choice[0]<1)||(choice[0]>16)){
message();
t=1;
}
else t=0;
if(t){
gotoxy(coords[i].x,coords[i].y);
printf(" ");
}
}
void test_linestyle(int mp)
{
if((choice[mp]<1)||(choice[mp]>5)){
message();
t=1;
}
else t=0;
if(t){
gotoxy(coords[i].x,coords[i].y);
printf(" ");
}
}
void test_fillstyle(int mp)
{
if((choice[mp]<1)||(choice[mp]>11)){
message();
t=1;
}
else t=0;
if(t){
gotoxy(coords[i].x,coords[i].y);
printf(" ");
}
}
void test_nump(int mp)
{
if((choice[mp]<1)||(choice[mp]>10)){
message();