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

Описание:
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

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

ХАРКІВСЬСКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

БУДІВНИЦТВА ТА АРХІТЕКТУРИ

Кафедра економічної кібернетики та інформаційних технологій

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

з об’єктно-орієнтованого програмування

на тему: «Проектування і програмна реалізація системи, яка модулює роботу з геометричними фігурами»

Студента ІІ курсу групи КН-21

Напряму підготовки 6.050101 „Комп’ютерні  науки”

 Фещук Я.В

Керівники:

Литвиненко Є.М., Леуненко О.В.

Національна шкала  

Кількість балів:___Оцінка:ECTS

Харків 2015

ЛИСТ ЗАВДАННЯ

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

Створити клас «Фігури», який містить список різних геометричних фігур. Реалізувати у класі методи додавання нової фігури, видалення фігури, перегляду списку фігур, розрахунок сумарної площі фігур. Тип списку: стек.

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

та інше.


РЕФЕРАТ

Пояснювальна записка до курсової роботи: 43 с., 13 рис., 1 табл., 1 додаток, 8 джерел. Об"єкт дослідження: програмне забезпечення, написане мовою Delphi. Предмет дослідження: реалізація засобів об’єктно- орієнтованого підходу в програмуванні. Мета роботи: дослідити механізми роботи методів класів, реалізації трьох головних принципів об’єктно- орієнтованого програмування: інкапсуляція, спадкування, поліморфізм. Методи досліджень: використання навичок програмування, набутих під час навчання, пошук необхідної додаткової інформації, користування середовищем розробки Delphi. Структура звіту включає чотири розділи. Перший розділ містить основні поняття предметної області, які необхідні для проектування та написання програми. Другий розділ представляє собою безпосередню розробку програмного забезпечення , яке базується на результатах проектування виконаного в першій частині , що проектується. Третій розділ включає пояснення безпосередньо практичної реалізації курсової роботи - програми, а саме: віртуалізацїї, спадкування, абстрагування й перевизначення методів класів. В четвертому розділі міститься посібник користувача, в якому програму представлено просто і зрозуміло користувачу з базовими навичками роботи за комп’ютером. Практичне значення курсової роботи: вдосконалити вміння та навички у програмуванні, поглибити знання про методи підготовки проектів, способи їхньої реалізації. Результати роботи: самостійне прикладне програмне забезпечення, що виконує геометричні розрахунки щодо просторових фігур, в основі яких лежить паралелограм, реалізоване за допомогою об’єктно- орієнтованого підходу.

КЛЮЧОВІ СЛОВА: ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ, ОБ’ЄКТ, КЛАС, МЕТОДИ, ІНКАПСУЛЯЦІЯ, СПАДКУВАННЯ, ПОЛІМОРФІЗМ, СЕРЕДОВИЩЕ DELPY, ГЕОМЕТРІЯ.


ЗМІСТ

ВСТУП...........................................................................
.................. 5

1    ОПИС ПРЕДМЕТНОЇ ОБЛАСТІ ТА ПОСТАНОВКА ЗАДАЧІ.. 6

2      АНАЛІЗ ТА ПРОЕКТУВАННЯ................................................. 9

3      ОПИС ПРОГРАМИ..................................................................... 11

3.1     Модуль РоїуІІпії.раз................................................................. 11

3.2      Модуль ОеоРопп.раз............................................................... 16

3.3      Модулі Саісиїаіе.раз та АсІсІН.раз......................................... 17

3.4      Модуль РгезШіІ та програма ОеоРі§иге................................ 18

3.5      Вимоги до технічного забезпечення......................................... 18

4      КЕРІВНИЦТВО КОРИСТУВАЧА............................................. 19

ВИСНОВКИ........................................................................
............. 23

СПИСОК ЛІТЕРАТУРИ................................................................. 24

ДОДАТОК А...............................................................................
..... 25


ВСТУП

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

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

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

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

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

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

1    ОПИС ПРЕДМЕТНОЇ ОБЛАСТІ ТА ПОСТАНОВКА ЗАДАЧІ

Для розробки програми необхідно мати певні знання з планіметрії.

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

У декартовій системі координат кожна точка задається двома координатами - X, У. Відстань між двома точками розраховується за формулою (1.1).

(1.1)

де АВ - відстань між двома точками А і В.

хд, Уа, хв, ув - координати точки А і В відповідно.

Координати кожної такої точки в програмі не повинні виходити за межі інтервалу [-150; 150] та задаватися цілим числом.

Якщо умовно позначити вихідні чотири точки як А, В, С, Б, тоді для того, щоб ці точки були вершинами паралелограма, достатньо умови паралельності сторін - АВ || СБ та АГ) || ВС, а також їх рівності (формули (1.2)).

АВ=СD, AD=BC


Знайшовши довжину сторін паралелограма за формулою (1.1) можна розрахувати його площу та периметр за формулами (1.3) та (1.4) відповідно.

Sпарал = a*hпарал

де Sпарал — площа паралелограма; а- сторона паралелограма, на яку опущено висоту паралелограма - hпарал.

P=2AB+2BC

де Р - периметр паралелограма.


Для побудування чотирикутної піраміди вихідний паралелограм повинен бути основою піраміди та лежати у площині Z=0. h - висота піраміди, яка проводиться з точки перетину діагоналей паралелограма в додатному напрямку та паралельно вісі OZ. Значення h повинне бути додатним цілим числом і не перевищувати межі інтервалу [0;200]. Площа повної поверхні такої піраміди буде розраховуватися за формулою (1.5).

Sпірам=Sпарал+Sбп

де Sпірам - площа повної поверхні піраміди;

Sбп - площа бічної поверхні піраміди.


Для знаходження площі бічної поверхні скористаємося формулою (1.6).

Об’єм піраміди знаходиться за формулою (1.7).

де V пірам - об’єм піраміди.

Так само має будуватися трикутна призма, одна бічна грань якої - вихідний паралелограм, який лежить на площині Z=0, а АD та ВС - сторони двох відповідних трикутників з висотою h, яка повинна проводитися з середини відрізків АD та ВС у додатному напрямі паралельно вісі OZ. H не
повинна виходити за межі інтервалу [0; 200]. Площа повної поверхні та об’єм будуть знаходитися за формулами (1.8) та (1.9) відповідно.

Sприз(1.8)

де Sприз - площа повної поверхні

де Vприз - об’єм призми.

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

знаходиться в площині Z = 0, для проектування його на площину ZOХ скористаємося формулами(1.10).

де хп, 2П- координати точки проекції на площину 20Х.

Кожну таку фігуру можна додати до списку фігур. Список повинен бути стеком, тобто мати лише один вказівник - або на початок, або на кінець списку. Операції додавання та видалення можуть бути проведені тільки з першим або з останнім елементом у списку. У списку можна зберігати не більше ніж 350 фігур.

2      АНАЛІЗ ТА ПРОЕКТУВАННЯ

Відповідно до постановки задачі для побудування об’єктно- орієнтованої моделі було створено такі класи:

-                     TPoint - точка у двовимірній системи координат;

-                     ТРaral - паралелограм;

-                     ТРrism - трикутна призма;

-                     ТРуramid - піраміда;

-                     ТFigure - елемент списку;

-                     ТLIFO - стек.

UML-діаграму с зображенням взаємодії класів ілюстровано на рис. 2.1.

Рис.2.1 -UML-діаграма ієрархії класів


Клас ТРоіnt має два поля у приватному розділі (ргіvate), а саме tх і tу, що визначають координати X та У відповідно, і методи GetХ та GetУ для доступу до цих полів через властивості (х та у).

Клас ТРaral включає в себе чотири точки - А, В, С, D, метод для розрахунку площі - Агеа та метод Реrimeter для розрахунку периметру утвореного паралелограма. Конструктор Create  перевіряє точки на відповідність вершинам паралелограма. Усі поля та методи знаходяться в публічному розділі (public).

Клас ТFigure є дочірнім класу ТРaral  і має одне додаткове поле у розділі public – next  - елемент списку. Цей клас є батьківським для класів ТPrism і ТРyramid, тому деякі його методи є абстрактними, а саме метод Volume  для розрахунку об’єму та метод Drawing  для виводу зображення фігури. Методи GetH та SetH призначені для зчитування та редагування значення висоти. Поле ph типу word саме й зберігає значення висоти фігури, але прямого доступу до нього немає (це поле у розділі private).

Класи ТPrism і ТРyramid успадковуються від класу ТFigure. В обох класах перевизначаються такі «батьківські» методи:

-                    метод Area для розрахунку площі;

-                    метод Volume для розрахунку об’єму;

-                    метод Drawing для виводу зображення фігури.

Клас TLIFO має одне поле left  (відповідно до означення стеку[2]) - перший (або лівий) елемент списку і такі методи:

-                    метод AddLeft для додавання фігури у початок списку;

-                    метод DeleteLeft для видалення першого елементу (останнього доданого) списку;

-                    метод ShowInfo для виводу інформації про увесь список;

-                    метод TotalArea  для розрахунку сумарної площі усіх фігур у списку;

-                    метод DrawingLeft  для виводу зображення першої фігури у списку;

-        метод EditHeight для зміни значення висоти останньої доданої фігури.

В деструкторі Destroy видаляються всі елементи списку.

З  ОПИС ПРОГРАМИ

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

Програма складається із семи модулів:

-                     PolyUnit.pas - модуль з описом та реалізацією класів;

-                     GeoForm.pas - модуль основної форми;

-                     Calculate.pas- модуль форми для вводу вихідних даних;

-                     AddH.pas - модуль з формою для зміни значення висоти;

-                     PictUnit.pas - модуль форми для виводу зображення фігури;

-                     reference.pas - модуль з формою для виводу довідки;

-                     PresUnit.pas - модуль форми для виводу заставки.

3.1 Модуль PolyUnit.pas

У модулі PolyUnit.pas реалізовані класи, що описані у другому розділі.

Для реалізації точки був створений клас TPoint з полями tх та tу типу Integer у розділі private. Також були створені методи GetX та GetY - функції для зчитування координат, які повертають дані типу Integer. Ці методи теж знаходяться в розділі private, тому для взаємодії з ними були створені властивості property х та property у типу Integer.

Для реалізації паралелограма був створений клас TParal з чотирма полями a,b,c,d типу ТРoint. Також були створені методи Area - віртуальна функція, яка повертає значення типу double - площу, розраховану за формулою (1.3), та Perimeter - функція, яка повертає значення типу double –

Периметр, розрахований за формулою (1.4). Конструктор Create приймає в аргументі координаті точок a,b,c,d, типу Integer(X1,Y1,X2,Y2,X3,Y3,X4,Y4) та перевіряє ці точки на відповідність вершинам паралелограма за формулами (1.2); якщо точки відповідають вершинам , для a,b,c,d, викликаються конструктори та вони ініціалізуються, якщо ні – викликається виняток , який викликає деструктор. У деструкторі Destroy звільняється пам"ять, виділена для точок a,b,c,d, а за допомогою ключового слова inherited, що викликає батьківський деструктор для очищення виділеної під координати пам’яті.

 Для реалізації елементу списку був створений клас TFigure, успадкований від класу TParl з полем next типу TFigure y роздiлi create public , полем ph типу word i такими віртуальними абстрактними методами:

- Volume — функція для розрахунку об"ему у дочірніх класах,

повертае значення типу double;

- Drawing — процедура для виводу зображення проекції фігури у

дочірніх класах, яка приймае в артументі посилання pict на об ект типу TCanvas i два значення типу Word - width i height — ширина та висота

зображення; — функція GetH для зчитування висоти у дочірніх класах, яка повертае значення типу Word, та процедура SetH, яка приймае в арryменті число NewH типу Word — нове значення висоти. Для реалізацій призми та піраміди були створені класи TPrism та TPyramid, батьківським класом для яких c TFigure. B цих класах перевизначаються за допомогою ключового слова override такі успадковані

віртуальні методи Create:

- функція Area розраховуе плоцry за формулами (1.5) і(1.8) та повертае ії в значенні типу double;

 — функція Volume розраховуе об"ем за формулами (1.7) і (1.9) та повертае його в значені типу double;

— процедура Drawing, яка малює зображення проекції фігури за формулами(1.10), приймає в аргументі посилання pict на об"єкт TCanvas та значення width і height типу Word - ширина та висота зображення.

Для реалізації списку був створений клас TLIFO з полем left типу TFigure. Він включає в себе методи для роботи зі списком типу стек.

Метод AddLeft – процедура , яка приймає в аргументі посилання f  типу

TFigure і додає об’єкт, який знаходиться за цим посиланням, у початок списку. Алгоритм роботі Create приведено на рисунку 3.1.

Рис. 3.1 - Блок-схема метода AddLeft

Метод DeleteLeft - процедура, яка видаляє фігуру з початку списка; алгоритм його роботи наведений на рисунку 3.3.

Рис. 3.3 - Блок-схема метода DeleteLeft


Метод DrawingLeft - процедура, яка зображує проекцію першої фігури списку. Вона приймає в аргументі посилання pict на об"єкт TCanvas та два значення width і height типу Word - ширина та висота зображення. Його робота полягає у виклику метода Drawing для першого елемента списку.

Метод Showlnfo - процедура, що приймає в аргументі посилання info на об"єкт типу TStringGrid. Його робота полягає у виводі до таблиці геометричних характеристик усіх фігур списку. Алгоритм його роботи ілюстрований на рисунку 3.4.

Метод Total Area - функція, яка повертає значення типу Double - сумарна площа усіх фігур списку. Алгоритм його роботи наведений на рисунку 3.5.

Деструктор Destroy викликає метод DeleteLeft, доки список не стане порожнім, і тільки потім звільняє пам"ять об"єкта списку (inherited).

Метод EditHeight - процедура, що приймає за аргумент значення NewH типу Word для зміни значення висоти останньої доданої фігури списку у процесі роботи зі списком.

3.4 - Блок-схема метода Showinfo


Рис. 3.5 - Блок-схема метода Total Area


3.2 Модуль GeoForm.pas

У модулі GeoForm.pas знаходиться клас основної форми TGeoForm, який успадкований від класа TForm.

Метод FormCreate - обробник подій, який виконується після створення форми. У ньому викликається конструктор для списку типу TLIFO, посилання на який заноситься до змінної FigureStack, та метод цього списку Showlnfo для виводу характеристик фігури у таблицю.

Метод FormClose організовує видалення всіх елементів списку фігур і звільнення пам"яті.

Методи N8Click, N9Click - обробники подій, які виконуються після натискання на кнопку додавання призми або піраміди відповідно. Вони змінюють властивість Caption надпису FigureLabel форми Calculate на відповідне значення та виводять цю форму на екран методом ShowModal.

Метод NIOClick - обробник подій, який виконується після натискання на кнопку видалення останньої доданої фігури, тобто елементу списку зліва. За допомогою функції MessageDlg виводиться запит на підтвердження видалення; якщо отримано позитивний результат, викликається метод списку DeleteLeft.

Метод N11 Click - обробник подій, що викликається для видалення всіх елементів списку. Знову за допомогою функції MessageDlg виводиться запит на підтвердження видалення; якщо отримано позитивний результат, викликається деструктор та оновлення таблиці.

Метод N13Click - обробник події, яка викликається після натискання на кнопку редагування висоти. У ньому викликається метод ShowModal цієї форми для редагування значення висоти останньої доданої фігури у списку.

Метод N12Click дозволяє викликати функцію Total Area для підрахунку сумарної площі усіх фігур у списку та вивести цю інформацію на екран за допомогою процедури showmessage.

Метод N7Click- обробник подій, який викликається після натискання на кнопку малювання фігури. Він викликає метод Axis для малювання вісей та метод списку DrawingLeft, в аргументи якому передаються pict.Canvas, pict.Width, pict.Height, де pict - поле типу TImage об"єкта PictForm.

Метод N3Click - обробник подій, який викликається при натисканні на кнопку довідки. Він викликає метод ShowModal форми Forml модуля reference.

Метод N4Click дозволяє вивести інформацію про дане програмне забезпечення за допомогою процедури showmessage.

Метод N6Click - обробник подій, який викликається для закриття основної форми.

3.3 Модулі Calculate.pas та AddH.pas

У модулі Calculate.pas знаходиться клас форми для вводу даних TCalculForm, який успадкований від класа TForm.

Метод AddFigure цього класу - обробник подій, який викликається після вводу точок та висоти нової фігури. У блоці try...except перевіряється властивість Caption надпису FigureLabel даної форми та залежно від цього викликається відповідний конструктор для фігури, викликається метод списку AddLeft, в аргумент якому передається посилання на створену фігуру. Якщо під час роботи цих методів виникає виключення, воно перехоплюється та виводиться відповідне повідомлення про неправильний ввід даних.Аналогічно цьому методу виконується метод HButtonclick класу THform з модуля AddH.pas.

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

Метод InputValid дозволяє перехопити неправильний ввід користувача у текстові поля вказанням тільки дозволених символів через оператор розгалуження case ... of.

3.4   Модуль PresUnit та програма GeoFigure

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

3.5   Вимоги до технічного забезпечення

Для нормальної роботи програми на комп"ютері повинна бути встановлена операційна система сімейства Windows NT, а саме: Windows 2000, Windows ХР, Windows Vista, Windows 7, Windows 8.

Таблиця 3.1 - Необхідні апаратні ресурси

Мінімальні

Рекомендовані

Процесор

300 МГц МГц

1 ГГц або вище

Оперативна пам"ять

128 МБ RAM

1 гб RAM або вище

Відеоадаптер і монітор

Super VGA (800x600)

Geforce серії FX (5200-5900) або аналогічний

Вільне місце на HDD

100 мб

1 гб або вище

Оптичні накопичувачі

CD-ROM

CD-ROM або DVD-ROM

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

Апаратні ресурси, які повинні задовольняти вимоги програми, представлені у таблиці 3.1

Збереження даних при запуску програми на нестабільно працюючих комп"ютерах не гарантується.

4 КЕРІВНИЦТВО КОРИСТУВАЧА

Для початку роботи з програмою слід запустити файл GeoFigure.exe, двічі клацнувши на піктограму програми лівою кнопкою миші. Після цього з"явиться заставка з назвою програми та відомостями про розробника, яка протримається на екрані 5 секунд. Після цього з"явиться основна форма з головним меню із чотирьох пунктів (рисунок 4.1).

Рис. 4.1 - Головне меню програми


Пункт «Список фигур» містить доступ до основних операції для роботи зі списком фігур. У цьому пункті можна додати у початок списку призму або піраміду. Після вибору одного з цих підпунктів з"явиться форма для вводу точок та висоти (рисунок 4.2). Слід пам"ятати, що точки слід вводити так, щоб виконувались умови АВ || СБ та АС || ВБ.


Рис. 4.2 - Вікно для вводу точок та висоти

Після додавання фігури у таблиці на основній формі з"являться координати вершин її основи та основні геометричні характеристики (рисунок 4.3).


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

Рис. 4.3 - Таблиця фігур зі списка

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


Рис. 4.4 - Вікно зміни значення висоти

Наступний пункт головного меню - «Рисунок». Він дозволяє зобразити у системі координат останню добавлену фігуру. Це показано на рисунку 4.5.

Рис. 4.5 - Вивід зображення проекції фігури

Пункт меню «Справка» дозволяє отримати довідку щодо введення вершин прямокутника (підпункт «Ввод данных») (рисунок 4.6). У цьому ж пункті є інформація про програму та розробника (підпункт «О программе»).


Для виходу із програми слід натиснути останню кнопку в меню – «Выход».

Рис. 4.7 - Довідка користувача

ВИСНОВКИ

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

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

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

Дана курсова робота допомогла студентам поглибити свої знання в області програмування, а саме раціонального використання апаратних ресурсів (пам"яті), правильне оформлення коду програми для підвищення його зрозумілості й читабельності, розробки дружнього інтуїтивно зрозумілого інтерфейсу користувача і т. д. Також було вдосконалено навички оформлення курсових робіт згідно зі стандартами ДСТУ.

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

СПИСОК ЛІТЕРАТУРИ

1.   Пример кода : Класс скелета многоугольника с основанными классами треугольника и квадрата - http://www.delphibasics.ru/Abstract.php

2.   Стек. Отличия стека от списка. Основные операции со стеком - http://informatics.mccme.ru/mod/book/view.php?id=543

3.   Диалоговые окна для вывода сообщений в Delphi (ShowMessage, MessageDlg и MessageDlgPos) - http://delphi-prg.ru/prostye-dialogovye-okna-v- delphi-showmessage-messagedlg-i-messagedlgpos

4.   Литвиненко С. M.. Методичні вказівки до виконання курсової роботи

з дисципліни «Об"єктно-орієнтоване програмування» для студентів напряму підготовки 6.050101 „Комп"ютерні науки" - X.: ХНУБА, 2014. - 26с.

5.   Как очистить все поля компонентов -

http://hashcode.rU/questions/l 1473 l/delphi-%D0%BA%D0%B0%D0%BA- %D0%BE%D 1 %87%D0%B 8%D 1 %81 %D 1 %82%D0%B8%D 1 %82%D 1 %8C- %D0%B2%D 1 %81 %D0%B 5 -%D0%BF%D0%BE%D0%BB%D 1 %8F- %D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%B D%D 1 %82%D0%BE%D0%B2

6.   Форма-заставка в Delphi ХЕ - http://delphicomponent.ru/521-forma-zastavka- v-delphi-xe.html

7.   Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений. - М.: ООО «И. Д. Вильяме», 2008. - 720 с.

8.   Эдвард Йордон, Карл Аргила. Структурные модели в объектно- ориентированном анализе и проектировании. - Лори, 1999. - 268 с.


ДОДАТОК А

Вихідній код (лістинг)створення програми

Код модуля PolyUnit.pas

unit PolyUnit;

interface

uses SysUtils, ExtCtrls, Graphics, Types, Grids, Math, dialogs;

type

TPoint = class

  private

    tx, ty: integer;

    function GetX: integer;

    function GetY: integer;

  public

    constructor Create(NewX, NewY: integer);

    property X: integer read GetX;

    property Y: integer read GetY;

end;

TParal = class

  A, B, C, D: TPoint;

  constructor Create(X1, Y1, X2, Y2, X3, Y3, X4, Y4: integer);

  destructor Destroy; override;

  function Perimeter: double; virtual;

  function Area: double; virtual;

end;

TFigure = class(TParal)

  private

    ph : word;

  public

    next: TFigure;

    constructor Create(X1, Y1, X2, Y2, X3, Y3, X4, Y4: integer; h: word);

    function GetH: word;

    procedure SetH(NewH: word);

    function Volume: Double; virtual; abstract;

    procedure Drawing(pict: TCanvas; width, height: word); virtual; abstract;

end;

TPrism = class(TFigure)

  function Area: double; override;

  function Volume: double; override;

  procedure Drawing(pict: TCanvas; width, height: word); override;

end;

TPyramid = class(TFigure)

  function Area: double; override;

  function Volume: double; override;

  procedure Drawing(pict: TCanvas; width, height: word); override;

end;

TLIFO = class

  left: TFigure;

  Constructor Create;

  Destructor Destroy; override;

  Procedure AddLeft(f: TFigure);

  Procedure DeleteLeft;

  Procedure ShowInfo(info: TStringGrid);

  Function TotalArea: double;

  Procedure DrawingLeft(pict: TCanvas; width, height : word);

  procedure EditHeight(NewH: word);

end;

implementation

//точка

function TPoint.GetX: integer;

begin

  result:= tx;

end;

function TPoint.GetY: integer;

begin

  result:= ty;

end;

constructor TPoint.Create(NewX, NewY: Integer);

begin

  inherited Create;

  tx:= NewX;

  ty:= NewY;

end;

//параллелограмм

constructor TParal.Create(X1, Y1, X2, Y2, X3, Y3, X4, Y4: integer);

begin

inherited Create;

if ( sqrt(sqr(x1 - x2) + sqr(y1 - y2)) = sqrt(sqr(x3 - x4) + sqr(y3 - y4)) )

        and ( sqrt(sqr(x1 - x4) + sqr(y1 - y4)) = sqrt(sqr(x2 - x3) + sqr(y2 - y3))) then

  begin

    A:= TPoint.Create(X1, Y1);

    B:= TPoint.Create(X2, Y2);

    C:= TPoint.Create(X3, Y3);

    D:= TPoint.Create(X4, Y4);

  end

else

  raise Exception.Create("Ошибка ввода координат!");

end;

function TParal.Perimeter: double;

begin

  result:= 2*sqrt(sqr(d.x - a.x) + sqr(d.y - a.y)) + 2*sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));

end;

function TParal.Area : Double;

begin

  result:= sqrt(sqr(a.x - b.x) + sqr(a.y - b.y)) * sqrt(sqr(a.x - c.x) + sqr(a.y - c.y));

end;

destructor TParal.Destroy;

begin

  A.free;

  B.free;

  C.free;

  D.free;

  inherited destroy;

end;

//фигура

constructor TFigure.Create(X1, Y1, X2, Y2, X3, Y3, X4, Y4: integer; h : word);

begin

  inherited Create(X1, Y1, X2, Y2, X3, Y3, X4, Y4);

  if h = 0 then

      raise Exception.Create("Высота не должна быть равна нулю!")

    else

      begin

        ph := h;

        next:= nil;

      end;

end;

function TFigure.GetH : word;

begin

  result:= ph;

end;

procedure TFigure.SetH(NewH: Word);

begin

  if NewH = 0 then

    raise Exception.Create("Высота не должна быть равна нулю!")

  else

    ph := NewH;

end;

//призма

function TPrism.Area: double;

begin

  result:= sqrt(sqr(a.x - b.x) + sqr(a.y - b.y))*

  (2*(sqrt(sqrt(sqr(a.x - d.x) + sqr(a.y - d.y))/2)+sqr(ph))+sqrt(sqr(a.x - d.x) + sqr(a.y - d.y)))+

   ph*sqrt(sqr(a.x - d.x) + sqr(a.y - d.y))

end;

function TPrism.Volume: Double;

begin

  result:= ((sqrt(sqr(a.x - d.x) + sqr(a.y - d.y))*ph)/2) * sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));

end;

procedure TPrism.Drawing(pict : TCanvas; width, Height : word);

  var x1,x2,x3,x4,y1,y2,y3,y4 : integer;

begin

  x1 := a.x + a.y div 2 + width div 3;

  x2 := b.x + b.y div 2 + width div 3;

  x3 := c.x + c.y div 2 + width div 3;

  x4 := d.x + d.y div 2 + width div 3;

  y1 := -a.y div 2 + 2*Height div 3;

  y2 := -b.y div 2 + 2*Height div 3;

  y3 := -c.y div 2 + 2*Height div 3;

  y4 := -d.y div 2 + 2*Height div 3;

  pict.Pen.Color := clRed;

  pict.Polyline([ Point(x1,y1), Point(x2,y2), Point(x3,y3), Point(x4,y4),Point(x1,y1)]);

  pict.Polyline([ Point(x1,y1), Point((x1 + x2) div 2,(y1 + y2 )div 2 - ph ), Point(x2,y2) ]);

  pict.Polyline([ Point(x3,y3), Point((x3 + x4) div 2, (y3 + y4 )div 2 - ph), Point(x4,y4) ]);

  pict.Polyline([ Point((x1 + x2) div 2,(y1 + y2 )div 2 - ph ),  Point((x3 + x4) div 2, (y3 + y4 )div 2 - ph )]);

end;

//пирамида

function TPyramid.Area: double;

begin

  result:= ((inherited perimeter*ph)/2) + inherited area;

end;

function TPyramid.Volume: double;

begin

  result:= ( inherited Area * ph) /3;

end;

procedure TPyramid.Drawing(pict: TCanvas; width, Height : word);

var x1,x2,x3,x4,y1,y2,y3,y4 : integer;

begin

  x1 := a.x + a.y div 3 + width div 3;

  x2 := b.x + b.y div 3 + width div 3;

  x3 := c.x + c.y div 3 + width div 3;

  x4 := d.x + d.y div 3 + width div 3;

  y1 := -a.y div 3 + 2*Height div 3;

  y2 := -b.y div 3 + 2*Height div 3;

  y3 := -c.y div 3 + 2*Height div 3;

  y4 := -d.y div 3 + 2*Height div 3;

  pict.Pen.Color := clRed;

  pict.Polyline([Point(x1,y1), Point(x2,y2), Point(x3,y3), Point(x4,y4),Point(x1,y1)]);

  pict.MoveTo(x1,y1);

  pict.LineTo( (((x1 + x2) div 2) + ((x3 + x4) div 2)) div 2, (((y1 + y2) div 2) + ((y3 + y4) div 2)) div 2 - ph );

  pict.MoveTo(x2,y2);

  pict.LineTo( (((x1 + x2) div 2) + ((x3 + x4) div 2)) div 2, (((y1 + y2) div 2) + ((y3 + y4) div 2)) div 2 - ph );

  pict.MoveTo(x3,y3);

  pict.LineTo( (((x1 + x2) div 2) + ((x3 + x4) div 2)) div 2, (((y1 + y2) div 2) + ((y3 + y4) div 2)) div 2 - ph );

  pict.MoveTo(x4,y4);

  pict.LineTo( (((x1 + x2) div 2) + ((x3 + x4) div 2)) div 2, (((y1 + y2) div 2) + ((y3 + y4) div 2)) div 2 - ph );

end;

//стек

constructor TLIFO.Create;

Begin

 inherited Create;

 left:=nil;

End;

destructor TLIFO.Destroy;

Begin

  While left <> Nil do DeleteLeft;

  inherited Destroy;

End;

procedure TLIFO.AddLeft(f: TFigure);

Begin

  if left = nil then

    left:= f

  else

    begin

      f.next:=left;

      left:= f;

    end;

End;

procedure TLIFO.DeleteLeft;

var d: TFigure;

Begin

if left <> nil then

  begin

  d:= left;

  left:=d.next;

  d.free;

  end;

End;

function TLIFO.TotalArea: double;

var d: TFigure; amount: Double;

Begin

  d:=left;

  amount:=0;

  While d <> Nil do

    Begin

     amount:=amount+d.Area;

     d:=d.next;

    End;

   result:=amount;

  End;

Procedure TLIFO.ShowInfo(info: TStringGrid);

var u: TFigure;

        i: byte;

begin

    info.ColCount := 10;

    for i := 0 to info.ColCount - 1 do

      info.Cols[i].Clear;

      info.Cells[0,0] := "№";

      info.Cells[1,0] := "Тип";

      info.Cells[2,0] := "Точка А";

      info.Cells[3,0] := "Точка B";

      info.Cells[4,0] := "Точка С";

      info.Cells[5,0] := "Точка D";

      info.Cells[6,0] := "Высота h";

      info.Cells[7,0] := "Периметр P";

      info.Cells[8,0] := "Площадь S";

      info.Cells[9,0] := "Объем V";

      if left <> nil then

        begin

          u := left;

          i := 1;

          while u <> nil do

            begin

              i := i+1;

              info.RowCount := i;

              info.Cells[0,i-1] := IntToStr(i-1);

              if u is TPrism then

                info.Cells[1,i-1] := "Призма"

              else

               info.Cells[1,i-1] := "Пирамида";

              info.Cells[2,i-1] := "(" + FloatToStr(u.a.x) + ", " + FloatToStr(u.a.y) + ")";

              info.Cells[3,i-1] := "(" + FloatToStr(u.b.x) + ", " + FloatToStr(u.b.y) + ")";

              info.Cells[4,i-1] := "(" + FloatToStr(u.c.x) + ", " + FloatToStr(u.c.y) + ")";

              info.Cells[5,i-1] := "(" + FloatToStr(u.d.x) + ", " + FloatToStr(u.d.y) + ")";

              info.Cells[6,i-1] := FloatToStr(u.getH);

              info.Cells[7,i-1] := FloatToStr(RoundTo(u.Perimeter, -4));

              info.Cells[8,i-1] := FloatToStr(RoundTo(u.Area, -4));

              info.Cells[9,i-1] := FloatToStr(RoundTo(u.Volume, -4));

              u := u.next;

            end;

        end;

end;

Procedure TLIFO.DrawingLeft(pict: TCanvas; width, height : word);

begin

  if left <> nil then

    left.Drawing(pict, width, height);

end;

procedure TLIFO.EditHeight(NewH: word);

begin

  if left <> nil then

    left.SetH(NewH);

end;

end.

Код модуля GeoForm.pas

unit GeoForm;

interface

uses

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

  Dialogs, Menus, PresUnit, Grids, Calculate, PolyUnit, reference;

type

  TFigureForm = class(TForm)

    MainMenu1: TMainMenu;

    GridList: TStringGrid;

    N1: TMenuItem;

    N2: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    N7: TMenuItem;

    N8: TMenuItem;

    N9: TMenuItem;

    N10: TMenuItem;

    N11: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N12: TMenuItem;

    N13: TMenuItem;

    procedure N6Click(Sender: TObject);

    procedure N8Click(Sender: TObject);

    procedure N9Click(Sender: TObject);

    procedure N10Click(Sender: TObject);

    procedure N11Click(Sender: TObject);

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

    procedure FormCreate(Sender: TObject);

    procedure N7Click(Sender: TObject);

    procedure N3Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

    procedure N12Click(Sender: TObject);

    procedure N13Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  FigureForm: TFigureForm;

  FigureStack : TLIFO = nil;

  f : TFigure = nil;

implementation

uses PictUnit, AddH;

{$R *.dfm}

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

begin

  FigureStack.Free;

end;

procedure TFigureForm.FormCreate(Sender: TObject);

begin

  FigureStack := TLIFO.Create;

  FigureStack.ShowInfo(GridList);

end;

procedure TFigureForm.N10Click(Sender: TObject);

begin

if MessageDlg("Удалить последнюю добавленную фигуру?", mtConfirmation,mbOkCancel,0 ) = mrOk then

  begin

    FigureStack.DeleteLeft;

    FigureStack.ShowInfo(GridList);

  end;

end;

procedure TFigureForm.N11Click(Sender: TObject);

begin

if MessageDlg("Очистить весь список?", mtConfirmation,mbOkCancel,0 ) = mrOk then

  begin

    FigureStack.Free;

    FigureStack := TLIFO.Create;

    FigureStack.ShowInfo(GridList);

  end;

end;

procedure TFigureForm.N12Click(Sender: TObject);

begin

  showmessage("Суммарная площадь фигур равна : " + floattostr(FigureStack.TotalArea));

end;

procedure TFigureForm.N13Click(Sender: TObject);

begin

  AddH.Hform.ShowModal;

  FigureStack.ShowInfo(GridList);

end;

procedure TFigureForm.N3Click(Sender: TObject);

begin

  reference.Form1.showmodal;

end;

procedure TFigureForm.N4Click(Sender: TObject);

begin

  showmessage("GeoFigure - программа для расчета геометрических характеристик фигур в пространстве и на плоскости. Разработчик – Фещук Яна из группы КН-21 Харьковского Национального Университета Строительства и Архитектуры");

end;

procedure TFigureForm.N6Click(Sender: TObject);

begin

  close;

end;

procedure TFigureForm.N7Click(Sender: TObject);

begin

  with PictUnit.PictForm do

    begin

      Axis;

      FigureStack.DrawingLeft(Pict.Canvas, Pict.Width, Pict.Height);

      ShowModal;

    end;

end;

procedure TFigureForm.N8Click(Sender: TObject);

begin

  Calculate.CalculForm.FigureLabel.Caption := "призмы";

  Calculate.CalculForm.ShowModal;

end;

procedure TFigureForm.N9Click(Sender: TObject);

begin

  Calculate.CalculForm.FigureLabel.Caption := "пирамиды";

  Calculate.CalculForm.ShowModal;

end;

end.

Код модуля PictUnit.pas

unit PictUnit;

interface

uses

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

  Dialogs, ExtCtrls;

type

  TPictForm = class(TForm)

    pict: TImage;

    procedure Axis;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  PictForm: TPictForm;

implementation

{$R *.dfm}

procedure TPictForm.Axis;

begin

   with pict do begin

    canvas.Pen.Color:=clWhite;

    canvas.brush.Color:=clWhite;

    canvas.Rectangle(0,0,Width,Height);

    canvas.pen.Width:=2;

    canvas.pen.color:=clBlue;

//стрелки

    canvas.polyline([Point(width div 3 -10 ,120), Point(width div 3, 100 ),

          Point(width div 3 + 10, 120)]);

    canvas.polyline([Point(2*width div 3 -20 , height div 3 +5), point(2*width div 3, height div 3),

          Point(2*width div 3 -5,height div 3 +20 )]);

    canvas.polyline([Point(width -120 ,2*height div 3 - 10), Point(width - 100 ,2*width div 3 ),

          Point(width -120 ,2*height div 3 + 10)]);

{Оси X, Z}  canvas.polyline([Point(width div 3 ,100), Point(width div 3,2*height div 3 ),

                  Point(width - 100 ,2*width div 3)]);

{Ось Y}     canvas.polyline([point(width div 3, 2*height div 3),point(2*width div 3, height div 3)]);

//надписи

    canvas.Font.Size := 15;

    canvas.TextOut(width - 120 ,2*height div 3 + 15,"X");

    canvas.TextOut(2*width div 3 + 10 , height div 3, "Y");

    canvas.TextOut(width div 3 - 30, 100, "Z");

    canvas.TextOut(width div 3 - 15, 2*height div 3 ,"0");

  end;

end;

end.

Код модуля PresUnit.pas

unit PresUnit;

interface

uses

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

  Dialogs, jpeg, ExtCtrls, StdCtrls;

type

  TPresent = class(TForm)

    FigureImage: TImage;

    Timer1: TTimer;

    procedure Timer1Timer(Sender: TObject);

    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    procedure FormHide(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Present: TPresent;

implementation

{$R *.dfm}

procedure TPresent.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

  CanClose:= Timer1.Enabled = False;

end;

procedure TPresent.FormHide(Sender: TObject);

begin

  Repeat

    Application.ProcessMessages

  Until

  Present.CloseQuery;

end;

procedure TPresent.Timer1Timer(Sender: TObject);

begin

  Timer1.Enabled:= False;

end;

end.

Код модуля Calculate.pas

unit Calculate;

interface

uses

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

  Dialogs, StdCtrls, PolyUnit;

type

  TCalculForm = class(TForm)

    Dx: TEdit;

    Ax: TEdit;

    Cx: TEdit;

    Bx: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    AddButton: TButton;

    Label5: TLabel;

    FigureLabel: TLabel;

    Dy: TEdit;

    Ay: TEdit;

    Cy: TEdit;

    By: TEdit;

    Label7: TLabel;

    h: TEdit;

    label9: TLabel;

    Button1: TButton;

    procedure AddFigure(Sender: TObject);

    procedure InputValid(Sender: TObject; var press: Char);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  CalculForm: TCalculForm;

implementation

uses GeoForm;

{$R *.dfm}

procedure TCalculForm.AddFigure(Sender: TObject);

begin

  try

    if FigureLabel.caption =  "призмы" then

      begin

        GeoForm.F := TPrism.Create(StrToInt(Ax.Text),

        StrToInt(Ay.Text),StrToInt(Bx.Text),StrToInt(By.Text),StrToInt(Cx.Text),

        StrToInt(Cy.Text),StrToInt(Dx.Text),StrToInt(Dy.Text),StrToInt(h.Text));

        GeoForm.FigureStack.addleft(f);

        GeoForm.F := nil;

        geoform.FigureStack.ShowInfo(FigureForm.GridList);

        close;

      end else

    if FigureLabel.caption = "пирамиды" then

      begin

        GeoForm.F := TPyramid.Create(StrToInt(Ax.Text),

        StrToInt(Ay.Text),StrToInt(Bx.Text),StrToInt(By.Text),StrToInt(Cx.Text),

        StrToInt(Cy.Text),StrToInt(Dx.Text),StrToInt(Dy.Text),StrToInt(h.Text));

        GeoForm.FigureStack.AddLeft(F);

        GeoForm.F := nil;

        GeoForm.FigureStack.ShowInfo(FigureForm.GridList);

        close;

       end

  except

    ShowMessage("Ошибка ввода, пожалуйста, проверте значения");

  end;

end;

procedure TCalculForm.Button1Click(Sender: TObject);

var i: byte;

begin

try

  for i:= 1 to CalculForm.ComponentCount do

    begin

      if (CalculForm.Components[i] is TEdit) then

      TEdit(CalculForm.Components[i]).Text:= "";

    end;

except

end;

end;

procedure TCalculForm.InputValid(Sender: TObject; var press: Char);

begin

  case press of

    "0".."9", "-", #8: ;

  else press:=chr(0);

end;

end;

end.

Код модуля Refrence.pas

unit reference;

interface

uses

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

  Dialogs, StdCtrls, jpeg, ExtCtrls;

type

  TForm1 = class(TForm)

    Image1: TImage;

    Memo1: TMemo;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

end.

Код файлу проекту GeoFigure.dpr

program GeoFigure;

uses

  Forms,

  GeoForm in "GeoForm.pas" {FigureForm},

  PolyUnit in "PolyUnit.pas",

  PresUnit in "PresUnit.pas" {Present},

  Calculate in "Calculate.pas" {CalculForm},

  PictUnit in "PictUnit.pas" {PictForm},

  reference in "reference.pas" {Form1},

  AddH in "AddH.pas" {HForm};

{$R *.res}

begin

Application.Initialize;

Present := TPresent.Create(Application);

  Present.Show;

  Present.Update;

  Application.Initialize;

  Application.CreateForm(TFigureForm, FigureForm);

  Application.CreateForm(THForm, HForm);

  Present.Hide;

  Present.Free;

  Application.CreateForm(TCalculForm, CalculForm);

  Application.CreateForm(TPictForm, PictForm);

  Application.CreateForm(TForm1, Form1);

  Application.Run;

end.

Информация о файле
Название файла Проектування і програмна реалізація системи, яка модулює роботу з геометричними фігурами от пользователя loreni
Дата добавления 5.5.2020, 17:53
Дата обновления 5.5.2020, 17:53
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 441.92 килобайт (Примерное время скачивания)
Просмотров 388
Скачиваний 151
Оценить файл