Довідник одиниці вимірювання система числення час у різних країнах

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Міжнародний Університет РЕГІ імені академіка Степана Дем’янчука



Кафедра інформаційних систем та технологій

















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

на тему :

"Довідник : одиниці вимірювання, система числення, час у різних країнах"













Виконав : 

студент ?? курсу

факультету кібернетики

групи ??-??

?????????????????????

___________________

              ( підпис )

Керівник :

?????????????????????

___________________

              ( підпис )





Рівне 2004


	Завдання

	

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





Зміст



	Завдання…………………………………………………………1

	

	Вступ…………………………………………………………….2

	

	Дослідження ефективності, випробування в експлуатації…..9

	

	Висновки……………………………………………………….12

	

	Список використаної літератури……………………………..13

	

	Додатки.......................................................................................14





	
Вступ

	

	А) Системи числення.

		Проблема перекладу з однієї системи числення в іншу дуже часто зустрічається при програмуванні.  Особливо часто з'являється така проблема при програмуванні на Асемблері.  Наприклад при визначенні адреси комірки пам'яті, для одержання двійкового або шістнадцяткового еквівалентів десятичного числа.  Іноді стає проблема збільшення швидкості обчислень, і тоді приходить на поміч двійкова система числення.  У цій системі числення дуже швидко робити операцію множення шляхом зсуву одного з операндів у двійковому виді вліво на таке число позицій у який стоїть одиниця в другому операнді.  Роздивимося докладніше як це здійснюється.  Нехай нам треба помножити число 1101 на 101 (обидва числа в двійкові системі числення).  Машина робить це в такий спосіб: вона бере число 1101, і якщо перший елемент другого множника дорівнює 1 те вона заносить його в суму.  Потім зрушує число 1101 уліво на одну позицію, одержуючи тим самим 11010 і якщо другий елемент другого множника дорівнює одиниці те теж заносить його в суму.  Якщо елемент другого множника дорівнює нулю те сума не змінюється.  У зв'язку з цим, якщо другий множник містить багато нулів, то операція множення виконується досить довго, тому що машина перевіряє кожну цифру другого множника, у тому числі і нулі.  Якщо ж самому робити операцію множення то нулі можна пропустити і тоді множення зробиться швидше. 

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

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

Б) Часові пояси 

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

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

Як тільки у Вас виникає потреба спілкуватися з людьми, що знаходяться на значній відстані від Вас, Вам потрібно відшукати спільну точку виміру часу. В наш час люди різних країн спілкуються між собою, тому були вироблені глобальні стандарти часу. Такий час носить назву універсальним часом (universal time, UT або UTC, який раніше називався Стандартним часом за Ґрінвічем, Greenwich Mean Time або GMT, бо він був місцевим часом в Ґрінвічі у Великобританії). Коли люди, що знаходяться в різний часових поясах мають необхідність в спілкуванні, вони можуть виражати час в універсальному часі і позбутися, таким чином, непорозумінь, які можуть траплятися від мішанини часів. 

Кожен місцевий час називається часовим поясом. Але хоча географія і може дозволити всім людям, що мають один і той же полудневий час, жити в одному часовому поясі, але політика дозволити цього не може. З багатьох причин, багато країн користуються літнім часом, тобто, вони переставляють свій годинник, щоб мати більше світлого часу поки вони працюють, і потім повертають стрілки годинників назад в зимовий час. Інші країни цього не роблять. Ті, які це роблять не можуть погодитися, коли саме переводити стрілки годинників, і правила змінюються кожного року. Все це вносить неабиякі складнощі в визначення часових поясів. Визначати часові пояси найкраще або за місцем або за різницею часу відносно Ґрінвічського часу. В США та деяких інших країнах часові пояси мають назви та абревіатури, що складаються з трьох літер. Однак, деякі абревіатури співпадають з іншими, і тому ними не можна користуватися, якщо не вказана також і країна. Кращим є поняття місцевого часу в Гельсінкі, ніж, скажімо, місцевий східньо-європейський час, бо не всі країни східної Європи дотримуються одних і тих же правил. Linux і Windows включає в себе пакет часових зон, в якому мається інформація про всі існуючі часові пояси. Ця інформація може легко поновлюватися, якщо правила змінюються. Все, що треба робити системному адміністратору, це вибрати відповідний часовий пояс. Крім цього, кожен користувач може встановити свій власний часовий пояс, оскільки багато хто працює з комп’ютерами через мережу, знаходячись на величезній відстані від комп’ютера. При зміні правил переходу на літній час в вашому місцевому часовому поясі, не забудьте змінити хоча б цю інформацію.

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



В) Стандарти і одиниці вимірювання

Наука, в багатьох випадках, вимагає проведення експерименту для доведення того чи іншого твердження. Експерименти вимагають вимірювань, і ми звичайно використовуємо числа для опису результатів вимірювань. Будь-яке число, що використовується для кількісного опису явища називають фізичною величиною. Наприклад, дві величини, що описують Вас – це Ваша вага і Ваш зріст. Деякі фізичні величини є настільки фундаментальними, що ми можемо дати їм означення тільки за допомогою опису самої процедури їх вимірювання. Таке означення називається операційним означенням. У деяких прикладах відстань вимірюють за допомогою лінійки, а часові інтервали за допомогою секундоміра. В інших випадках ми визначаємо фізичну величину, описуючи метод, за яким її розраховують з інших величин, котрі ми можемо виміряти. Таким чином, ми могли б означити середню швидкість рухомого об'єкта як пройдену відстань (виміряну за допомогою лінійки), поділенуe на час подорожі (виміряний секундоміром).  Коли ми вимірюємо величину, ми завжди порівнюємо її з деяким еталоном. Коли ми стверджуємо, що автомобіль «Порш 944» має довжину 4.29 метрів, то ми маємо на увазі те, що він у 4.29 разів довший за метрову планку. Метр – це одиниця вимірювання відстані, а секунда – одиниця вимірювання часу. Коли ми використовуємо число для опису фізичної величини, ми завжди повинні зазначати одиниці, котрі використовуємо. Опис відстані як просто «4.29» нічого не значить.  Для здійснення точних, надійних вимірювань ми потребуємо таких одиниць вимірювання, котрі б не змінювалися і щоби спостерігачі мали змогу їх відтворити незалежно від місця свого перебування. Систему одиниць вимірювання, що використовується науковцями та інженерами у цілому світі, звичайно називають «метричною системою». А з 1960 року вона отримала офіційну назву Міжнародна система, або SI (скорочення від французької назви, Systeme International).Перелік всіх одиниць системи SI подано у Додатку А, у вигляді означень найбільш фундаментальних одиниць.

Означення основних одиниць метричної системи змінювалися з роками. Коли в 1791-му році Французька Академія Наук заснувала метричну систему, то метру дали означення однієї десятимільйонної частки відстані від Північного Полюса до екватора (Рис.1-2). Секунда була означена як час, потрібний маятнику довжиною один метр для здійснення коливання з однієї сторони в іншу. Ці означення були громіздкими, а точне їх відтворення – ускладненим, і за міжнародними угодами їх замінили на більш досконалі означення.



Час

З 1889 до 1967 року одиниця вимірювання часу була означена як певна частка середнього сонячного дня (це середній часовий інтервал між послідовними проходженнями Сонця через найвищу точку на небі). Сучасний стандарт, прийнятий у 1967 році, є значно точнішим. Він базується на атомному годиннику, який використовує різницю енергій між двома найнижчими енергетичними рівнями атома цезію.  Опромінені хвилями мікрохвильового діапазону точної відповідної частоти, атоми цезію здійснюють перехід з одного стану в інший. Секунда означується як час, необхідний для здійснення 9 192 631 770 періодів коливання в електромагнітній хвилі, що відповідає цьому переходу.



Довжина



В 1791 році відстань від Північного Полюса до екватора була за означенням прирівняна до 107 м. За сучасним означенням метра ця відстань становить на 0.02% більше ніж 107 м.В 1960-му році атомний стандарт був встановлений і для метра, за використанням оранжево-червоного світла, що випромінюється атомом криптону (86Kr) в газорозрядній трубці. В листопаді 1983-го року стандарт довжини знову змінили, і більш радикальним чином. Була означена швидкість світла у вакуумі - точно 299 792 458 м/с.  Метр встановлюється у відповідності до цього числа і до означення секунди, що наведене вище. Отже нове означення метра таке - це відстань, яку проходить світло у вакуумі за 1/299 792 468 секунди. Це надає набагато точніший стандарт довжини, аніж базований на довжині хвилі світла.



Маса

Стандарт маси, кілограм, означується як маса певного конкретного циліндру з платиново-іридієвого сплаву. Цей циліндр зберігається в Міжнародному Бюро Ваг і Мір в Севрі, коло Парижу. Атомний стандарт маси був би більш фундаментальним, але на разі ми не маємо змоги вимірювати маси на атомних масштабах з такою ж точністю, як на макроскопічних масштабах. Грам (який не є фундаментальною одиницею) становить 0.001 кілограма.



Префікси одиниць вимiрювання

Оскільки ми означили фундаментальні одиниці, тоді легко ввести більші та менші одиниці для тих самих фізичних величин. В метричній системі ці інші одиниці пов'язані із фундаментальними одиницями (або, як у випадку маси, із грамом) за допомогою домноження на 10 або 0,1 .Таким чином один кілометр (1 км) становить 1000 метрів, і один сантиметр (1 см) становить метрів. Ми зазвичай виражаємо домноження на 10 або на 0,1 в показниковій формі запису : 1000 = 103, 1/1000 = 10–3, і так далі. Назви додаткових одиниць виводяться за допомогою додавання префікса до імені фундаментальних одиниць. Наприклад, префікс „кіло-” ,скорочено „к”, завжди означає збільшення на множник 1000, отже

1 кілометр = 1 км = 103 метрів = 103 м,

1 кілограм = 1 кг = 103 грамів = 103 г,

1 кілоВат = 1 кВт = 103 Ватів = 103 Вт.



Британська система

І, наприкінці, ми згадаємо про Британську систему одиниць вимірювання. Ці одиниці використовуються тільки у Сполучених Штатах і кількох інших країнах, і в багатьох із них вже заміщається одиницями SI. Британські одиниці тепер офіційно визначаються через одиниці SI, ось таким чином:

Довжина: 1 дюйм = 2.54 cм (точно)

Сила: 1 фунт = 4.448221615260 Ньютонів (точно)

«Ньютон», скорочено Н, є одиницею сили в SI. Британською одиницею вимірювання часу є секунда, означена таким ж чином як і в SI. У фізиці Британські одиниці використовуються тільки в механіці і термодинаміці, Британської системи для електричних одиниць не існує.

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

	
3. Дослідження ефективності, випробування в експлуатації.

	

	3.1 Теоретична основа рішення задачі переведення систем числення

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

	Припустимо нам потрібно перекласти число 567 десятеричної системи в двійкову систему.  Робиться це в такий спосіб: відшукується максимальний степінь двійки, щоб два в цьому ступені було менше або дорівнювало вихідному числу.  У нашому випадку це 9, тому що 2^9=512, а 2^10=1024 що більше нашого початкового числа.  У такий спосіб ми одержали число розрядів результату.  Воно дорівнює 9+1=10.  

	Значить результат буде мати вид 1ххххххххх, де замість х може стояти 1 або 0.  Знайдемо другу цифру результату.  Піднесемо двійку до степеня 9 і віднімемо з вихідного числа: 567-2^9=55.  Потім порівнюємо з числом 2^8=256.  Тому що 55 менше 256 те дев'ятий розряд буде нулем, тобто результат уже прийме вид 10хххххххх.  

	Роздивимося восьмий розряд: 2^7=128 > 55, значить і восьмий розряд буде нулем.  Так як  2^6=64 то сьомий розряд дорівнює нулю.  У такий спосіб ми одержали чотири старших розряди і число прийме вид 1000хххххх.  Обчисляємо 2^5=32 і бачимо, що 32 < 55, значить шостий розряд дорівнює 1 (результат 10001ххххх), залишок 55-32=23.2^4=16 < 23 - п'ятий розряд 1 => 100011хххх.  Залишок 23-16=7.2^3=8 > 7 => 1000110ххх.  2^2=4 < 7 => 10001101хх, залишок 3.2^1=2 < 3 => 100011011х, залишок 1.2^0=1 = 1 => 1000110111.  Ми одержали кінцевий результат. 

	Тепер спробуємо перекласти теж число 567, але вже в шістнадцяткову систему.  Підхід приблизно такий же.  Визначимо максимальний розряд.  Так як.  16^2=256 < 567, а 16^3=4096 > 567, то максимальний розряд 2+1=3.  Визначимо число, що буде стояти в третьому розряді.  Шукається максимальний множник у межах від 1 до 15, щоб поточний степінь шістнадцятьох помноженого на цей множник був менше або рівнявся вихідному числу (а надалі - залишку).  У нашому прикладі цей множник 2, тому що 256*2=512 < 567, а 256*3=768 > 567.  Значить старший розряд нашого результату буде дорівнює 2, і результат прийме вид 2хх, де замість х можуть стояти будь-які цифри або букви з нижче перерахованих: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.  Обчисляємо залишок: 567-2*16^2=55.  Визначимо що буде стояти в другому розряді.  Тому що 3*16^1=48 < 55, а 4*16^1=64 > 55, то в другому розряді буде стояти цифра 3.  Залишок=55-3*16^1=7.  Визначаємо перший розряд: тому що 16^0=1 то цифра першого розряду дорівнює залишку, тобто 7.  У такий спосіб ми одержали число 237, але вже в шістнадцятковій системі числення. 

	Операція перекладу з десяткової системи виглядає набагато простіше.  Роздивимося її на прикладі перекладу із шстнадцяткової системи в десяткову. 

	Припустимо нам потрібно перекласти число 4A3F у десятеричну систему.  Беремо старший (4-ий) розряд і будуємо 16 в степені 4-1=3, одержуємо 16^3=4096.  Отриманий результат множимо на значення четвертого розряду, тобто 4.  Утворюється 4096*4=16384.  Цей результат ми заносимо в суму.  Переходимо до такого розряду: 16^2=256.  256 потрібно умножити на значення третього розряду тобто A.  Як відомо в шістнадцяткові системі числення букви від A до F символізують числа від 10 до 15 ( A=10, B=11, C=12, D=13, E=14, F=15).  

	Помноживши 256 на 10 одержимо 2560 і цей результат добавляємо до суми, у якій в нас поки було 16384.  У сумі в нас утворилося 18944.  Переходимо до другого розряду: 3*16^1=48, додавши це в суму одержимо 18992.  І останній розряд: 15*16^0=15.  Кінцева сума дорівнює 19007.  Ми одержали результат у десятеричній системі числення. 

	

	 Методологічний підхід.

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

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

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

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

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

	

	3.2  Теоретична основа переведення одиниць вимірювання.

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

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

	

	3.3 Переведення часу.

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

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

	
Висновки

	

		Виконуючи дану курсову роботу я краще навчився працювати в середовищі Borland Delphi 7, а також добре засвоїв цю мову програмування на практиці.

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

	


	Список  використаної літератури.

	

	Том Сван “Освоение Borland Delphi”. 1,2 том. “Діалектика” Київ 1996.

	Намир К. Шаммас “Основы Object Pascal и объектно ориентированого програмирования”.   “Діалектика” Київ 1996.

	Тимотти С. Монк, Стивен Поттс «Borland Delphi  в примерах» . Мінськ 1996г.

	Фейсон Т. « Объектно-ориентированное программирование на Borland Delphi». Київ, «Діалектика»,1996.

	5. Григоренко Я.М., Панкратова Н. Д. “Обчислювальн методи в задачах прикладно математики”: Навч. посбник.-К.:Либдь,1995.-280с.

	6. “Численные методы в инженерных исследованиях” /    В. Е. Краскевич, К. Х. Зеленский, В. И. Гречко.-К.: Вища шк.,1986.-263 с.

	7. Перминов О. Н. “Программирование на языке Паскаль”.- М.: Радио и связь,1988.-244 с.: ил.  

	8. Електронний довідник „Поради по Delphi від Валентина Озерова”

	9. Інтернет ресурси :

	http://www.vesna.org.ua

	http://www.jeep.avtograd.ru/Converters/Length_converter.htm

	http://onebit.narod.ru/metrix.htm

	http://decoder.ru

	

	 

	
Додатки

	

	Вигляд закладки „Час у різних країнах”

	

	Вигляд закладки „Одиниці вимірювання”

	

	Вигляд закладки „Системи числення”

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

	

program Metrix;



uses

  Forms,

  Main in 'Main.pas' {MainForm},

  Bases in 'Bases.pas',

  UkrRecog in 'UkrRecog.pas';



{$R *.res}



begin

  Application.Initialize;

  Application.Title := 'Довідник : одиниці вимірювання, с-ма числення, час у різних країнах.';

  Application.CreateForm(TMainForm, MainForm);

  Application.Run;

end.

	Програма складається з 3-х модулів :

	Main – Знаходиться опис головної форми і її методів включаючи основні алгоритми.

	Bases – в цьому модулі описана процедура переводу систем числення.

	UkrRecog – тут запрограмована функція переводу цілих чисел в словесний вигляд.

	

1) unit Main;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Registry, Menus, UkrRecog, Bases,

  Spin, IniFiles, Buttons ;



type

  TMainForm = class(TForm)

    PageControl: TPageControl;

    TabSheet1: TTabSheet;

    TabSheet2: TTabSheet;

    TabSheet3: TTabSheet;

    ComboGMT: TComboBox;

    Label1: TLabel;

    CurTime: TLabel;

    TimeTimer: TTimer;

    Label2: TLabel;

    PopupMenu1: TPopupMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    Label3: TLabel;

    FindedTime: TLabel;

    Edit1: TEdit;

    Edit2: TEdit;

    Base1: TSpinEdit;

    Base2: TSpinEdit;

    Animate1: TAnimate;

    StatusBar1: TStatusBar;

    RadioGroup: TRadioGroup;

    Panel: TPanel;

    MEdit: TEdit;

    MButton: TSpeedButton;

    MLabel: TLabel;

    Label4: TLabel;

    Label_: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Label_2: TLabel;

    Label_1: TLabel;

    procedure TimeTimerTimer(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure N1Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure Edit1Change(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure RadioGroupClick(Sender: TObject);

    procedure MButtonClick(Sender: TObject);

  private

    F : TIniFile;

    Edits : array of TEdit;

    procedure InitMetrix;

    procedure LoadSetings;

    procedure SaveSetings;

    { Private declarations }

  public

    { Public declarations }

  end;



const

     SetingsFile='Metrix.ini'; // файл опцій програми

     IniFile='Metrix.inf';     // файл параметрів переводу систем числення

     GMTFile= 'GMTs.inf' ;     // файл з інформацією про часові зони

     FormatString = 'Число в %Sковій системі числення';

var

  MainForm: TMainForm;



implementation



{$R *.dfm}



procedure TMainForm.FormCreate(Sender: TObject);

begin

  InitMetrix;

  ComboGMT.Items.Clear;

  ComboGMT.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+ GMTFile);

  ComboGMT.ItemIndex:=1;

  Edit1Change(Sender);

  LoadSetings;

end;

      // Ініціалізація, завантаження параметрів




procedure TMainForm.InitMetrix;

begin

  try

  F := TIniFile.Create(ExtractFilePath(Application.ExeName)+IniFile);

  except

        on  Exception do  Close;

  end;

  f.ReadSections( RadioGroup.Items );

  RadioGroup.Items.Delete(0);

  RadioGroup.ItemIndex:=0;

end;

    // Завантаження заголовків одиниць вимірювання в RadioGroup.




procedure TMainForm.TimeTimerTimer(Sender: TObject);

var Finded : TDateTime;

begin

CurTime.Caption:=TimeToStr(Now);

try

 if ComboGMT.Text[5]='+' then

 Finded:= Now + StrToTime(copy(ComboGMT.Text,6,5)) - StrToTime('02:00')

 else

 Finded:= Now - StrToTime(copy(ComboGMT.Text,6,5)) - StrToTime('02:00');

 FindedTime.Caption:=TimeToStr(Finded);

except

end;

end;

    // Порахунок і відображення часу




procedure TMainForm.N1Click(Sender: TObject);

var

  reg : TRegistry;

  ts : TStrings;

  i : integer;

  s : string[150];

begin

  TimeTimer.Enabled := False;

  ComboGMT.Items.Clear;

  reg := TRegistry.Create;

  reg.RootKey := HKEY_LOCAL_MACHINE;

  reg.OpenKey( 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones',  false);

  if reg.HasSubKeys then begin

    ts := TStringList.Create;

    reg.GetKeyNames(ts);

    reg.CloseKey;

    for i := 0 to ts.Count -1 do begin

      reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\' + ts.Strings[i], false);

      s:= reg.ReadString('Display')+'   ('+reg.ReadString('Std');

      s:=Copy(s,0,length(s)-7);

      ComboGMT.Items.Add(s+')');

      reg.CloseKey;

    end;

    ts.Free;

    ComboGMT.ItemIndex:=1;

    ComboGMT.Items.SaveToFile(ExtractFilePath(Application.ExeName)+ 'GMTs.inf');

    TimeTimer.Enabled := True;

  end else

  reg.CloseKey;

  reg.free;       end;



procedure TMainForm.N2Click(Sender: TObject);

begin

  ComboGMT.Items.Clear;

  ComboGMT.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'GMTs_default.inf');

  ComboGMT.Items.SaveToFile(ExtractFilePath(Application.ExeName)+ 'GMTs.inf');

end;

   // виклик контекстного меню – поновлення інформації про часові пояси




procedure TMainForm.Edit1Change(Sender: TObject);

Var

    NumStr : String;

    Radix : LongInt;

    ResultStr : String;

    NewRadix : LongInt;

begin

try

    NumStr := Edit1.Text;

    Radix   := Base1.Value;

    NewRadix:= Base2.Value;

    RadixStr(NumStr,Radix,NewRadix,ResultStr);

    Edit2.Text := Copy( ResultStr,0,length(ResultStr));

    Label_1.Caption:=Format(FormatString, [UkrRecognizeAmount(Base1.Value)]);

    Label_2.Caption:=Format(FormatString, [UkrRecognizeAmount(Base2.Value)]);

except end;

//Beep;

end;

    // викликається на зміну числа або основи для переводу 




procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

try

  F.Free;

except end;

SaveSetings;

end;

    // при виході закриває файли і зберігає установки




procedure TMainForm.RadioGroupClick(Sender: TObject);

var MItems : TStrings; // Назви величин

    i, t : integer;

begin

     MItems := TStringList.Create;

     Panel.Free;                  // знищення попередньої панелі

     Panel := TPanel.Create(TabSheet1);// і створення нової

     Panel.Parent := TabSheet1;

     Panel.Align := alClient;

     Panel.Caption:='';

     Panel.BevelInner := bvRaised;

     Panel.BevelOuter :=bvLowered;

     try

        F.ReadSection(RadioGroup.Items[RadioGroup.ItemIndex], MItems);

        t:= round((210-MItems.Count*20)/2);  // центрування

        SetLength(Edits, MItems.Count); // зміна розміру масиву Edits     for i := 0 to MItems.Count-1 do

     begin



     Mlabel := TLabel.Create(Panel); 

     Mlabel.Parent := Panel;

     Mlabel.Left:=10;

     Mlabel.Top := i*20+t+1;

     Mlabel.Caption := MItems[i]; // відображення назв величин 

     MLabel.Hint:=MItems[i];



     MEdit  := TEdit.Create(Panel);

     MEdit.Parent := Panel;

     MEdit.Left := 140;

     MEdit.Top  := i*20+t;

     MEdit.Height:=18;

     MEdit.Width :=100;

     MEdit.Hint:=MItems[i]; // створення Edits для редагування значень 

     Edits[i]:=MEdit;



     MButton  := TSpeedButton.Create(Panel);

     MButton.Parent := Panel;

     MButton.Left := 243;

     MButton.Top  := i*20+t;

     MButton.Height:= 20;

     MButton.Width := 85;

     MButton.Caption:='Перерахунок'; // створення кнопок

     MButton.Flat := True;

     MButton.Hint:=MItems[i];

     MButton.OnClick := MButtonClick;

     end;

     finally

     MItems.Free;

     end;

     StatusBar1.SimpleText:= RadioGroup.Items[RadioGroup.ItemIndex];

end;

  // знищує попередню панель і створює нову відповідно до вибраного пункту




procedure TMainForm.MButtonClick(Sender: TObject);

         // Реакція на кнопку „Перерахунок”


var i, j : integer;

    val, Y, X, Etalon : Extended;

begin

val:=1;

for i := 0 to High(Edits) do

begin

   if Edits[i].Hint=( Sender as TSpeedButton).Hint then

   begin  

   try                  // знайдено Edits[i] до якого викликано процедуру 

   if Edits[i].Text<>'' then

   val := StrToFloat(Edits[i].Text)

   else begin Edits[i].Text:='1'; val:=1; end;

   Break;

   except

     on EConvertError do ShowMessage('Невірний формат числа');

         end;     // try

    end;     //if

end;   //for

X := F.ReadFloat(RadioGroup.Items[RadioGroup.ItemIndex],

                                    ( Sender as TSpeedButton).Hint, 1.0) ;

Etalon := val * X;

                    // Взяття введеного значення і приведення до „еталону”

for i := 0 to High(Edits) do

begin

   if Edits[i].Hint<>( Sender as TSpeedButton).Hint then

   begin

    Y := Etalon / F.ReadFloat(RadioGroup.Items[RadioGroup.ItemIndex],

                                    Edits[i].Hint , 1.0) ;

// знаходження вихідної величини і подальше її форматування 

    Edits[i].Text:=FloatToStr(Y);

    if (pos(',', Edits[i].Text)>0) and (pos('E', Edits[i].Text)=0) then begin

    for j:= pos(',', Edits[i].Text)+1 to Length(Edits[i].Text) do

       if (Edits[i].Text[j]<>'0') then break;

    Edits[i].Text:=copy( Edits[i].Text,0,j-1 + 5); 

                                      // число значущих цифр після коми

    end;

   end;     //if

end;   //for

Beep; // звук

end;

    // перерахунок величин 




procedure TMainForm.LoadSetings; 

var Setings : TIniFile;

begin

Setings := TiniFile.Create(ExtractFilePath(Application.ExeName)+SetingsFile);

try

MainForm.Left:= Setings.ReadInteger('Window Setings', 'Left', MainForm.Left);

MainForm.Top := Setings.ReadInteger('Window Setings', 'Top', MainForm.Top);



PageControl.ActivePageIndex:= Setings.ReadInteger('Setings', 'ActivePage', PageControl.ActivePageIndex);



RadioGroup.ItemIndex:= Setings.ReadInteger('Metrix Setings', 'Metix_Index', RadioGroup.ItemIndex);



ComboGMT.ItemIndex:= Setings.ReadInteger('Time Setings', 'GMT_Index', ComboGMT.ItemIndex);



Base1.Value:= Setings.ReadInteger('Base Setings', 'Base1', Base1.Value);

Base2.Value:= Setings.ReadInteger('Base Setings', 'Base2', Base2.Value);

finally

  Setings.Free;

end;

end;

    // завантаження параметрів з файлу 




procedure TMainForm.SaveSetings; 

var Setings : TIniFile;

begin

Setings := TiniFile.Create(ExtractFilePath(Application.ExeName)+SetingsFile);

try

Setings.WriteInteger('Window Setings', 'Left', MainForm.Left);

Setings.WriteInteger('Window Setings', 'Top', MainForm.Top);



Setings.WriteInteger('Setings', 'ActivePage', PageControl.ActivePageIndex);



Setings.WriteInteger('Metrix Setings', 'Metix_Index', RadioGroup.ItemIndex);



Setings.WriteInteger('Time Setings', 'GMT_Index', ComboGMT.ItemIndex);



Setings.WriteInteger('Base Setings', 'Base1', Base1.Value);

Setings.WriteInteger('Base Setings', 'Base2', Base2.Value);



Setings.UpdateFile;

finally

  Setings.Free;

end;

end;

    // збереженняння параметрів до файлу 




end.

	

	

2) unit Bases;



interface

                        // переведення числа з однією основою до іншої

procedure RadixStr(NumStr : String;

                   Radix : LongInt;

                   NewRadix : LongInt;

                   var

                   ResultStr : String);



implementation



uses SysUtils;



procedure RadixStr(NumStr : String;    // введене число

                   Radix : LongInt;    // основа введеного числа

                   NewRadix : LongInt; // основа шуканого числа

                   var

                   ResultStr : String);// шукане число

var

  RadixChar : String;

  v : Int64;  //111111111111111111111111111111111111111111111111111111111111111

  i : LongInt;

  p : Int64;

begin

  if ((Abs(Radix) < 2)    or (Abs(Radix) > 36))    then Exit;

  if ((Abs(NewRadix) < 2) or (Abs(NewRadix) > 36)) then Exit;

  RadixChar:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

  ResultStr:= Copy( NumStr, 0, Length(NumStr));

  v := 0;                 

  UpperCase(ResultStr);   // перевірка та задання початкових параметрів



for i := 1 to (Length(ResultStr)) do

 begin

    p := Pos(ResultStr[i] , RadixChar) - 1;

    if ((p < 0) or (p >= Abs(Radix))) then begin

      Exit;     // Перевірка правильності вводу

    end;

    v := v * Abs(Radix) + p; // підрахунок числа в десятковому форматі

    if (v < 0 ) then begin

      ResultStr:= 'Помилка вводу значення перевищує 64^2 = '+IntToStr(High(Int64))+'(10)';

      exit;

    end;

 end;



if v = 0 then begin

    ResultStr := '0';

    exit;

  end else begin

    i:=1;

 repeat

      SetLength(ResultStr,i);

      ResultStr[i] := RadixChar[(v mod NewRadix)+1];

      v := v div NewRadix;  

      Inc(i)              // формування стрічки-числа з вихідною основою  

 until v = 0;

      SetLength(ResultStr,i-1);

      p := Length(ResultStr);

      RadixChar:=Copy(ResultStr,0,p);

    for i := 1 to p do   ResultStr[i]:= RadixChar[p-i+1];

// обернення стрічки

  end;

end;



end.





3) unit UkrRecog;




{by Andrew Tkachenko, proektwo@netcity.ru, Ukraine}

// Перевід цілого числа в словесну форму

interface



Const



UkrMonthString : array[1..12] of string[9] = (

'січня',    'лютого', 'березня', 'квiтня',  'травня',

'червня',   'липня',  'серпня',  'вересня', 'жовтня',

'листопада','грудня');



Function UkrRecognizeAmount(Amount:real):string;



implementation

Uses Sysutils;



Function UkrRecognizeAmount(Amount:real):string;

{Распознается число <= 999 999 999 999.99*}

const suffBL:string=' ';



suffDCT:string='дцять';

suffNA:string='надцять ';

suffDCM:string='десят';

suffMZ:string='ь';

sot:string='сот';

st:string='ст';

aa:string='а';

ee:string='и'; {e}

ii:string='і'; {и}

oo:string='о';

ov:string='ів';{ов}

C2:string='дв';

C3:string='тpи';

C4:string='чотир';

C5:string='п''ят';

C6:string='шіст';

C7:string='сім';

C8:string='вісім';

C9:string='дев''ят';

var



i:byte;

sAmount,sdInt,sdDec:string;

IsMln,IsTha{,IsDcm},IsRange1019:boolean;

currNum,endMlx,sResult:string;

begin



if (amount<0)or(amount>999999999999.99) then

begin

Result:='<<<< Помилка в діапазоні >>>>';

Exit;

end;

if amount=0 then

begin

Result:='Нуль';

Exit;

end;

STR(Amount:16:2,sAmount);

sdInt:=Copy(sAmount,1,13);

sdDec:=Copy(sAmount,15,2);

IsMln:=false;

IsTha:=false;

IsRange1019:=false;

sResult:='';





for i:=1 to 13 do

begin

currNum:=Copy(sdInt,i,1);





if currNum<>suffBL then

begin

case i of

5,6, 7:if currNum<>'0' then IsMln:=true;

8,9,10:if currNum<>'0' then IsTha:=true;

end;







if i IN [2,5,8,11] then {сотні}

begin

if currNum='1' then sResult:=sResult+st+oo+suffBL;

if currNum='2' then sResult:=sResult+C2+ii+st+ii+suffBL;

if currNum='3' then sResult:=sResult+C3+st+aa+suffBL;

if currNum='4' then sResult:=sResult+C4+ee+st+aa+suffBL;

if currNum='5' then sResult:=sResult+C5+sot+suffBL;

if currNum='6' then sResult:=sResult+C6+sot+suffBL;

if currNum='7' then sResult:=sResult+C7+sot+suffBL;

if currNum='8' then sResult:=sResult+C8+sot+suffBL;

if currNum='9' then sResult:=sResult+C9+sot+suffBL;

end;

if i IN [3,6,9,12] then{десятки}

begin

if currNum='1' then IsRange1019:=true;

if currNum='2' then sResult:=sResult+C2+aa+suffDCT+suffBL;

if currNum='3' then sResult:=sResult+C3+suffDCT+suffBL;

if currNum='4' then sResult:=sResult+'соpок ';

if currNum='5' then

sResult:=sResult+C5+suffMZ+suffDCM+suffBL;



if currNum='6' then

sResult:=sResult+C6+suffMZ+suffDCM+suffBL;



if currNum='7' then

sResult:=sResult+C7+suffMZ+suffDCM+suffBL;



if currNum='8' then

sResult:=sResult+C8+suffMZ+suffDCM+suffBL;



if currNum='9' then

sResult:=sResult+'дев''ян'+oo+st+oo+suffBL;



end;

if i in [4,7,10,13] then {одиниці}

begin

if (currNum='0') then

if IsRange1019 then sResult:=sResult+suffDCM+suffMZ+suffBL;

if (currNum='1') then

begin

if (i=13)and(not IsRange1019) then sResult:=sResult+'один '

else begin

if (i=10)and(IsRange1019) then sResult:=sResult+'оди'

else

if (i=10)and(not IsRange1019) then sResult:=sResult+'один '

else

sResult:=sResult+'один'{ин};



if IsRange1019 and (i=13) then

sResult:=sResult+'адцять'+suffBL



else

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffBL;

end;

end;

if (currNum='2') then

begin

sResult:=sResult+C2;

if (i=10)and(IsRange1019=False) then sResult:=sResult+ii

else

if (i=10)or(IsRange1019) then sResult:=sResult+aa

else sResult:=sResult+{aa}ii;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffBL;

end;

if (currNum='3') then

begin

sResult:=sResult+C3;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffBL;

end;

if (currNum='4') then

begin

sResult:=sResult+C4;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+ee+suffBL;

end;

if (currNum='5') then

begin

sResult:=sResult+C5;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffMZ+suffBL;

end;

if (currNum='6') then

begin

sResult:=sResult+C6;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffMZ+suffBL;

end;

if (currNum='7') then

begin

sResult:=sResult+C7;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffBL;

end;

if (currNum='8') then

begin

sResult:=sResult+C8;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffBL;

end;

if (currNum='9') then

begin

sResult:=sResult+C9;

if IsRange1019 then sResult:=sResult+suffNA

else sResult:=sResult+suffMZ+suffBL;

end;

end;





endMlx:='';

case i of

4:begin

if IsRange1019 then endMlx:=ov+suffBL else

if currNum='1' then endMlx:=suffBL else

if (currNum='2')or(currNum='3')or(currNum='4') then

endMlx:=aa+suffBL else endMlx:=ov+suffBL;

sResult:=sResult+'мiльярд'+endMlx;

end;

7:if IsMln then

begin

if IsRange1019 then endMlx:=ov+suffBL else

if currNum='1' then endMlx:=suffBL else

if (currNum='2')or(currNum='3')or(currNum='4') then

endMlx:=aa+suffBL else endMlx:=ov+suffBL;

sResult:=sResult+'мiльйон'+endMlx;

end;

10:if IsTha then

begin

if IsRange1019 then endMlx:=suffBL else

if currNum='1' then endMlx:=aa+suffBL else

if (currNum='2')or(currNum='3')or(currNum='4') then

endMlx:=ii+suffBL else endMlx:=suffBL;

sResult:=sResult+'тисяч'+endMlx;

end;

end;{case}

if i IN [4,7,10,13] then IsRange1019:=false;

end;{IF}

end;{FOR}



 Result:= copy(sResult,0,length(sResult)-1);

 if Result[length(Result)]='ь' then SetLength(Result, length(Result)-1);

end;



end.



	





1