Дослідження зміни температури термопари за допомогою чисельних методів на ЕОМ

Міністерство освіти і науки України

	Вінницький національний технічний університет

	Інститут автоматики електроніки та комп’ютерних систем управління

	

	

	

	

	Кафедра комп’ютерних

	систем управління

	

	

	ДОСЛІДЖЕННЯ ЗМІНИ ТЕМПЕРАТУРИ ТЕРМОПАРИ ЗА ДОПОМОГОЮ ЧИСЕЛЬНИХ МЕТОДІВ НА ЕОМ

	

	

	КУРСОВА РОБОТА

	

	З дисципліни ”Обчислювальні методи та застосування ЕОМ”

	

	

	

	

	

	

	

	

	

	

	2004

	
Міністерство освіти і науки України

	Вінницький національний технічний університет

	Інститут автоматики електроніки та комп’ютерних систем управління

	Кафедра комп’ютерних систем управління

	

			Затверджено на

	засіданні кафедри КСУ 

	Протокол №__________

	”___”__________ 2004 р.

	

	ІНДИВІДУАЛЬНЕ ЗАВДАННЯ

	на виконання курсової роботи

	

	на тему ”Дослідження зміни температури термопари за допомогою чисельних методів на ЕОМ ”

	з дисципліни „ Обчислювальні методи та застосування ЕОМ”

	

	Дослідження зміни температури термопари за допомогою чисельних методів на ЕОМ.

	В приведеній тарировочній таблиці для термопари дані показання вольтметра при зміні температури з постійним кроком:

	

	Т0

	0

	20

	40

	60

	80

	100

	QмВ

	-0,670

	-0,254

	0,171

	0,609

	1,057

	1,517

	

	Використовуючи інтерполяцію по Лагранжу і Ньютону, знайти показання вольтметра при Т0=270; 320; 550; 750; 670С. Оцінити похибку методів інтерполяції [1,3] . Зробити висновки.

	

	
Анотація 

	

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

	

	
Зміст

	

	Вступ 

	1.Огляд і варіантний аналіз чисельних методів моделювання зміни температури термопари

	1.1 Основні поняття і визначення

	1.2 Класифікація методів рішення поставленої задачі

	1.3.Опис методів моделювання зміни температури термопари на ЕОМ

		1.3.1. Інтерполяційний многочлен Лагранжа

		1.3.2 .Перший інтерполяційний многочлен Ньютона

	1.3.3. Другий інтерполяційний многочлен Ньютона

		1.3.4. Інтерполювання функцій за схемою Ейткіна

	1.3.5. Сплайн-інтерполяція

	1.4. Уточнена постановка задачі

	2. Розробка алгоритмів моделювання зміни температури термопари за допомогою чисельних методів на ЕОМ 

	2.1. Планування вхідних та вихідних даних

	2.2 Аналіз задач, які вирішуються при дослідженні зміни температури термопари на ЕОМ

	2.3 Описовий алгоритм головної програми

	2.4 Схема алгоритму головної програми

	2.5 Опис основних функцій моделювання 

	2.6 Структура комплексу програм для дослідження зміни температури термопари

	3. Лістинг програми.

		3.1 Лістинг головної програми INTERP.CPP

		3.2 Лістинг модуля MENYS.H

	4. Розробка тестів та аналіз результату тестування

	4.1 Опис тестів

	4.2 Аналіз результатів тестування

	5. Оцінка похибок результатів експериментальних досліджень

	6. Оцінка ефективності комплексу програм для дослідження

	7. Розробка пакету документів для супроводження комплексу програм

	7.1 Розробка інструкції програмісту

	7.2 Інструкція користувачеві

	Висновки

	Використана література

		Додаток А. Технічне завдання.

		Додаток Б. Лістинги модулів

		Додаток В. Структура дискети.

	

	
Вступ

	

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

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

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

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

	

	
1 Огляд і варіантний аналіз чисельних методів моделювання термопари

	

	1.1 Основні поняття та визначення

	

	Нехай на відрізку [а; b] визначено певний клас функцій {Р(х)}, наприклад клас алгебраїчних многочленів, а в точках х0, х1,..., хn цього проміжку задано значення деякої функції y=f(x): y0=f(x0), y1=f(x1),….yn=f(xn). 

	Інтерполяція – це наближена заміна функції f на відрізку [а; b] однією з функцій Р(х) цього класу так, щоб функція P(х) в точках x0,x1, ..., xn набувала тих самих значень, що й функція f, тобто щоб Р(xi)= уi (і = 0, 1, ..., n). На Рис.1.1.1 зображена інтерполяція функції.

	

	

	

	Вузли інтерполювання – це точки х0, хi, ..., хn, в яких задана функція.

	Функція Р(х) називається інтерполюючою функцією. 

	Інтерполяційна формула – це формула у=P(х), за допомогою якої обчислюють значення функції f у проміжку [а;b].

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

	Інтерполяційний многочлен – це многочлен виду Рn(х), який задовольняє умови  , наближену рівність f(x)=Pn(x) називають інтерполяційною формулою, а різницю Rn(f,x)=f(x) – Pn(x) — залишковим членом інтерполяційної формули. Хоч інтерполяційний многочлен і єдиний, проте можливі різні форми його запису. Інтерполяційний поліном має слідуючий вид:

	

	 (1.1)

	

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

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

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

	Нехай у таблиці задана  точка  і треба знайти апроксимувальну криву  в діапазоні  (рисунок 1.1.2.). В цьому випадку похибка в кожній табличній точці буде  Тоді сума квадратів похибок визначається виразом:

	

	 (1.2)

	

	


	

	Як правило, функцію  обирають у вигляді лінійної комбінації вибраних функцій :

	

	 (1.3)

	

	Умова мінімуму Е визначається рівнянням:

	

	 (1.4)

	

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

	Залишкова середня квадратична похибка апроксимації оцінюється:

	

	 (1.5)

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

	

	, якщо 

	

	Коефіцієнти визначаються зі співвідношень

	

	 (1.6)

	

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

	

	1.2 Класифікація методів

	

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

	На Рис.1.2.1 приведено класифікацію чисельних методів обробки результатів експерименту.

	

	


	

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

	Інтерполяцію даних проводять тоді, коли:

	1) функцію задано таблично для деяких значень аргументу, а треба знайти її значення для значень аргументу, яких у таблиці немає;

	2) функцію задано графічно, наприклад за допомогою самописного приладу, а треба знайти її наближений аналітичний вираз;

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

	

	
1.3 Опис методів моделювання зміни температури термопари на ЕОМ

	

	Охарактеризуємо основні методи інтерполяції, які приведені на рис.1.2.1. 

	

	1.3.1 Інтерполяційний многочлен Лагранжа

	Інтерполяція за Лагранжем вживається в загальному випадку для довільно розташованих вузлів.

	Інтерполяційний поліном для методу Лагранжа представлений у вигляді:

	

	, (1.7)

	

	де всі  (j=0,…, n) – поліноми ступеня n, коефіцієнти яких можна знайти з допомогою (n+1) рівняння: .

	Для полінома, який шукаємо, отримаємо:

	

	 (1.8)

	

	Формулу (1.8) називають інтерполяційний многочлен Лагранжа.

	Треба відзначити дві головні властивості поліномів Лагранжа:

	

	 (1.9)

	

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

	Похибка при інтерполяції за Лагранжем може бути оцінена таким чином: 

	

	 (1.10)

	

	де .

	

	1.3.2 Перший інтерполяційний многочлен Ньютона.

	Інтерполяційний поліном випадку має вигляд:

	

	...

	...+,  (1.11)

	

	Коефіцієнти  знаходять з рівнянь:

	

	,, (1.12)

	

	(1.13)

	

	Формула (1.13) носить назву першої інтерполяційної формули Ньютона. Цей вираз незручний для інтерполяції поблизу останніх значень . 

	Похибка інтерполяції для першої формули Ньютона можна оцінити відповідно як:    (1.14)

	де  (1.15)

	

	1.3.3 Другий інтерполяційний многочлен Ньютона

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

	

	

	 (1.16)

	

	Коефіцієнти  визначаються таким чином:

	

	,  (1.17)

	(1.18)

	

	 – ліва різниця першого порядку в точці ,

	

	(1.19)

	

	 – ліва різниця другого порядку.

	

	   (1.20)

	

	  (1.21)

	

	Формула (1.21) є кінцевим виразом для другої інтерполяційної формули Ньютона.

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

	

	  (1.22)

	

	де  (1.23) 

	

	1.3.4 Інтерполювання функцій за схемою Ейткіна

	Особливістю інтерполяційної схеми Ейткіна є однотипність обчислень. Якщо в (n+1)-му вузлах інтерполювання xi (i=0,1,…,n) функція f набуває значеньyi (i=0,1,…,n),то значення інтерполяційного многочлена степеня n в точці , що не зберігається з вузлами інтерполювання, обчислюють за формулою Ейткіна:

	

	 (1.24)

	

	де  і – значення інтерполяційних многочленів (n-1)-го степеня, обчислених у точці х на попередньому кроці обчислень.

	Отже, щоб обчислити в точці х значення інтерполяційного многочлена n-го степеня за схемою Ейткіна, треба в цій точці обчислити значення n лінійних, n-1 квадратичних, n-2 кубічних многочленів, два многочлени (n-1)-го степеня і, нарешті, один многочлен n-го степеня.

	
1.3.5 Сплайн-інтерполяція 

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

	Наприклад, у випадку, який показаний на рисунку 1.3.1, необхідно задати всі кубічні функції  В найбільш загальному випадку ці багаточлени мають такий вигляд:

	

	 i=1,2, ... ,m (1.25)

	

	де  – постійні, які визначені вказаними умовами (j= 1,2,3,4).

	Перші (2m) умов потребують, щоб сплайни стикалися в заданих точках:

	,i=1, 2, ... , m,

	,   i=0, 1, ... , m-1.  (1.26)

	

	Наступні (2m-2) умов потребують, щоб в місцях дотику сплайнів були рівні перші та другі похідні

	

	 i=1, ... , m-1, (1.27)

	 i=1, ... , m-1.

	

	

	
Система алгебраїчних рівнянь має розв’язок, якщо кількість рівнянь дорівнює кількості невідомих. Для цього необхідні ще два рівняння. Як правило, використовують такі додаткові умови:

	

	  (1.28)

	

	Отриманий таким чином сплайн зветься “природним кубічним сплайном”. 

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

	

	1.4 Уточнена постановка задачі

	

	Нехай на відрізку [а; b] визначено певний клас функцій {Р(х)}, наприклад клас алгебраїчних многочленів, а в точках х0, х1,..., хn цього проміжку задано значення деякої функції y=f(x): y0=f(x0), y1=f(x1),….yn=f(xn). Наближену заміну функції f на відрізку [а; b] однією з функцій Р(х) цього класу так, щоб функція P(х) в точках x0,x1, ..., xn набувала тих самих значень, що й функція f, тобто щоб Р(xi)= уi (і = 0, 1, ..., n), називають інтерполюванням, або інтерполяцією. Точки х0, хi, ..., хп називають вузлами інтерполювання, функцію Р(х) — інтерполюючою функцією, а формулy у=P(х), за допомогою якої обчислюють значення функції f у проміжку [а;b], — інтерполяційною формулою.

	З геометричного погляду задача інтерполювання полягає в знаходженні кривої у= Р(х) певного класу, яка проходить через точки площини з координатами (хi, уi) 

	(i = 0, 1, ....,n) (рис.1.1.1).

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

	У деяких випадках доцільніше використовувати інші класи інтерполюючих функцій. Якщо, наприклад, функція f періодична, то функцію Р(х) природно вибирати з класу тригонометричних многочленів, а якщо функція f перетворюється в нескінченність у заданих точках або поблизу них, то функцію Р(х) доцільно вибирати з класу раціональних функцій.

	Розглядатимемо лише задачу параболічного інтерполювання, яку сформулюємо так: в n+1 різних точках х0, x1,..., хn задано значення      

	функції f: y0=f(x0), y1=f(x1),…, yn=f(xn) і треба побудувати многочлен

	

	 (1.29)

	

	степеня n, який задовольняв би умови

	

	  (1.30)

	

	Для визначення n+1 коефіцієнтів многочлена (1.29), який задовольняє умови (1.30), запишемо систему (n+1)-го лінійних рівнянь виду:

	

	  (1.31)

	

	Ця система має єдиний розв'язок, бо її визначник є визначником Вандермонда, який не дорівнює нулю, бо вузли xi=(i=0,1,…,n) різні. А тому й задача параболічного інтерполювання має єдиний розв'язок, тобто існує єдиний алгебраїчний многочлен виду (1.29), що задовольняє умови (1.30). Многочлен Рn(х), який задовольняє умови (1.29), називають інтерполяційним многочленом, наближену рівність f(x)=Pn(x) – 

	інтерполяційною формулою, а різницю Rn(f,x)=f(x) – Pn(x) — залишковим членом інтерполяційної формули. Хоч інтерполяційний многочлен, що задовольняє умови (1.29), і єдиний, проте можливі різні форми його запису.

	Інтерполяційний многочлен будують тоді, коли:

	1) функцію задано таблично для деяких значень аргументу, а треба знайти її значення для значень аргументу, яких у таблиці немає;

	2) функцію задано графічно, наприклад за допомогою самописного приладу, а треба знайти її наближений аналітичний вираз;

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

	

	
2 Розробка алгоритмів моделювання зміни температури термопари за допомогою чисельних методів на ЕОМ 

	

	2.1 Планування вхідних та вихідних даних 

	

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

	Дані, які вводяться для обчислення зміни температури термопари мають тип float, тобто вони можуть приймати як цілі, так і дробові значення на інтервалі 3.4*10-38 до 3.4* 1038. Всі вхідні та вихідні данні можна звести в таблицю.

	

	Таблиця 2.1.1 Вхідні та вихідні данні

	№

	Назва змінної

	Ідентифікатор

	Межі зміни

	Тип

	1

	Значення Т

	x[N]

	3.4*10-38 -3.4* 1038

	float

	2

	Значення QмВ

	y[N]

	3.4*10-38 -3.4* 1038

	float

	3

	Значення температури

	Tt

	3.4*10-38 -3.4* 1038

	float

	4

	Значення температури

	Ttn

	3.4*10-38 -3.4* 1038

	float

	5

	Результат по Лагранжу

	FLTt

	1,7Е-308…1,7+308

	double

	6

	Результат по Ньютону

	FNTt1

	1,7Е-308…1,7+308

	double

	7

	Похибка

	E

	3.4*10-38 -3.4* 1038

	float

	

	2.2 Аналіз задач, які вирішуються при дослідженні зміни температури термопари на ЕОМ

	

	Як відомо, термопара – це найпростіше замкнене електричне коло, що складається з двох різнорідних провідників (чи напівпровідників). 

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

	програма дає змогу інженеру отримати інформацію про температуру провідників, що входять до складу термопари при певній напрузі, яку показує вольтметр;

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

	зручний інтерфейс, дає змогу інженеру підібрати групу матеріалів по характеристикам , що відповідають запитам, навіть самого прискіпливого клієнта;

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

	

	2.3 Описовий алгоритм головної програми

	

	Основна програма працює в режимі двухрівневого меню, яке розроблене в Turbo C. В розробленій програмі використовується меню, тобто всі функції можуть використовуватись нескінченну кількість разів. Така властивість забезпечується завдяки використанню циклу в головній програмі, вихід з якого здійснюється лише при одній умові : вибір пункту меню „Вихід”.

	Головне меню містить такі пункти: 

	- “Довідка”;

	-“Тестування ”;

	-„Результати”;

		„Вихід ”.

	1. Пункт меню „ Довідка ” включає в себе такі пункти підменю:

	“Про автора ”, яке містить короткі відомості про автора програми;

	„Про програму ” - за допомогою якого ми можемо переглянути коротке описання програми.

	2.Пункт меню „Тестування” включає в себе пункти підменю:

	“Тест 1” - за допомогою якого ми можемо протестувати дану програму за першим інтерполяційним многочленом Ньютона та Лагранжа;

	„Тест 2 ” - за допомогою якого ми можемо протестувати дану програму за другим інтерполяційним многочленом Ньютона та Лагранжа;

	3.Пункт меню „Результати” включає в себе такі пункти підменю:

	“В файл ” - за допомогою якого ми можемо записати нові тестування у вказаний файл;

	„На екран ” – за допомогою якого ми можемо вивести на екран результати тестування;

	„На друк ” - за допомогою якого ми можемо вивести результати тестування на друк.

	4. Пункт меню „Вихід” дає змогу користувачеві вийти з даної програми.

	

	2.4 Схема алгоритму головної програми

	

	

	Рисунок 2.4.1 Логічна схема керуючої програми

	


	Рисунок 2.4.2 Логічна схема підменю „Довідка”

	

	

	Рисунок 2.4.3 Логічна схема підменю „Тестування”

	

	

	Рисунок 2.4.4 Логічна схема підменю „Результати”.

	

	

	Рисунок 2.4.5 Логічна схема підменю „Вихід ”.

	
2.5 Опис основних функцій моделювання 

	

	Перелік функцій CALC.H:

	double stepin(double x1,int f) – піднесення числа до степені f;

	double faktorial(int k) – факторіал числа k;

	double GetA(int i) – отримання множника а для першої інтерполяційної формули Ньютона;

	double IntNuton1(double X1) – обчислення по першій інтерполяційній формулі Ньютона;

	double GetВ(int i) – отримання множника а для другої інтерполяційної формули Ньютона;

	double IntNuton2(double X1) – обчислення по другій інтерполяційній формулі Ньютона;

	double IntLang(double X1) – обчислення по Лагранжу.

	

	2.6 Структура комплексу програм для дослідження зміни температури термопари

	

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

	Розбивання програми на модулі (бібліотеки) дозволяє згрупувати функції за певним їх призначенням, що призводить до зменшення помилок в програмі та легкого їх пошуку.

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

	

	
Таблиця 2.6.2. Список бібліотек, які використовуються.

	Назва модуля

	Принадлежність

	Опис

	STDIO.H

	Стандартна бібліотека

	Функції вводу-виводу

	CONIO.H

	Стандартна бібліотека

	Функції роботи з екраном(консолью)

	IOSTREAM.H

	Стандартна бібліотека

	Потоки ввод-вивід

	DOS.H

	Стандартна бібліотека

	Спеціальні функції

	MATH.H

	Стандартна бібліотека

	Математичні функції

	MENYS.H

	Власна бібліотека

	Головне меню програми.Бібліотека з меню та кнопками.

	INTERP.CPP

	Власна бібліотека

	Основна програма.

	DIALOGS.H

	Власна бібліотека

	Бібліотека з вікнами для вводу тексту.

	CALC.H

	Власна бібліотека

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

	WIND.H

	Власна бібліотека

	Бібліотека малює вікна і панельки.

	

	
3 Лістинг програми

		

		3.1 Лістинг головної програми INTERP.CPP

	

	#include <stdio.h>

	#include "menys.h"

	#include <conio.h>

	#include <stdlib.h>

	#include <string.h>

	#include <process.h>

	/////////////////////////////////////////////////////////////////

	/////////////////////////////////////////////////////////////////

	void main(void)

	{

	grinit();

	init();

	while (1)

	{

	getcurcorpos();

	if (kbhit())

	if (getch()==0)

	if (getch()==45)break;

	};

	closegraph();

	

	}

	

		3.2 Лістинг модуля MENYS.H

		

	#include <graphics.h>

	#include <string.h>

	#include "wind.h"

	#include "edits.h"

	#include "calc.h"

	#include <stdlib.h>

	

	//---

	// =0 если клавиши подняты

	// =2 или на уровне панели

	const Flat=2;

	const coloron=10;

	const coloroff=1;

	const colordn=14;

	const colorhead=1;

	//----

	

	int OnPMenu=0, MenN2=0;

	float Tt=-1000, Ttn=-1000;// значення температури яку вводять

	double FLTt,FNTt1,FNTt2;

	

	char string[25],sd[25];

	float E;

	FILE *in;

	

	const colorsel=10;

	const colornotsel=1;

	const ButtonColor=7;

	

	const ButtonN=5;

	

	
const Meny1=2;

	const Meny2=2;

	const Meny3=3;

	const Meny4=0;

	const Meny5=0;

	const Meny6=0;

	

	const PMeny1=2;

	const PMeny2=2;

	

	int BoolMeny1=0;

	int BoolMeny2=0;

	int BoolMeny3=0;

	int BoolMeny4=0;

	int BoolMeny5=0;

	int BoolMeny6=0;

	

	int BoolPMeny1=0;

	int BoolPMeny2=0;

	

	void DoSome(int i);

	void windows(int x,int y,int xx,int yy,int color,char s[100],int p);

	

	class TButton

	{

	public:

	TButton();  //Конструктор

	~TButton(){};  //деструктор

	

	virtual void Draw();

	
void setwidth(int x){width=x;};

	void setheight(int x){height=x;};

	void settop(int x){top=x;};

	void setleft(int x){left=x;};

	virtual void setonoff(int x){onoff=x;Draw();};

	void setcol(int x){color=x;};

	void setcapt(char *x){caption=x;};

	

	int getwidth()const {return width;};

	int getheight()const {return height;};

	int gettop()const {return top;};

	int getleft()const {return left;};

	int getonoff()const {return onoff;};

	int getcol()const {return color;};

	const char* getcapt(){return caption;};

	

	virtual void mousemove(int i);

	

	virtual void setpos(int x,int y, char* capt,int i=0);

	

	protected:

	int width;

	int height;

	int top;

	int left;

	int onoff;

	int color;

	char *caption;

	};

	

	
class TMeny:public TButton

	{

	public:

	TMeny();

	~TMeny(){};

	

	virtual void Draw();

	virtual void setonoff(int x)

	{

	onoff=x;

	if (!onoff) color=colornotsel;

	else color=colorsel;

	Draw();

	};

	

	virtual void mousemove(int i);

	

	virtual void setpos(int x,int y, char* capt,int i=0);

	virtual void close(int p=0);

	

	};

	void DrowMenyAll(TMeny FirstMeny[],int FMeny, int p=0);

	//////////////////////////////////////////////////////////////////////////////

	

	//ОБЪЯВЛЕНИЕ ОБЪЕКТОВ

	

	///////////////////////////////////////////////////////////////////////////////////////////

	TButton button[ButtonN];

	TMeny FMeny1[Meny1],FMeny2[Meny2],FMeny3[Meny3],

	FPMeny2[PMeny2],FPMeny1[PMeny1];

	
//////////////////////////////////////////////////////////////////////////////////////////

	

	

	void TMeny::close(int p)

	{

	if (!p)

	{

	setonoff(0);

	mouseoff();

	putimage(xy1-2,yy1-2, arrow, 0);

	mouseon();

	free(arrow);

	}

	else

	{

	setonoff(0);

	mouseoff();

	putimage(xy1p-2,yy1p-2, arrowp, 0);

	mouseon();

	free(arrowp);

	}

	

	}

	void TMeny::mousemove(int i)

	{

	if (mousein(left,top,left+width,top+height))

	{

	if (!getbutton(1))

	{ //Не нажата

	if (!onoff) setonoff(1);

	if ((BoolMeny2)&&(!OnPMenu))

	switch (i)

	{

	case 0:

	

	if (BoolPMeny2)

	{

	FPMeny2[0].close(1);

	BoolPMeny2=0;

	}

	if (!BoolPMeny1)

	{

	DrowMenyAll(FPMeny1,PMeny1,1);

	BoolPMeny1=1;

	}

	break;

	case 1:

	if (BoolPMeny1)

	{

	FPMeny1[0].close(1);

	BoolPMeny1=0;

	}

	

	if (!BoolPMeny2)

	{

	DrowMenyAll(FPMeny2,PMeny2,1);

	BoolPMeny2=1;

	}

	break;

	}

	
}

	else

	{

	if ((onoff)&&(!(MenN2)))

	{

	//Нажата

	

	close(OnPMenu);

	

	if (BoolPMeny1)

	{

	

	if (BoolMeny2) FMeny2[0].close();

	DoSome(i+100);

	}

	else

	if (BoolPMeny2)

	{

	if (BoolMeny2) FMeny2[0].close();

	DoSome(i+110);

	}

	else

	if (BoolMeny1) DoSome(i+20); else

	if (BoolMeny2) DoSome(i+30);else

	if (BoolMeny3) DoSome(i+40);else

	if (BoolMeny4) DoSome(i+50);else

	if (BoolMeny5) DoSome(i+60);else

	if (BoolMeny6) DoSome(i+70);

	

	
BoolPMeny1=0;

	BoolPMeny2=0;

	

	BoolMeny1=0;

	BoolMeny2=0;

	BoolMeny3=0;

	BoolMeny4=0;

	BoolMeny5=0;

	BoolMeny6=0;

	}

	}

	}

	else

	if ((getbutton(1))&&(!OnPMenu)&&(!MenN2))

	{

	if (!mousein(xy1,yy1,xy2+6,yy2+yy1+4))

	{

	close(OnPMenu);

	

	if (BoolPMeny1)

	{

	FPMeny1[0].close(1);

	BoolPMeny1=0;

	}

	

	if (BoolPMeny2)

	{

	FPMeny2[0].close(1);

	BoolPMeny2=0;

	}

	
BoolMeny1=0;

	BoolMeny2=0;

	BoolMeny3=0;

	BoolMeny4=0;

	BoolMeny5=0;

	BoolMeny6=0;

	

	BoolPMeny1=0;

	BoolPMeny2=0;

	

	}

	}

	else if (onoff) setonoff(0);

	}

	

	void TMeny::setpos(int x,int y, char* capt,int i)

	{

	left=x;

	top=y;

	caption=capt;

	if (i) Draw();

	}

	

	void TMeny::Draw()// Метод постройки кнопок------------

	{

	int i;

	setfillstyle(1,7);

	setlinestyle(0,0,0);

	setcolor(color);

	mouseoff();

	
bar(left,top,left+width,top+height);

	

	moveto(5+left,5+top);

	outtext(caption);

	

	

	if (color==colornotsel) setcolor(7);

	rectangle(left,top,left+width,top+height);

	rectangle(left+2,top+2,left+width-2,top+height-2);

	

	mouseon();

	} // Метод постройки кнопок--------------------------------

	

	

	TMeny::TMeny()

	{

	caption='\0';

	width=180;

	height=18;

	top=0;

	left=0;

	color=colornotsel;

	onoff=0;

	}

	

	void DrowMenyAll(TMeny FirstMeny[],int FMeny, int p)

	{

	if (!p)

	{

	xy1=FirstMeny[0].getleft()-4;

	yy1=FirstMeny[0].gettop()-4;

	xy2=FirstMeny[0].getleft()+FirstMeny[0].getwidth();

	yy2=FirstMeny[FMeny-1].gettop()-FirstMeny[0].gettop()+FirstMeny[0].getheight()+8;

	

	size = imagesize(xy1-2, yy1-2, xy2+6, yy1+yy2+4);

	arrow = malloc(size);

	mouseoff();

	getimage(xy1-2, yy1-2, xy2+6, yy1+yy2+4, arrow);

	int dx=(xy2-xy1+4)/5;

	int dy=(yy2+2)/5;

	for (int k=1;k<=5; k++)

	{

	windows(xy1,yy1,dx*k,dy*k,7,"",0);

	delay(30);

	}

	mouseon();

	windows(xy1,yy1,xy2-xy1+4,yy2+2,7,"",0);

	windows(xy1+2,yy1+2,xy2-xy1,yy2-2,7,"",1);

	for (int gg=0;gg<FMeny;gg++)

	{

	FirstMeny[gg].Draw();

	}

	}

	else

	{

	xy1p=FirstMeny[0].getleft()-4;

	yy1p=FirstMeny[0].gettop()-4;

	xy2p=FirstMeny[0].getleft()+FirstMeny[0].getwidth();

	yy2p=FirstMeny[FMeny-1].gettop()-FirstMeny[0].gettop()+FirstMeny[0].getheight()+8;

	

	sizep = imagesize(xy1p-2, yy1p-2, xy2p+6, yy1p+yy2p+4);

	arrowp = malloc(sizep);

	mouseoff();

	getimage(xy1p-2, yy1p-2, xy2p+6, yy1p+yy2p+4, arrowp);

	int dx=(xy2p-xy1p+4)/5;

	int dy=(yy2p+2)/5;

	for (int k=1;k<=5; k++)

	{

	windows(xy1p,yy1p,dx*k,dy*k,7,"",0);

	delay(30);

	}

	mouseon();

	windows(xy1p,yy1p,xy2p-xy1p+4,yy2p+2,7,"",0);

	windows(xy1p+2,yy1p+2,xy2p-xy1p,yy2p-2,7,"",1);

	for (int gg=0;gg<FMeny;gg++)

	{

	FirstMeny[gg].Draw();

	}

	}

	}

	

	

	void mysound()

	{

	sound(1000);

	delay(30);

	nosound();

	}

	
void messageabout()

	{ mysound();

	size=imagesize(199,99,200+241,241);

	arrow=malloc(size);

	getimage(199,99,200+241,241,arrow);

	mouseon();

	windows(200,100,240,140,7,"",0);

	windows(202,102,236,15,colorhead,"Про програму",1);

	setcolor(11);

	mouseoff();

	outtextxy(230,130," КУРСОВА РОБОТА ");

	outtextxy(230,150," ");

	outtextxy(230,170," iнтерполяцiя по");

	outtextxy(230,190," Лагранжу i Ньютону ");

	outtextxy(230,210,"");

	mouseon();

	while (getbutton(1));

	while ((!getbutton(1))&&(!kbhit()));

	mouseoff();

	putimage(199,99,arrow,0);

	mouseon();

	free(arrow);

	while (kbhit()) getch();

	}

	void messageaboutavt()

	{ mysound();

	size=imagesize(199,99,200+241,241);

	arrow=malloc(size);

	getimage(199,99,200+241,241,arrow);

	mouseon();

	windows(200,100,240,140,7,"",0);

	windows(202,102,236,15,colorhead,"Про автора",1);

	setcolor(11);

	mouseoff();

	outtextxy(230,130," КУРСОВА РОБОТА ");

	outtextxy(230,150," Програму написав ");

	outtextxy(230,170," ");

	outtextxy(230,190," ст.гр.5AC-02 ");

	outtextxy(230,210," Гега А.М.");

	mouseon();

	while (getbutton(1));

	while ((!getbutton(1))&&(!kbhit()));

	mouseoff();

	putimage(199,99,arrow,0);

	mouseon();

	free(arrow);

	while (kbhit()) getch();

	}

	

	

	void TButton::mousemove(int i)

	{

	if (mousein(left,top,left+width,top+height))

	{

	if (getbutton(1))

	{

	if (onoff!=1) setonoff(1);

	}

	else

	if (onoff==1)

	{

	setonoff(0);

	DoSome(i);

	}

	else

	{

	if (onoff!=Flat) setonoff(Flat);

	}

	}else if (onoff!=0) setonoff(0);

	}

	

	void TButton::setpos(int x,int y, char* capt,int i)

	{

	left=x;

	top=y;

	caption=capt;

	Draw();

	}

	

	TButton::TButton()

	{

	caption='\0';

	width=100;

	height=18;

	top=0;

	left=0;

	color=ButtonColor;

	onoff=0;

	}

	
void TButton::Draw()// Метод постройки кнопок------------

	{

	int i=onoff;

	setfillstyle(1,color);

	setlinestyle(0,0,0);

	mouseoff();

	

	bar(left,top,left+width,top+height);

	setcolor(1);

	

	switch (i)

	{

	case 0:setcolor(coloroff);break;

	case 1:setcolor(colordn);break;

	case 2:setcolor(coloron);break;

	}

	rectangle(left,top,left+width,top+height);

	rectangle(left+2,top+2,left+width-2,top+height-2);

	

	switch (i)

	{

	case 0:moveto(5+left,5+top);break;

	case 1:moveto(6+left,6+top);break;

	case 2:moveto(5+left,5+top);break;

	}

	if ((!Flat)&&(!i)) moveto(5+left,5+top);

	outtext(caption);

	mouseon();

	} // Метод постройки кнопок--------------------------------

	

	
void grinit()//---Инициал графики----------------------------

	{

	int gdriver = DETECT, gmode, errorcode;

	initgraph(&gdriver, &gmode, "");

	errorcode = graphresult();

	if (errorcode != grOk)

	{

	printf("Graphics error: %s\n", grapherrormsg(errorcode));

	printf("Press any key to halt:");

	getch();

	exit(1);

	}

	mouseinit();

	mouseon();

	}//_void grinit()//-----------------------------------------------

	

	void getcurcorpos()

	{

	int i;

	

	if (BoolMeny1)

	for (i=0; i<Meny1; i++)

	{

	if (BoolMeny1)

	FMeny1[i].mousemove(i);

	}//===================================

	

	MenN2=1;

	if (BoolMeny2)

	for (i=0; i<Meny2; i++)

	{

	if (BoolMeny2)

	FMeny2[i].mousemove(i);

	}//====================================

	MenN2=0;

	

	if (BoolMeny3)

	for (i=0; i<Meny3; i++)

	{

	if (BoolMeny3)

	FMeny3[i].mousemove(i);

	}//====================================

	

	

	OnPMenu=1;

	if (BoolPMeny1)

	for (i=0; i<PMeny1; i++)

	{

	if (BoolPMeny1)

	FPMeny1[i].mousemove(i);

	}//===================================

	

	if (BoolPMeny2)

	for (i=0; i<PMeny2; i++)

	{

	if (BoolPMeny2)

	FPMeny2[i].mousemove(i);

	}//====================================

	OnPMenu=0;

	

	
for (i=0; i<ButtonN; i++)

	{

	button[i].mousemove(i);

	}//=======================================

	}

	

	///////////////////////////////////////////////////////////////////

	//----------------------------------------------------------------

	//-----------------------------------------------------------------

	void init()

	{

	mouseoff();

	cleardevice();

	mouseon();

	windows(1,1,637,477,7,"",0);

	// windows(1,25,637,27,7,"",0);

	windows(3,50,630,406,7,"",1);

	windows(3,3,633,20,colorhead,"Iнтерполяцiя по Лагранжу та Ньютону",1);

	// windows(1+2,20+2,637-3,27-4,7,"",1);

	windows(3,460,630,17,7,"",1);

	

	button[0].setwidth(18);

	button[0].setheight(18);

	button[0].setpos(615,4,"X");

	button[1].setpos(5,28," Довiдка");

	button[2].setpos(110,28,"Тестування");

	button[3].setpos(215,28,"Результати");

	button[4].setpos(320,28," Вихiд");

	

	
int h;

	

	for (h=0;h<Meny1;h++)

	FMeny1[h].setwidth(150);

	

	FMeny1[0].setpos(10,53,"Про автора");

	FMeny1[1].setpos(10,53+19,"Про програму");

	

	

	

	for (h=0;h<Meny2;h++)

	FMeny2[h].setwidth(100);

	FMeny2[0].setpos(115,53, "Тест 1 >");

	FMeny2[1].setpos(115,53+19,"Тест 2 >");

	

	for (h=0;h<Meny3;h++)

	FMeny3[h].setwidth(100);

	FMeny3[0].setpos(220,53,"В файл");

	FMeny3[1].setpos(220,53+19,"На екран");

	FMeny3[2].setpos(220,53+19+19,"На друк");

	

	

	

	for (h=0;h<PMeny1;h++)

	FPMeny1[h].setwidth(100);

	FPMeny1[0].setpos(227,57,"По Лагранжу");

	FPMeny1[1].setpos(227,57+19,"По Ньютону");

	

	for (h=0;h<PMeny2;h++)

	FPMeny2[h].setwidth(100);

	FPMeny2[0].setpos(227,57+19,"По Лагранжу");

	FPMeny2[1].setpos(227,57+19+19,"По Ньютону");

	

	}

	

	///////////////////////////////////////////////////////////////////////

	

	void DoSome(int i)

	{

	switch (i)

	{

	case 0:

	closegraph();exit(1);

	break;

	case 1:

	DrowMenyAll(FMeny1,Meny1,0);

	BoolMeny1=1;

	break;

	case 2:

	DrowMenyAll(FMeny2,Meny2,0);

	BoolMeny2=1;

	break;

	

	case 3:DrowMenyAll(FMeny3,Meny3,0);

	BoolMeny3=1;break;

	

	case 4: closegraph();exit(0); break;

	///////////////////////

	case 20:messageaboutavt();break;

	case 21:messageabout();;break;

	case 22:;break;

	case 23:;break;

	////////////////////////

	///////////////////////

	case 30:;break;

	case 31:break;

	case 32:;break;

	case 33:;break;

	case 34:windows(3,50,630,406,7,"",1);break;

	

	case 40:

	/* int dy=30,dx=20;

	for (int i=0;i<110;i++)

	{

	putpixel(i+dx,dy*IntLang(i)+120,4);

	

	putpixel(i+dx,dy*IntNuton1(i)+120,2);

	

	putpixel(i+dx,dy*IntNuton2(i)+120,1);

	

	if ((i%20)==0)

	{

	setcolor(4);

	circle(i+dx,dy*IntLang(i)+120,2);

	setcolor(2);

	circle(i+dx,dy*IntNuton1(i)+120,2);

	setcolor(1);

	circle(i+dx,dy*IntNuton2(i)+120,2);

	}

	}

	*/

	

	

	edit1[0].setpos(200,200,"Введiть файл","");

	EditEnter(edit1,FEdit1);

	if (exittru==27) break;

	

	

	if ((in = fopen(edit1[0].gettext(), "wt")) == NULL)

	{

	fprintf(stderr, "Cannot open input file.\n");

	break;

	}

	

	fprintf(in,"Результати роботи\n");

	

	if (Tt!=-1000)

	{

	fprintf(in," Iнтерполяцiя по Лагранжу\n");

	fprintf(in,"T=%10.5f\n",Tt);

	fprintf(in,"Q=%10.5f\n",FLTt);

	E=fabs(FLTt/6006);

	fprintf(in,"e=%10.5f\n",E);

	}

	

	if (Ttn!=-1000)

	{

	

	fprintf(in," Iнтерполяцiя по Ньютону\n");

	fprintf(in,"T=%10.5f\n",Ttn);

	fprintf(in,"Q=%10.5f\n",FNTt1);

	E=fabs(FNTt1-IntLang(Ttn));

	fprintf(in,"e=%10.5f\n",E);

	}

	fclose(in);

	break;

	case 41:

	windows(3,50,630,406,7,"",1);

	setcolor(4);

	mouseoff();

	outtextxy(240,80,"Результати роботи");

	

	

	if (Tt!=-1000)

	{

	

	setcolor(1);

	outtextxy(50,150," Iнтерполяцiя по Лагранжу");

	

	sprintf(sd,"T=%10.5f",Tt);

	outtextxy(40,170,sd);

	

	sprintf(sd,"Q=%10.5f",FLTt);

	outtextxy(40,190,sd);

	

	E=fabs(FLTt/6006);

	

	sprintf(sd,"e=%10.5f",E);

	outtextxy(40,210,sd);

	}

	
if (Ttn!=-1000)

	{

	

	setcolor(1);

	outtextxy(50,250," Iнтерполяцiя по Ньютону");

	

	sprintf(sd,"T=%10.5f",Ttn);

	outtextxy(40,270,sd);

	

	sprintf(sd,"Q=%10.5f",FNTt1);

	outtextxy(40,290,sd);

	

	E=fabs(FNTt1-IntLang(Ttn));

	

	sprintf(sd,"e=%10.5f",E);

	outtextxy(40,310,sd);

	}

	mouseon();

	break;

	

	case 42:

	fprintf(stdprn,"Rezult\r\n");

	

	if (Tt!=-1000)

	{

	fprintf(stdprn," Interpol LAGRANG\r\n");

	fprintf(stdprn,"T=%10.5f\r\n",Tt);

	fprintf(stdprn,"Q=%10.5f\r\n",FLTt);

	E=fabs(FLTt/6006);

	fprintf(stdprn,"e=%10.5f\r\n",E);

	}

	

	if (Ttn!=-1000)

	{

	

	fprintf(stdprn," Interpol NUTON\r\n");

	fprintf(stdprn,"T=%10.5f\r\n",Ttn);

	fprintf(stdprn,"Q=%10.5f\r\n",FNTt1);

	E=fabs(FNTt1-IntLang(Ttn));

	fprintf(stdprn,"e=%10.5f\r\n",E);

	}

	fprintf(stdprn, "\f");

	break;

	

	case 100:;

	case 110:

	edit1[0].setpos(200,200,"Введiть t (по Лагр.)","");

	EditEnter(edit1,FEdit1);

	if (exittru==27) break;

	

	Tt=atof(edit1[0].gettext());

	FLTt=IntLang(Tt);

	//printf("\n f(%f)= %10.10f %10.10f %10.10f ",Tt,FLTt,FNTt1,FNTt2);

	break;

	case 101:;

	case 111:

	edit1[0].setpos(200,200,"Введiть t (по Ньютону)","");

	EditEnter(edit1,FEdit1);

	

	if (exittru==27) break;

	

	Ttn=atof(edit1[0].gettext());

	//FLTt=IntLang(Ttn);

	if (Ttn<50)

	FNTt1=IntNuton1(Ttn);

	else

	FNTt1=IntNuton2(Ttn);

	//printf("\n f(%f)= %10.10f %10.10f %10.10f ",Tt,FLTt,FNTt1,FNTt2);

	break;

	///////////////////////

	}

	}

	

	
4 Розробка тестів та аналіз результату тестування

	

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

	

	4.1 Опис тестів

	

	При запуску програми (ехе-файл чи з середовища Туро Сі) з'являється головне меню програми (рисунок 4.2.1). Вибір необхідного пункту меню можна здійснювати за допомогою миші, вибраний пункт зразу ж підсвічується. Для його виконання достатньо нажати клавішу „Enter” чи клацнути два рази лівою клавішею мишки.

	Тест 1: вихід з програми.

	Активуємо пункт меню „Вихід”, за допомогою якого можна вийти з програми при натисненні кнопки миші.

	Тест 2: тестування по Лагранжу.

	Активуємо пункт меню „Тестування ” - „Тест 1 ” –“По Лагранжу”. З’являється вікно в якому вводимо значення температури для певного тестування.

	Тест 3: тестування по Ньютону.

	Активуємо пункт меню „Тестування” - „Тест 2 ”-–“По Ньютону”. З’являється вікно в якому вводимо значення температури для певного тестування.

	Тест 4: запис результатів тестування в файл.

	Для цього потрібно активувати пункт меню “Результати”-“В файл”. З’являється діалогове вікно в якому потрібно вказати назву файлу, в який безпосередньо буде виконуватись запис результатів тестування за відповідним методом. 

	Тест 5: вивід результатів тестування на екран. 

	Для цього потрібно активувати пункт меню “Результати”-“На екран”. На екрані зразу ж з’являються результати тестування за певним методом або обидва результати одночасно. 

	Тест 6: вивід результатів тестування на друк.

	Це зробимо за допомогою кнопки меню “Результати”-“На друк”.Результати тестування виведуться на друк лише в тому випадку, якщо налаштований принтер.

	

	Тест 7: отримання інформації про автора.

	Активуємо пункт меню „Довідка”-„Про автора”. Активується діалогове вікно в якому описані короткі відомості про автора.

	Тест 8: отримання інформації про програму. 

	Активуємо пункт меню „Довідка”-„Про програму”. Активується діалогове вікно в якому з’являється назва курсової роботи.

	

	4.2 Аналіз результатів тестування

	

	Рисунок 4.2.1. Головне меню програми

	

	Тест 1. Відкрили пункт меню „Вихід” - „Вихід[Alt+X]” та вийшли з програми.

	Тест 2. Активували пункт меню „Тестування ” - „Тест 1 ” –“По Лагранжу”. Вводимо по черзі в діалоговому вікні чисельне значення температури Т=270,320,550,750,670С.

	
Рисунок 4.2.2.Результати проведення тесту № 2

	

	Тест 3. Активували пункт меню „Тестування” - „Тест 2 ”-–“По Ньютону”

	Вводимо по черзі в діалоговому вікні чисельне значення температури Т=270,320,550,750,670С.

	

	Рисунок 4.2.3. Результати проведення тесту № 3

	

	Тест 4. Нехай потрібно записати результати тестування в файл „Інтерполяція”. Внесемо дану інформацію в діалогове вікно, яке зявиться на екрані.

	

	Рисунок 4.2.4.Результати проведення тесту №4

	

	
Тест 5. Користувача цікавить вивід результатів тестування на екран. Надамо йому таку інформацію. 

	

		Рисунок 4.2.5.Результати проведення тесту № 5

	

	Тест 6.Виведемо результати тестування на друк.

	

	Рисунок 4.2.6. Результати проведення тесту № 6

	

	Тест 7. Активували пункт меню „Довідка”-„Про автора”. 

	

	Рисунок 4.2.7.Результати проведення тесту №7

	
Тест 8. Активуємо пункт меню „Довідка”-„Про програму”. 

	

	Рисунок 4.2.8. Результати проведення тесту №8

	

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

	До переваг даної програми можна віднести:

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

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

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

	

	
5 Оцінка похибок результатів експериментальних досліджень

	

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

	Похибка при інтерполяції за Лагранжем може бути оцінена таким чином: 

	

	 (5.1)

	

	де .

	Похибка інтерполяції для першої формули Ньютона можна оцінити відповідно як:    (5.2)

	

	де  (5.3)

	

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

	

	  (5.4)

	де  (1.23) 

	

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

	

	Комплекс програм дослідження зміни температури термопари розроблено в середовищі Turbo C .

	Ефективність програми це багатокритеріальна оцінка, яка формується як на основі об’єктивних так і суб’єктивних оцінок її роботи користувачем. Але основними є:

	швидкодія;

	об’єм програмного коду;

	взаємодія з іншими прикладними програмами та операційними системами.

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

	окремі частини програмного коду, які багаторазово використовуються розміщенні в окремих функціях ;

	функції, для обробки самостійних частини знаходяться в окремих модулях;

	структура програми є чітко структурованою;

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

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

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

	Програма була написана під MS-DOS, але може працювати і під іншими оболонками, які симулюють роботу MS-DOS - Windows , OS/2, MAC, що підтримують 16-бітний код і кодування MS-DOS.

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

	

	Таблиця 6.1 Дослідження ефективності програми

	Файл

	Розмір до трансляції (Кб)

	Розмір ЕХЕ-файла (Кб)

	Час виконання задачі (с)

	INTERP.CPP

	1

	79,9

	1,5

	MENYS.H

	17

	-

	0,2

	EDITS.H

	5

	-

	0,2

	CALC.H

	2

	-

	0,2

	WIND.H

	1

	-

	0,1

	MOUSE.H

	2

	-

	0,1

	MINMENY.H

	18

	-

	0,3

	

	
7 Розробка пакету документів для супроводження комплексу програм

	

	7.1 Розробка інструкції програмісту

	

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

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

	

	Таблиця 7.1.1 Потреби до ресурсів ПК

	Процесор

	ОЗУ

	Монітор

	HDD

	FDD

	486DX

	8Mb

	14”

	600Mb

	3.14 FDD

	

	7.1.1 При написані даної програми використовується метод структурного програмування .

	

	7.1.2 Програма знаходиться на дискеті на якій є всі необхідні файли для роботи з даною програмою.

	

	7.1.3 Програма складається з таких файлів:

	

	Таблиця 7.1.2 Файли програмного продукту.

	Назва

	Призначення

	INTERP.CPP

	Основна програма.

	MENYS.H

	Бібліотека з меню та кнопками

	DIALOGS.H

	Бібліотека з вікнами для вводу тексту 

	CALC.H

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

	WIND.H

	Бібліотека малює вікна, панельки

	

	В робочому каталозі програми повинні бути розташовані файли:

	INTERP.EXE – файл запуску програми

	EGAVGA.BGI – драйвер підтримки графічного режиму

	KEYRUS.COM – драйвер клавіатури, для підтримки українських і російських шрифтів

	START.BAT – запуск KEYRUS.COM і INTERP.EXE.

	Якщо всі ці файли знаходяться в одному каталозі, то програму можна запускати.

	

	7.2 Інструкція користувачеві

	

	7.2.1 Дана програма може використовуватися для покращення ефективності роботи інженера на підприємстві.

	

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

	

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

	

	Рисунок 7.2.1. Головне меню програми

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

	

	7.2.5 Для активізації потрібного пункту меню використовується клавіша <ENTER> чи клацнути лівою клавішею миші.

	

	7.2.6 Програма працює в інтерактивному режимі, тобто реагує на кожну дію користувача.

	

	7.2.7 Для виходу з програми потрібно в головному меню вибрати пункт “Вихід” – „Вихід[Alt+X]” і натиснути <ENTER>.

	

	
Висновки

	

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

	В першій главі було розглянуто варіантний аналіз чисельних методів моделювання зміни температури термопари.

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

	В третій главі подано лістинг всієї програми, а саме головної програми та лістинг головних функцій.

	В четвертій главі виконано тестування меню та тестування самої програми.

	В п’ятій главі зроблено оцінку похибок отриманих результатів.

	В шостій главі виконано дослідження на ефективність програми, приведено таблицю ефективності.

	В сьомій главі подана інструкція системному програмісту та користувачеві описані мінімальні характеристики комп’ютера для роботи даної програми, зроблено перелік файлів без яких неможлива робота програми. В пункті 7.2 інструкція користувачеві розказано: як установити програму на комп’ютер, як запустити програму з комп’ютера та як користуватися нею.

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

	

	
Використана література

	

	Проценко С.В. Техніка програмування мовою Сі: Навч.посібник.-К.:Либідь, 1993.

	Методичні вказівки до лабораторних робіт з курсу “Обчислювальні методи та застосування ЕОМ ” , Частина І, Вінниця ВПІ 1992.

	Міщенко С.М., Конспект лекцій з обчислювальних методів та застосування ЕОМ, ВНТУ,2004.

	Шуп Т. Розв’язання інженерних задач на ЕОМ.-М.:, 1982.

	Бахвалов Н.С. Чисельні методи.Т.І. Аналіз, алгебра, ЗДР.-М: Наука, 1975.

	Хеммінг Р.В. Чисельні методи – М.: Наука,1972

	Лященко

	Турчак Л.І. Основи чисельних методів. – М. Наука,1987. 

	

	
Додаток А

	

	Міністерство освіти і науки України

	Вінницький національний технічний університет

	Інститут автоматики електроніки та комп’ютерних систем управління

	Кафедра комп’ютерних систем управління

	

	Технічне завдання

	на виконання курсової роботи

	” Дослідження зміни температури термопари за допомогою чисельних методів на ЕОМ.”

	При розробці даної роботи необхідно виконувати слідуючи етапи:

	1.1 Найменування та галузь застосування об’єкта розробки: цей комплекс програм може бути застосований на будь-якому підприємстві для полегшення та покращення результатів роботи інженерів

	1.2 Підстава для проведення роботи: дослід штучного інтелекту

	1.3 Дата початку роботи:8.01.04.

	1.4 Дата закінчення роботи: 10.04.04.

	1.5 Мета призначення розробки: створити як найкращий комплекс програм для полегшення та покращення роботи інженера підприємства

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

	ГОСТ 19.701-90 (МСО 5807-85) ГОСТ 19.101-77 (СТСЄВ 1626-7а) 

	ГОСТ 19.781-74 ГОСТ 7.1-84 ДСТУ 3008-85

	ГОСТ 19.401-78 ГОСТ 19.106-78 

	1.7 Стадії та етапи розробки:

	1 етап: розробка індивідуального та технічного завдання.(до 15.01.04)

	2 етап: огляд та аналіз методів моделювання зміни температури термопари на ЕОМ (до 1.02.04).

	3 етап: розробка алгоритмів моделювання зміни температури термопари на ЕОМ (до 20.02.04).

	4 етап: розробка керуючої програми, яка повинна працювати в режимі багато ієрархічного меню (до 10.03.04).

	5 етап: об’єднання всіх програмних модулів та тестування керуючої програми (до 15.03.04).

	6 етап: розробка тестів, тестування та демонстрація роботи всього комплексу (до 15.03.04).

	7 етап: розробка технічної документації та пояснювальної записки (до 20.03.04).

	8 етап: вимоги до безпеки: розроблене програмне забезпечення повинно відповідати вимогам Сніп та ДЕСТів до робочого місця оператора ЕОМ.

	

	
Додаток Б

	

	Лістинги модулів

	

	Лістинг модуля EDITS.H

	#include <stdlib.h>

	

	const coloredit=14; // цвет самого поля для ввода

	const colordialog=7; //цвет окна диалог

	

	const FEdit1=1;

	const FEdit2=0;

	const FEdit3=0;

	const FEdit4=0;

	const FEdit5=0;

	const FEdit6=0;

	

	void *arrow;

	int size,xy1,xy2,yy1,yy2;

	void *arrowp;

	int sizep,xy1p,xy2p,yy1p,yy2p;

	

	

	int FEdit=0;

	

	class TEdit

	{

	public:

	TEdit();

	~TEdit(){};

	
void EditDrow();

	void setwidth(int x){width=x;};

	void setheight(int x){height=x;};

	void settop(int x){top=x;};

	void setleft(int x){left=x;};

	void setonoff(int x,int k=1){

	onoff=x;

	if (k) EditDrow();

	};

	

	void setcol(int x){color=x;};

	void setcapt(char *x){caption=x;};

	void settext(char x[20]){strcpy(text,x);};

	

	int getwidth()const {return width;};

	int getheight()const {return height;};

	int gettop()const {return top;};

	int getleft()const {return left;};

	int getonoff()const {return onoff;};

	int getcol()const {return color;};

	const char* getcapt(){return caption;};

	const char* gettext(){return text;};

	

	void mousemove(int i);

	void onkeypress(int i);

	

	void setpos(int x,int y, char* capt,char* texts,int i=0);

	

	

	private:

	int width;

	int height;

	int top;

	int left;

	int onoff;

	int color;

	char *caption;

	char text[20];

	};

	

	void TEdit::setpos(int x,int y, char* capt,char* texts,int i)

	{

	strcpy(text,texts);

	left=x;

	top=y;

	caption=capt;

	if (i) EditDrow();

	}

	TEdit::TEdit()

	{

	caption='\0';

	text[0]='2';

	text[1]='3';

	text[2]='\0';

	width=170;

	height=18;

	top=0;

	left=0;

	color=coloredit;

	onoff=0;

	}

	void TEdit::EditDrow()

	{

	int i;

	int x=left;

	int y=top;

	int xx=width;

	int yy=height;

	setfillstyle(1,color);

	setlinestyle(0,0,0);

	mouseoff();

	bar(x,y,x+xx,y+yy);

	setcolor(8);

	

	line(x-1,y-1,x-1,y+yy+1);

	line(x-1,y-1,x+xx+1,y-1);

	setcolor(15);

	line(x,y+yy+1,x+xx+1,y+yy+1);

	line(x+xx+1,y,x+xx+1,y+yy+1);

	moveto(6+x,6+y);

	setcolor(color+10);

	outtext(text);

	line(x+strlen(text)*8+6,y+15,x+strlen(text)*8+10,y+15);

	moveto(x,y-15);

	setcolor(color+13);

	outtext(caption);

	

	if (onoff) setcolor(11);

	else setcolor(colordialog);

	rectangle(x-4,y-4,x+xx+4,y+yy+4);

	mouseon();

	}

	

	

	//////////////////////////////////////////////////////////////////

	// ОБЪЯВЛЕНИЕ ОБЪЕКТОВ

	//////////////////////////////////////////////////////////////////

	TEdit *TempEdit, edit1[FEdit1];

	// char *strrez[FEdit];

	int exittru=1;

	

	

	void TEdit::mousemove(int i)

	{

	if (mousein(left,top,left+width,top+height))

	{

	if (!onoff)

	if (getbutton(1))

	{

	int j;

	for ( j=0;j<FEdit;j++)

	if ((i!=j)&&(TempEdit[j].getonoff())) TempEdit[j].setonoff(0);

	setonoff(1);

	}

	}

	}

	

	

	void TEdit::onkeypress(int i)

	{

	if ((onoff)&&(kbhit()))

	{

	char c=getch();

	switch (c)

	{

	case 8: if (strlen(text))

	{

	text[strlen(text)-1]='\0';

	EditDrow();

	}break;

	case 9: setonoff(0);

	if (i==(FEdit-1)) TempEdit[0].setonoff(1);

	else TempEdit[i+1].setonoff(1);break;

	case 13:exittru=13;break;

	case 27:exittru=27;break;

	case 0:

	switch (getch())

	{

	case 72:

	setonoff(0);

	if (i==0) TempEdit[FEdit-1].setonoff(1);

	else TempEdit[i-1].setonoff(1);

	break;//up

	case 80:

	setonoff(0);

	if (i==(FEdit-1)) TempEdit[0].setonoff(1);

	else TempEdit[i+1].setonoff(1);

	break;//down

	};break;

	}

	if (((c>=32)||(c<0))&&(strlen(text)<19))

	{

	int slen=strlen(text);

	text[slen]=c;

	text[slen+1]='\0';

	EditDrow();

	}

	

	

	}

	}

	

	void EditInitall()

	{

	edit1[0].setpos(200,200,"","");

	}

	

	void EditInit()

	{

	TempEdit[0].setonoff(1,0);

	int i;

	for (i=1;i<FEdit;i++)

	TempEdit[i].setonoff(0,0);

	

	xy1=TempEdit[0].getleft()-10;

	yy1=TempEdit[0].gettop()-45;

	xy2=TempEdit[FEdit-1].getleft()+TempEdit[FEdit-1].getwidth()+10;

	yy2=TempEdit[FEdit-1].gettop()+TempEdit[FEdit-1].getheight()-yy1+10;

	

	size = imagesize(xy1-2, yy1-2, xy2+4, yy1+yy2+2);

	arrow = malloc(size);

	mouseoff();

	getimage(xy1-2, yy1-2, xy2+4, yy1+yy2+2, arrow);

	mouseon();

	windows(xy1,yy1,xy2-xy1+2,yy2,colordialog,"",0);

	windows(xy1+2,yy1+2,xy2-xy1-2,18,1,"Ввiд",1);

	for ( i=0;i<FEdit;i++)

	{

	TempEdit[i].EditDrow();

	}

	}

	

	void EditEnter(TEdit *edit1, int rrr)

	{

	int i;

	FEdit=rrr;

	TempEdit=edit1;

	EditInit();

	exittru=0;

	while (!exittru)

	{

	for (i=0; i<FEdit; i++)

	{

	TempEdit[i].onkeypress(i);

	TempEdit[i].mousemove(i);

	}

	}

	mouseoff();

	putimage(xy1-2, yy1-2,arrow,0);

	mouseon();

	free(arrow);

	}

	

	

	/////////////////////// END DIALOG ////////////////////////////////

	

	

	Лістинг модуля WIND.H

	#include <graphics.h>

	#include "mouse.h"

	void windows(int x,int y,int xx,int yy,int color,char s[100],int p)

	{

	int i;

	setfillstyle(1,color);

	setlinestyle(0,0,0);

	mouseoff();

	bar(x,y,x+xx,y+yy);

	if (p) setcolor(8);

	else setcolor(15);

	

	line(x-1,y-1,x-1,y+yy+1);

	line(x-1,y-1,x+xx+1,y-1);

	if (! p) setcolor(8);

	else setcolor(15);

	line(x,y+yy+1,x+xx+1,y+yy+1);

	line(x+xx+1,y,x+xx+1,y+yy+1);

	if (! p) moveto(5+x,5+y);

	else moveto(6+x,6+y);

	setcolor(color+10);

	outtext(s);

	mouseon();

	}

	

	Лістинг модуля CALC.H

	#include <math.h>

	#include <stdlib.h>

	#include <string.h>

	#include <process.h>

	

	const N=6;

	

	float x[N]={0, 20, 40, 60, 80, 100},

	y[N]={-0.67, -0.254, 0.171, 0.609, 1.057, 1.517};

	

	//float x[N]={1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7},

	// y[N]={1, 0.90909, 0.83333, 0.76923, 0.71329, 0.66667, 0.625, 0.58824};

	

	

	float

	dy0=y[1]-y[0];

	int COO=0;

	

	float H=x[1]-x[0];

	

	

	

	

	

	double stepin(double x1,int f)

	{

	if (f==0) return 1.0;

	double rez=x1;

	for (int i=1;i<f;i++)

	rez*=x1;

	// printf("\nx1=%f ^=%d rez=%f if_0=%d",x1,f,rez, rez==0);

	return rez;

	

	}

	

	double faktorial(int k)

	{

	

	double rez=1;

	for (int i=1;i<=k;i++)

	rez*=i;

	// printf("\n fact(%d)=%f",k,rez);

	return rez;

	

	}

	

	double GetA(int i)

	{

	// if (i) return (stepin(((y[i]-y[i-1])/H),i)*(1/faktorial(i)));

	if (i) return (stepin((dy0),i)/(faktorial(i)*stepin(H,i)));

	else

	return y[0];

	}

	

	

	

	double IntNuton1(double X1) //Интерполяц по NUTON 1

	{

	// return 0;

	double D,S;

	S=0;

	int i,j;

	for (i=0;i<N;i++)

	{

	D=GetA(i);

	for (j=0;j<i;j++)

	{

	D*=(X1-x[j]);

	}

	S+=D;

	// printf("\nS=%10.10f",S);

	}

	return S;

	}

	

	double GetB(int i)

	{

	if (i) return (stepin(((y[N-i]-y[N-i-1])/H),i)*(1/faktorial(i)));

	else

	return y[N-1];

	}

	

	double IntNuton2(double X1) //Интерполяц по NUTON 2

	{

	// return 0;

	double D,S;

	S=0;

	int i,j;

	for (i=0;i<N;i++)

	{

	D=GetB(i);

	for (j=(N-1);j>=(N-i);j--)

	{

	D*=(X1-x[j]);

	}

	S+=D;

	}

	return S;

	}

	

	double IntLang(double X1) //Интерполяц по Лагранджу

	{

	// return 0;

	// printf("\n%d",COO++);

	double D,S;

	S=0;

	int i,j;

	for (i=0;i<N;i++)

	{

	D=1;

	for (j=0;j<N;j++)

	{

	if (i!=j) D*=(X1-x[j])/(x[i]-x[j]);

	}

	S+=D*y[i];

	}

	return S;

	}

	

	

	

	

	

	Лістинг модуля MOUSE.H

	#include <dos.h>

	#include <conio.h>

	#include <stdio.h>

	#include <process.h>

	

	struct REGPACK reg;

	//инициализирует мышу

	int mouseinit()

	{ reg.r_ax=0;

	intr(0x33,&reg);

	if (!reg.r_ax) {

	textcolor(15+128);

	gotoxy(23,10);printf("╔═════════E R R O R═════════╗");

	gotoxy(23,11);printf("║ MOUSE IS NOT PRESENT! ║");

	gotoxy(23,12);printf("║ Press any key ..... ║");

	gotoxy(23,13);printf("╚═══════════════════════════╝");

	getch();

	textcolor(7);

	return 1;

	}

	return 0;

	}

	//показывает курсор мыши

	void mouseon()

	{

	reg.r_ax=1;

	intr(0x33,&reg);

	}

	//прячет курсор мыши

	void mouseoff()

	{

	reg.r_ax=2;

	intr(0x33,&reg);

	}

	// возвращает координаты мыши

	void getmousexy(int *x,int *y)

	{

	reg.r_ax=3;

	intr(0x33,&reg);

	*x=reg.r_cx;

	*y=reg.r_dx;

	}

	//устанавливает координаты

	void setmousexy(int x,int y)

	{

	reg.r_cx=x;

	reg.r_dx=y;

	reg.r_ax=4;

	intr(0x33,&reg);

	}

	const left=1;

	const right=2;

	int getbutton(int but)

	{

	reg.r_ax=5;

	reg.r_bx=but;

	intr(0x33,&reg);

	return (reg.r_ax)==but;

	}

	

	int mousein(int x1,int y1,int x2,int y2)

	{

	int x,y;

	getmousexy(&x,&y);

	if (x>=x1 & x<=x2 & y>=y1 & y<=y2) return 1; else return 0;

	}

	

	
Додаток В

	

	Структура дискети