Міністерствоосвіти та науки України
Вінницькийнаціональний технічний університет
ІнститутІнформаційних технологій і комп’ютерної інженерії
Кафедраобчислювальної техніки
РОЗРОБКАПРОГРАМ МОВОЮ С++ З ВИКОРИСТАННЯМ ТЕХНОЛОГІЇ ОБ’ЄКТНО-ОРІЄНТОВАНОГОПРОГРАМУВАННЯ.
Пояснювальназаписка
Докурсової роботи
Здисципліни «Програмування» за спеціальністю
«Комп’ютернісистеми і мережі»
08-23.П.74.01.00.000.ПЗ
Керівник:курсової роботи
Ст.викладач каф. ОТ
ЧернякО.І.
__________________
(підпис)
«___»_________2008 р.
Розробив
Ст.гр.2КІ-07
____________Черненко Ю.
(підпис)
ВінницяВНТУ 2008 р.
Анотація
В даній курсовій роботі булавиконана розробка програми на мові програмування С++ з використаннямоб’єктно-орієнтованого програмування, яка включала в себе роботу з файлами,класами, обробку числової інформації і роботу з графікою.
Зміст
Вступ
1. Аналіз стану технологійпрограмування та обґрунтування теми
2. Розробка програмивиконання завдання
2.1. Розробка методувирішення задачі
2.2 Структура даних і функцій
3. Розробка програми меню
4. Розробка та виконаннятестового прикладу
5. Інструкція користувача
Висновки
Перелік посилань .
Додатки
Вступ
Мовапрограмування Сi була розроблена в 1972 р. Деннисом Рiтчi, який є одним з авторівоперацiйноi системи UNIX. Мова програмування Сi пізніше була використана дляпрограмування цiеi системи, а також багатої бібліотеки обслуговуючих програм, оскільки,являлася універсальною мовою загального призначення, мова Сi зручна дляпрограмування системних задач. Поява мікрокомп’ютерів закріпила позицii мовиСi. Було створено близько 30 його нових компіляторів, а після проведення Американськимнаціональним інститутом стандартів (American National Standards Institute)робiт по стандартизацii в області програмування почали розроблятися компілятори,що вiдповiдали опублікованому весною 1986 р. проекту стандарту.
Першим компіляторомпо стандарту ANSI являлась система Турбо Сi версii 1.0 фiрми Borland International.Ця система, що складається з компілятора мови Сi, пов'язаного з ним редактора,компоновщика i бібліотек, забезпечила користувачам зручну інтегровану операційнуоболонку, а також суттєво полегшувала професійне програмування, в якомувизначальними параметрами є висока швидкість компiляцii, висока якістьзгенерованого коду та невеликий об’єм оперативної пам’ять. Мова С середсучасних мов програмування є однією iз найбільш поширених. Вона універсальна,але найбільш ефективне її використання в задачах системного програмування — розробки трансляторів, операційних систем, інструментальних засобів. Мова Сдобре зарекомендувала себе ефективністю, лаконічністю запису алгоритмів, логічноюстрункістю програм. У багатьох випадках програми, написані на мові С, можна порівнятипо швидкості з програмами, написаними на мові Асемблера, при цьому вони більш наглядніi прості у супроводі.
Основними перевагами мови С вважаться висока переча написаних на нiйпрограм мiж комп'ютерами з різною архітектурою, мiж різними операційнимисередовищами. Транслятори мови С дiять практично на всiх персональнихкомп'ютерах, які використовуються в наш час. Перечислимо окремі особливостімови С:
-в мові С реалізованіокремі операцii низького рівня (а саме операцii над бітами). Окремі з таких операційнапряму вiдповiдають машинним командам;
— мова С підтримуємеханізм показчикiв на змiннi i функцii;
-базовi типиданих мови С відображають тi ж об’єкти, з якими потрібно мати справу програміна мові Асемблера,- байти, машинні слова, символи, строки;
— як в нiякiйiншiй мові програмування високого рівня в мові С накладаються лише незначніобмеження на перетворення типів даних;
— не дивлячись на ефективністьі потужність конструкцii мови С, він відносно малий по об'єму, але в системнеоточення мови С входить бібліотека стандартних функцій, в який реалізованівстроенi оператори введення — виведення, динамічного розподілу пам’ять, управлінняпроцесами i т.д.
1.Аналіз сучасного стану технологій програмування та обґрунтування теми
У 80-х роках мова С++ сталаодною з найбільш розповсюджених та універсальних мов програмування. З допомогоюцієї мови можна створювати програми для широкого класу комп'ютерів. В 70-хроках серед створювачів мов програмування популярною стала концепція об'єкту.Об'єкт є сукупністю коду і даних, що створена для відтворення властивостейфізичних предметів чи абстрактних понять.
Об'єктно-орiєнтованепрограмування — результат природної еволюції більш ранніх методологійпрограмування. Воно виникло з процедурного програмування. Воб'єктно-орiєнтованому програмуванні ви відходите від ділення задач на підзадачі. Ви намагаєтесь побачити вашу задачу, утворену з взаємодій міжабстракціями – ідеалізованими об'єктами реального світу. Таким чином, ціль утому, щоб використовувати в програмуванні повсякденний досвід і знання проповедінку звичайних об'єктів. Об’єкт – це абстракція, але з чітко визначенимивластивостями чи ролями. Об'єктно-орiєнтоване програмування є методомпрограмування, який імітує виконання людиною якої-небудь роботи. Воно більшструктуроване i більш модульне i абстрактне, ніж традиційне програмування.
За винятком другоряднихдеталей C++ є надмножиною мови програмування C. Крім можливостей, що дає C, C++надає гнучкі й ефективні засоби визначення нових типів. Використовуючивизначення нових типів, програміст може розділяти розроблювальну програму напіддающіся легкому контролю частини. Такий метод побудови програм частоназивають абстракцією даних. Інформація про типи утримується в деяких об'єктахтипів, визначених користувачем. Такі об'єкти прості й надійні у використанні втих ситуаціях, коли їхній тип не можна встановити на стадії компіляції.Програмування з застосуванням таких об'єктів часто називаютьоб'єктно-орієнтованим. При правильному використанні цей метод дає більш короткій зрозумілішіконтрольовані програми.
Ключовим поняттям в С++ єклас. Клас — це тип, визначений користувачем. Класи забезпечують захист(закриття) даних, гарантовану ініціалізацію даних, не явне перетворення типівдля типів, визначених користувачем, динамічне завдання типу, контрольованекористувачем керування пам'яттю і механізми перевантаження операцій. C++ надаєнабагато кращі, чим у C, засоби вираження модульності програми і перевіркитипів. У мові є також удосконалення, не пов'язані безпосередньо з класами, щовключають у себе символічні константи, inline- підстановку функцій, параметрифункції по замовчуванню, перевантажені імена функцій, операції керуваннявільною пам'яттю. У C++ збережені можливості мови C по роботі з основнимиоб'єктами апаратного забезпечення (біти, байти, слова, адреси і т.п.). Цедозволяє дуже ефективно реалізовувати типи, обумовлені користувачем.
Об’єктно-орієнтовнепрограмування – методологія, яка концентрується більше на зв'язках міжоб'єктами, ніж на деталях реалізації. Дані зв'язку зазвичай розвиваються попринципу дерев, при цьому нові типи об’єктів утворюються із вже існуючих.
В С++ деякі об’єкти єчастиною самої мови. Але в цілому задача створення нових об’єктів полягає накористувача. В Borland C++ є велика кількість типів об’єктів, але реальневикористання мови потребує утворення нових типів. Ефективність ООП проявляєтьсятільки при утворенні і застосуванні груп зв'язаних між собою об'єктів. Такігрупи зазвичай називають ієрархіями класів. Розвиток цих ієрархій класів єосновою в діяльності ООП.
C++ і його стандартнібібліотеки спроектовані так, щоб забезпечувати мобільність. Наявна на сучасниймомент реалізація мови буде йти в більшості систем, що підтримують C. З C++програм можна використовувати C бібліотеки, і з C++ можна використовувативелику частину інструментальних засобів, що підтримують програмування на C.
Всі мови об’єктнаорієнтованого програмування (ООП), включаючи С++, основані на трьох основнихконцепціях, які називаються: інкапсуляція, поліморфізм і наслідування.
Характеристикиоб'єктів
Об'єкт – щось абстрактне, але з чітковизначеними властивостями чи ролями. У такому випадку схожі об'єкти володіютьсхожими властивостями і ролями, а несхожі, відповідно, ні. Воб'єктно-орієнтованому програмуванні схожі об'єкти належать до тих самих, чи досхожих класів, так само як і в реальному житті.
Розподіл ролей і властивостейможна спостерігати також і в надрах комп'ютерних програм — і метоюоб'єктно-орієнтованого програмування є виявлення цих залежностей. У сутності вС++ об'єкти є екземплярами класу, зовсім як в інших системах науковоїкласифікації. Однак перш ніж зануритися в об’єктно-орієнтовану розробку,давайте розглянемо деякі з властивостей, загальні для класу«об'єктів».
Абстракція
Ціль об'єктно-орієнтованогопрограмування полягає в тому, щоб побачити в задачі абстракції об'єктівреального світу. Що за реальні об'єкти малися на увазі? Буквально будь-які, абивони давали представлення про функціонування програм. Ці об'єкти можуть бутиматеріальними — ракети, кулінарні книги, інструменти. Або вони можуть бутиролями — сторож, батько, художник. Вони можуть бути подіями — недостачапам'яті, розпродаж, закривання дверей. Тобто усе, що дає поняття про те, що в дійсностіпредставляє із себе об'єкт.
Інкапсуляція
У той час як абстракція маєсправу з ролями і властивостями об'єкта, інкапсуляція відноситься до реалізаціїі структури об'єкта. Узагалі говорячи, клієнту об'єкта немає справи до того, якоб'єкт працює (це може мати значення, якщо його послуги занадто повільні чипомилкові); йому важливо лише, щоб декларований об'єктом сервіс неухильнонадавався. Таким чином, конструкція об'єкта звичайно захована від очей клієнта;синонімом інкапсуляції може служити більш зрозумілий термін прихованняінформації. Інкапсуляція дозволяє користувачам об'єкта ігнорувати подробиціреалізації, що знижує складність систем. Те, що кінцеві користувачі об'єкта немають відносини до його реалізації, дуже вигідно, зокрема, при роботі надвеликомасштабними програмними проектами і бібліотеками.
Модульність
Інкапсуляція дозволяє сховативід кінцевого користувача деталі реалізації і зробити систему менш складною ібільш зрозумілою. Концепція модульності йде далі. Тепер, коли об'єкти визначеніі непотрібні подробиці заховані, потрібно згрупувати об'єкти в логічні модулі,що поєднують взаємозалежні об'єкти і класи, а іншим модулям нехай будутьдоступні тільки ті деталі інтерфейсу, що абсолютно необхідні. Інтерфейснічастини знаходяться у файлах заголовків (за традицією вони мають розширення .hчи .hpp). При цьому деталі реалізації, що не представляють інтересу для іншихмодулів, залишаться у файлах типу.с,.сс,.ср чи.срр. У чому переваги такогопідходу?
По-перше, уявимо собіпрограмний проект, у якому беруть участь кілька програмістів. Коли класи йоб'єкти рознесені по окремих модулях, кожен програміст може працювати незалежновід інших. Один з одним модулі поєднують тільки інтерфейсні частини об'єктів,що знаходяться в заголовних файлах і визначені звичайно до стадії реалізації.Модульність підтримує великомасштабне програмування — на противагупрограмуванню маломасштабному, що має схильність валити всі класи й об'єкти водну купу. У об’єктно-орієнтованій розробці фізичному втіленню передуєвизначення абстрактних і логічних взаємин.
По-друге, перевага модульноїорганізації в тім, що окремі модулі можна модифікувати і перекомпілювати, неторкаючись серйозно іншу частину системи — інтерфейси залишаються тими ж, щобули.
Третьою перевагою модульностіє легкість, з якою уміло згруповані по модулях об'єкти і класи можна повторновикористовувати в інших проектах з мінімальними змінами чи без них взагалі.Повторне використання програмного забезпечення — це одна з найвищих цілейоб’єктно-орієнтованої розробки; немає кращого шляху полегшити собі роботу, чимвикористовувати класи, об'єкти і модулі, що уже добре відомі!
Ієрархія
Навіть маючи на озброєнніабстракцію, інкапсуляцію і модульність, можна упустити загальну картинусистеми: навколо стільки абстрактних об'єктів, що за всіма просто не устежити.І отут приходить на допомогу ієрархія. Ієрархію можна вважати, мабуть, візитноюкарткою об'єктно-орієнтованого стилю. Найбільш затяті його адепти стверджуютьнавіть, що якщо в проекті не використовується ієрархія ( частіше називають наслідуванням),то він просто не об'єктно-орієнтований.
При розгляді абстракціївеликі переваги дає виділення об'єктів з певною визначеною функціональністю.При аналізі проблемної області часто буває, що кілька об'єктів мають очевидносхожі структури чи функціональність. Якщо поводження об'єкта чи класуаналогічно поводженню іншого класу, то ми маємо справу з простим наслідуванням.Якщо ж у функціональності чи структурі класу присутні риси декількох класів, томає місце випадок множинного наслідування.
Наслідування часто пояснюютьяк можливість установити відношення «приналежності» між об'єктами,класами і типами даних. Явний приклад множинного спадкування: качконіс –успадковує характерні риси як ссавців, так і пернатих. Без механізмуспадкування вам доведеться постійно повторюватися. Таким чином, ієрархія — цеще одна характеристика об'єктів, яку завжди варто відшукувати, займаючисьоб'єктно-орієнтованими аналізом і проектуванням.
Поліморфізм
Поліморфізмом називають можливість перевизначеннярізних функцій та операцій. Поліморфізм полягає в тому, що, по-перше, будь-якуоперацію або функцію, яка визначена стандартним чином, можна перевизначитивсередині класу так, що вона виконуватиме зовсім інші дії, по-друге, можеіснувати одночасно багато різних функцій у класі з однаковим ім’ям, але зрізною кількістю або типами параметрів.
Огляданалізу і проектування
Поняттяоб'єктно-орієнтованого аналізу, проектування і програмування дуже близькі інерідко вживаються одне замість іншого. Але, перш ніж йти далі, давайтевсе-таки коротко позначимо розходження між ними:
З об'єктно-орієнтованогоаналізу, як правило, починається цикл розробки; ми розглядаємо задачу з поглядукласів і об'єктів.
На стадії проектування в насуже сформувалося виразне уявлення про проблему як сукупності сутностей і їхніхвзаємин, і ми починаємо розбивати задачу на реальні класи й об'єкти.
Об’єктно-орієнтованепрограмування полягає власне у втіленні в життя наших класів і об'єктів(використовуючи, у даному випадку, C++).
Темі об'єктно-орієнтованогоаналізу і проектування присвячено чимало чудових глибоких праць: але практичновсі автори — як теоретики, так і практики— згодні з думкою батька-засновникаC++ Бъярна Страуструпа (Bjarne Stroustrop), який стверджує, що досконалихправил ідентифікації об'єктів проблемної області не буває. Експериментування,навчання на своїх успіхах і своїх помилках — це найкраще правило.
Методианалізу
Об'єктно-орієнтований аналізпереслідує своєю ціллю розглянути об'єкти у вашій проблемній області. Можнанамагатися класифікувати об'єкти по подібності в поведінці чи характернихрисах. Це непроста задача, але давайте згадаємо — існує безліч наук набагатобільш древніх, ніж обчислювальна техніка, у яких класифікація об'єктів своєїпредметної області дотепер залишається улюбленим проводженням часу. Так щонічого немає правильного або неправильного — потрібно працювати з тим, щопрацює!
Аналізповедінки
Звичайно основна увагаприділяється ідентифікації в задачі об'єктів реального світу. Однак іноді буваєзручніше розглядати наслідувані обов'язки — хто, кому і що повинено надати — ібудувати ієрархію, групуючи спільні обов'язки.
Аналізобласті застосування
Коли йде розробка якоїсьсистеми, то це, найчастіше, не перша система такого роду. Можна поговорити ізлюдьми, знайомими з предметом. Наприклад, якщо йде розробка вексельної системидля юридичної фірми, можна поговорити з юристами і нотаріусами. Вони, напевно,користалися схожими системами і можуть розповісти масу цікавого не тільки про те,що повинна робити нова система, але і про те, чого вона робити не повинна. І щевони прекрасно знайомі з «об'єктами», що будуть фігурувати в системі— протоколами, звітами і т.п. Ніколи не можна недооцінювати знання і можливудопомогу кінцевих користувачів.
Аналіз«з кінця»
Експерти в предметній областіабсолютно незамінні, коли розглядається задача з погляду майбутньоговикористання продукції. Спілкуючись з користувачами, потрібно уявити собі різнісхеми роботи системи. А потім, програючи ці сценарії, вичленувати об'єкти,взаємозв'язки і моделі поведінки, необхідні для забезпечення адекватноїфункціональності.
Структурнийаналіз
Ми всі дуже добре знайомі зпрактикою поділу задачі на підзадачі. Чи то це обумовлено нашим освітою, чи цев нашій природі, але для більшості з нас це не представляє особливих зусиль.Виділивши етапи і під етапи, спробуємо побачити об'єкти і їхні взаємозв'язки.
Який би аналітичний підхід допроблеми не застосовувався, завжди потрібно пам'ятати, що ж ми шукаємо. Ключовіхарактеристики об'єктів — це абстракція, інкапсуляція, модульність і ієрархія.Коли ми окреслили об'єкти — будь-яким доступним нам методом — почнемо з того,що постараємося зрозуміти, яка інформація абсолютно необхідна взаємодіючимкласам (інкапсуляція). Розберемося, які класи взаємозалежні, а які ні(модульність). І нарешті подивимося, які класи мають схожі характеристики іфункціонування (ієрархія). Поки ми перебуваємо в стадії аналізу і проектування,ми вільні як завгодно комбінувати об'єкти, розділяти їх і так далі. Коли жпочнеться реалізація, повертатися буде вже занадто пізно. Давайтеекспериментувати, поки є можливість!
Проектування
Як уже згадувалося,об'єктно-орієнтовані аналіз і проектування — дуже близькі родичі. Коли задачапроаналізована, залишається насправді тільки уточнити деталі реалізації. Тутсамий час зосередитися на взаємозв'язках між об'єктами і модулями. Роздивитисятипи спадкування між об'єктами, визначити необхідні типи повідомлень, числопараметрів і так далі. Існує ряд систем позначення для відтворення проекту напапері. Гарне документування проекту може істотно полегшити його втілення вжиття.
Вигоди
Тепер, розглянувшихарактеристики об'єктів і деякі технології аналізу і проектування, можнакоротенько резюмувати вигоди об’єктно-орієнтованої розробки.
Проект повинен
• Грамотно використовуватиоб'єктно-орієнтовані конструкції C++. Широко використовуйте класи інаслідування.
• Створювати по можливостісамодостатні класи — вони будуть гарними кандидатами на повторне використання.
• Бути зрозумілим. Найбільшавигода об'єктно-орієнтованого проектування — в представленні проблеми влегкодоступному, тим хто розуміє, вигляді.
Захопленняресурсів при ініціалізації
Однією з перевагоб'єктно-орієнтованого програмування, яке упускається часто з виду, — цеконцепція захоплення ресурсів при ініціалізації, що належить БьернуСтрауструпу. Конструктори в C++ викликаються при створенні об'єкта, адеструктори — при його видаленні, оскільки він стає більш не потрібний.Об'єкти, що вимагають ресурсів, такі як файли або блоки пам'яті повинні успішнозахоплювати потрібні ресурси ще до того, як їх можна буде вважати дійсноствореними.
У такий спосіб воб'єктно-орієнтованому програмуванні досягається одна з заповітний цілей – якщооб'єкт створений, то можна бути упевненим у тому, що він створений цілком а незалишається в якому-небудь нестійкому половинчатому стані.
2.Розробка програми виконання завдання
2.1.Розробка методу вирішення задачі
Нехай а, в, с, d – сторони трикутника.
Для розв’язанняпоставленої задачі нам потрібно шукати точку перетину прямих, а точніше непрямих в відрізків прямих, з яких складається чотирикутник.
Запишемо рівнянняпрямої через 2-ві точки:
/>/>
Y0=Y2-Y1;
X0=X2-X1;
X*Y0–X1*Y0 =X0*Y–X0Y1
X*Y0– X0*Y =X1*Y0 –X0Y1 X1*Y0 –X0Y1=Z
(ми отримали рівняння прямих)
X11*Y01–X01Y11=W;
/>
Знайдеморозв’язок даної системи рівнянь
/>
/>
/>/>
/>
/>
/>
Це і буде розв’язок. Щоб дізнатись чи точка належить відрізку, потрібноперевірити чи відповідні координати точки лежать в межах відповідних координат кінціввідрізка.
2.2Структура даних і функцій
В програмі TRIK.Hописаний власний клас Point. В цьому класі зберігаються всі відомості прочотирикутники. В класі описані слідуючи члени:
int x;– координатиХ точки.
int y;– координатиУ точки.
Також в даномукласі описані слідуючи методи:
void drow(intcol);- виводить на екран точку вказаним кольором.
class Point
{
int x,y;
public:
Point(){}
Point(int_x, int _y) { x=_x; y=_y; }
intgetx(){ return x; }
intgety(){ return y; }
voiddraw(int color) { setcolor(color); circle(x, y, 3); }
};
3.Розробка програми меню
class MenuItem // головнийклас опису кнопок
{
int x1;
int y1;
int x2;
int y2;
char str[80];
public:
void setParam(intxx1,int yy1,int xx2,int yy2,char *sstr) // введення координат кнопок
{
x1=xx1;
y1=yy1;
x2=xx2;
y2=yy2;
strcpy(str,sstr);// копіює назву меню
};
void showAct(void);// показує кнопку в момент натиску
void showPas(void);// показує кнопку в інший момент
void About(void); //показує кнопку About
void Run(int); //показує кнопку Run
};
/***************************************************/
class Menu // клас меню длякерування кнопок
{
MenuItem mits[5]; //масив кнопок
int nomAct;
int oldNomAct;
void onLeft(void);// функція для руху кнопки вліво
void onRight(void);// функція для руху кнопки вправо
void onEnter(void);// функція для відкриття кнопки
void show(void);
void show1(void);
public:
Menu(int xx,int yy);
void getMessage(intmsg); // яка кнопка вибрана
};
4.Розробка та виконання тестового прикладу
Тексти вхідних файлових даних
4.1Текст файлу rect.txt
wer
Point 1: x= 0; y= 0;
Point 2: x= 0; y= 100;
Point 3: x= 100; y= 0;
Point 4: x= 100; y= 100;
Point 5: x= 32; y= 206;
Point 5: x= 32; y= 20;
Point 13: x= 35; y= 79;
4.2Текст файлу About.dat
Vukonav:
Chernenko Yuriy «2KI — 07»
4.3Текст файлу MENUDATA.TXT
About
Edit File
Edit Program
Run
Exit
5.Інструкція користувача
Запуск програми виконуєтьсячерез файл MENU.EXE.
Відкривається меню програми.При натиснення на кнопку About, користувач получає інформацію про розробникапрограми. Кнопки Edit File та Edit Program дозволяє редагувати текст вхіднихданих та саму програму відповідно. При натисканні на кнопку Run виконуєтьсяпрограма. Кожна наступна дія в програмі виконується після натисканні наклавішу клавіатури. Кнопка Exit дозволяє користувачу вийти з програми.
Висновки
В ході курсової роботи я напрактиці застосував свої знання з об’єктно-орієнтованого програмування.Поглибив розуміння основних принципів об’єктно-орієнтованої ідеологіїпрограмування. Відпрацював на практиці основні методи та засобиоб’єктно-орієнтованого програмування. Навчився розробляти ієрархію класів.Практично застосував такі поняття, як інкапсуляція, наслідування,перевантаження та перевизначення функцій. Набув практичних навиків роботи.
Перелікпосилань
В.В. Подбєльский, С.С. Фомін“Програмування на мові Сі”
М. Уєйт, С. Прата, Д. Мартін“Мова Сі”
П. Кіммел “Borland C++ 5”
Джесс Ліберті “Освойсамостоятельно С++ за 21день”
Гіберт Шілдт “Язык С дляпроффесионалов ”
Додатки
ДодатокА.
(обов’язковий)
Текстпрограми
#include
#include
#include
#include
class Point
{
int x, y;
public:
Point(){}
Point(int_x, int _y) { x=_x; y=_y; }
intgetx(){ return x; }
intgety(){ return y; }
voiddraw(int color) { setcolor(color); circle(x, y, 3); }
};
long sd(Point p1, Point p2,Point p3)
{
return((long)(p3.getx()-p1.getx())*(long)(p2.gety()-p1.gety())-(long)(p2.getx()-p1.getx())*(long)(p3.gety()-p1.gety()));
}
int Peretyn(Point p1, Pointp2, Point p3, Point p4)
{
if (sd(p1, p2,p3)*sd(p1, p2, p4)
return 0;
}
class Polygon
{
Point p1, p2, p3,p4;
long s;
public:
Polygon(){s = 0; }
Polygon(Point_p1, Point _p2, Point _p3, Point _p4)
{
p1=_p1;p2=_p2; p3=_p3; p4=_p4; s=0;
Pointt;
if(Peretyn(p1, p2, p3, p4))
{
t=p2;p2=p3; p3=t;
}
else
if(Peretyn(p2, p3, p4, p1))
{
t=p1;p1=p2; p2=t;
}
}
voidCalc()
{
s+=(long)(p1.getx()-p2.getx())*(long)(p1.gety()+p2.gety());
s+=(long)(p2.getx()-p3.getx())*(long)(p2.gety()+p3.gety());
s+=(long)(p3.getx()-p4.getx())*(long)(p3.gety()+p4.gety());
s+=(long)(p4.getx()-p1.getx())*(long)(p4.gety()+p1.gety());
s=labs(s)/2;
}
longgets() { return s; }
voidsets(long _s) { s=_s; }
voiddraw(int color)
{
setcolor(color);
moveto(p4.getx(),p4.gety());
lineto(p1.getx(),p1.gety());
lineto(p2.getx(),p2.gety());
lineto(p3.getx(),p3.gety());
lineto(p4.getx(),p4.gety());
}
};
float Angle(Point p1, Pointp2)
{
long dx =(p2.getx()-p1.getx());
long dy =(p2.gety()-p1.gety());
if (dx==0 &&dy==0) return 0;
float res =float(dx*dx)/(float(dx*dx+dy*dy));
if (dx
return res;
}
int main()
{
clrscr();
FILE*f=fopen(«rect1.txt», «r»);
int i, j, n;
char s[200];
fgets(s, 200, f);
for(n=0;!feof(f);++n)fgets(s, 200, f);
rewind(f);
Point* p=newPoint[n];
fgets(s, 200, f);
for(i=0; i
{
int x, y;
fscanf(f,"%s%s%s%d%s%s%d%s", s, s, s, &x, s, s, &y, s);
p[i]=Point(x,y);
if(x
{
Pointt=p[0]; p[0]=p[i]; p[i]=t;
}
}
Polygontest(Point(10, 0), Point(10, 1), Point(9, 1), Point(9, 2));
for(i=1; i
{
float An =Angle(p[0], p[i]);
int nom =i;
for(j=i+1;j
{
floatan = Angle(p[0], p[j]);
if(an
{
An= an; nom = j;
}
}
Point t =p[i]; p[i]=p[nom]; p[nom]=t;
}
int gd=DETECT, gm;
initgraph(&gd,&gm, «e:\\tc\\bgi»);
if(graphresult()!=grOk)
{
printf(«ERROR!\n»);
return 1;
}
setcolor(GREEN);
for(i=0; i
p[i].draw(GREEN);
int i1, i2, i3, i4;
Polygon pmin, pmax;pmin.sets(1000000000);
for(i1=0; i1
for(i2=i1+1;i2
for(i3=i2+1;i3
for(i4=i3+1;i4
{
if(i1==40 && i2==43 && i3==47 && i4==49)
{
i2=i2;
}
Polygonpp = Polygon(p[i1], p[i2], p[i3], p[i4]);
pp.Calc();
if(pp.gets()>pmax.gets()) pmax=pp;
if(pp.gets()
pmin=pp;
}
pmin.draw(RED);
pmax.draw(YELLOW);
getch();
closegraph();
}
ДодатокБ.
(обов’язковий)
Текст програми меню
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include«clases.h»
#define LEFT 75
#define RIGHT 77
#define ENTER 13
charbc_path[255]=«e:\\tc\\BIN\\tc.exe»;
charbc_path1[255]=«e:\\tc\\BIN\\»;
intfindfile(void);
void f_file(char*fname);
voidgenerateNewInfile(void);
/**********************************************/
class MenuItem
{
int x1;
int y1;
int x2;
int y2;
charstr[80];
public:
voidsetParam(int xx1,int yy1,int xx2,int yy2,char *sstr)
{
x1=xx1;
y1=yy1;
x2=xx2;
y2=yy2;
strcpy(str,sstr);
};
voidshowAct(void);
voidshowPas(void);
voidAbout(void);
voidRun(int);
};
voidMenuItem::showPas(void)
{
setviewport(x1,y1,x2,y2,1);
setfillstyle(1,0);
bar(1,1,x2,15);
setfillstyle(1,8);
bar(1,1,x2-1,14);
setfillstyle(1,15);
bar(0,0,x2-2,13);
setfillstyle(1,7);
bar(1,1,x2-2,13);
setcolor(15);
outtextxy(6,4,str);
setcolor(0);
outtextxy(5,3,str);
};
voidMenuItem::showAct(void)
{
setviewport(x1,y1,x2,y2,1);
setfillstyle(1,0);
bar(0,0,x2,15);
setfillstyle(1,9);
bar(2,3,x2,14);
setcolor(12);
outtextxy(7,5,str);
setcolor(10);
outtextxy(6,4,str);
};
voidMenuItem::About(void)
{
char str[80];
window(10,5,70,15);
FILE*f1=fopen(«About.dat»,«r»);
for(inti=0;i
{
fgets(str,80,f1);
gotoxy(1,i+1);
printf("%s",str);
i++;
};
getch();
};
voidMenuItem::Run(int activ)
{
switch (activ) {
case 0: About();
break;
case 1:f_file(«input.txt»);
break;
case 2:f_file(«menu.cpp»);
break;
case 3: int res= spawnl(P_WAIT,«circles.exe»,NULL);
break;
case 4:closegraph();
exit(0);
break;
};
};
/***************************************************/
class Menu
{
MenuItemmits[5];
intnomAct;
intoldNomAct;
voidonLeft(void);
voidonRight(void);
voidonEnter(void);
voidshow(void);
voidshow1(void);
public:
Menu(intxx,int yy);
voidgetMessage(int msg);
};
Menu::Menu(intxx,int yy)
{
int x,y;
x=xx;
y=yy;
char str[80];
FILE *f;
f=fopen(«menudata.txt»,«r»);
for(inti=0;i
{
fgets(str,80,f);
mits[i].setParam(x,y,x+strlen(str)*8+1,y+15,str);
x+=strlen(str)*8+3;
};
nomAct=0;
oldNomAct=1;
show();
};
voidMenu::getMessage(int msg)
{
switch(msg)
{
caseLEFT:
onLeft();
show1();
break;
caseRIGHT:
onRight();
show1();
break;
caseENTER:
onEnter();
show1();
};
};
voidMenu::onLeft(void)
{
oldNomAct=nomAct;
nomAct=(nomAct==0)?4:nomAct-1;
};
voidMenu::onRight(void)
{
oldNomAct=nomAct;
nomAct=(nomAct==4)?0:nomAct+1;
};
voidMenu::onEnter(void)
{
mits[nomAct].Run(nomAct);
};
voidMenu::show(void)
{
intgdr=DETECT,gm;
initgraph(&gdr,&gm,«e:\\tc\\bgi»);
setfillstyle(1,0);
bar(0,0,639,479);
for(inti=0;i
if(i==nomAct)
mits[i].showAct();
else
mits[i].showPas();
};
voidMenu::show1(void)
{
for(inti=0;i
if(i==nomAct)
mits[i].showAct();
else
mits[i].showPas();
};
//**********************************************
main()
{
Menu mnu(40,40);
while(1)
mnu.getMessage(getch());
}
int findfile()
{
struct ffblkffblk;
if(findfirst(bc_path,&ffblk,0)==0)return 1;
for(;;)
{
cleardevice();
gotoxy(1,1);
cout
cout
cout
cin >>bc_path;
if(bc_path[0]=='e'&&bc_path[1]=='x')
{
cleardevice();
return 0;
}
if(findfirst(bc_path,&ffblk,0)==0)
{
cleardevice();
return 1;
}
else
{
cout
getch();
}
}
}
void f_file(char*fname)
{
if(findfile()==0)return;
char cmd[250];
strcpy(cmd,«notepad „);
strcat(cmd,bc_path1);
strcat(cmd,fname);
system(cmd);
}