Об'єктно-орієнтоване програмування

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    563,38 Кб
  • Опубликовано:
    2013-02-16
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Об'єктно-орієнтоване програмування

1.      Постановка задачі


.        Спроектувати ієрархію класів геометричних об'єктів: точка, проста фігура, композиційна фігура, представлена частиною вершин і способами розрахунку інших вершин і ключових точок.

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

Переміщення на вказану відстань: вздовж заданої прямої;

Поворот на вказаний кут відносно: довільної точки, однією з вершин фігури;

Відображення відносно: початку координат, осі х, довільної прямої, середини фігури;

Проекцію фігури на: вісь х, вісь у;

Визначення: периметра;

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

.        Спроектувати клас для організації з фігур списку.

.        Провести на основі вихідного списку побудову кількох нових списків, що містять фігури, що володіють властивостями: 2.V, 2.VI всередині / зовні заданого діапазону, знаходження середини фігури в чверті.

.        Виконати сортування отриманих списків на основі: 2.VІ по не зростанню і не спаданню.

.        Забезпечити введення даних з клавіатури і з файлу, збереження у файл, відображення фігур на екрані.

Згідно із варіантом завдання необхідно створити Windows-додаток, меню якого відбиває усі пункти завдання. Для введення даних, тобто геометричних фігур, необхідно використовувати мишу, тому що маніпулювати даними зручніше у графічній формі.

геометричний ієрархія програмування фігура

2.     
Розробка структури класів


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

Таким буде клас «Точка».

Таблиця 1. Структура класу «Точка» (MyPoint)

Поле

Призначення

X

Координата точки х

Y

Координата точки у


Методи

Призначення

MyPoint

Конструктор, конструктор копіювання, конструктор за замовчуванням

=

Оператор присвоєння

+=

Оператор зсуву точки вздовж обох координат

SetX

Метод встановлення координати х для точки

SetY

Метод встановлення координати у для точки

GetX

Метод доступу до координати х

GetY

Метод доступу до координати у

ShiftLine

Метод зсуву точки вздовж прямої

Rotate

Методи повороту точки на заданий кут навколо початку координат та заданої точки

Display

Метод відображення відносно початку координат, заданої точки, осі Х, заданої прямої

S

Метод обчислення відстані до заданої точки, заданої прямої

Show

Метод графічного відображення точки

Centr

Метод пошуку середини між двома точками


Таблиця 2. Структура класу «Лінія» (MyLine)

Поле

Призначення

v1

Перша вершина

v2

Друга вершина


Методи

Призначення

MyLine

Конструктор, конструктор копіювання, конструктор за замовчуванням

=

Оператор присвоєння

SetV1

Метод встановлення вершини V1

SetV2

Метод встановлення вершини V2

GetV1

Метод доступу до вершини V1

Метод доступу до вершини V2

ShiftLine

Метод зсуву лінії вздовж прямої

Rotate

Методи повороту лінії на заданий кут навколо заданої точки

Display

Метод відображення лінії відносно початку координат, заданої точки, осі Х, заданої прямої

P

Метод обчислення довжини лінії

Show

Метод графічного відображення лінії

Centr

Метод пошуку центральної точки лінії


Наступним класом буде клас «Дуга».

Таблиця 2. Структура класу «Дуга» (SemiCircle)

Поле

Призначення

v1

Перша вершина

r

Радіус

startA

Початковий кут


Методи

Призначення

SemiCircle

Конструктор, конструктор копіювання, конструктор за замовчуванням

=

Оператор присвоєння

SetV1

Метод встановлення вершини V1

SetR

Метод встановлення радіусу

SetStartA

Метод встановлення початкового кута

GetV1

Метод доступу до вершини V1

GetR

Метод доступу до радіусу

GetStartA

Метод доступу до початкового кута

ShiftLine

Метод зсуву дуги вздовж прямої

Rotate

Методи повороту дуги на заданий кут навколо заданої точки

Display

Метод відображення дуги відносно початку координат, заданої точки, осі Х, заданої прямої

P

Метод обчислення довжини дуги

Show

Метод графічного відображення дуги

Centr

Метод пошуку центральної точки дуги


Складеною фігурою згідно варіанта є «Комбо», який можна створити за допомогою двох екземплярів класу «Лінія» та двох екземплярів класу «Дуга».

Таблиця 3. Структура класу «Комбо» (Combo)

Поле

Призначення

up

Верхня дуга

down

Нижня дуга

left

Лінія, що ліворуч

right

Лінія, що праворуч


Методи

Призначення

Combo

Конструктор, конструктор копіювання, конструктор за замовчуванням

=

SetUp

Метод встановлення верхньої дуги (за опориними точками та з готового об’єкту типу «дуга»)

SetDown

Метод встановлення нижньої дуги (за опориними точками та з готового об’єкту типу «дуга»)

SetLeft

Метод встановлення лівої лінії (за опориними точками та з готового об’єкту типу «лінія»)

SetRight

Метод встановлення правої лінії (за опориними точками та з готового об’єкту типу «лінія»)

GetUp

Метод доступу до верхньої дуги

GetDown

Метод доступу до нижньої дуги

GetLeft

Метод доступу до лівої лінії

GetRight

Метод доступу до правої лінії

ShiftLine

Метод зсуву фігури вздовж прямої

Rotate

Методи повороту фігури на заданий кут навколо заданої точки

Display

Метод відображення фігури відносно початку координат, заданої точки, осі Х, заданої прямої

P

Метод обчислення периметру фігури

Show

Метод графічного відображення фігури

Centr

Метод пошуку центральної точки фігури

DisplayС

Метод відображення фігури відносно центральної точки

S

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


Набір даних типу «Комбо» повинен формуватися у вигляді однозв’язного списку.

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

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

На рис. 1 наведена структура однозв'язного списку. На ньому поле INF - інформаційне поле, дані, NEXT - покажчик на наступний елемент списку. Кожен список повинен мати особливий елемент, що називається вказівником початку списку або головою списку, який зазвичай за форматом відмінний від решти елементів. У полі покажчика останнього елемента списку знаходиться спеціальний ознака nil, що свідчить про кінець списку.

Рисунок 1 - Представлення однозв’язного списку в пам'яті

Вставка елемента в середину однозв'язного списку показана на рис. 2.

Рисунок 2 - Вставка елемента в середину однозв’язного списку

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

Рисунок 3 - Вставка елемента в початок однозв’язного списку

Рисунок 4 - Видалення елемента з однозв’язного списку

Змінність динамічних структур даних передбачає не тільки зміни розміру структури, але й зміни зв'язків між елементами. Для зв'язних структур зміна зв'язків не вимагає пересилки даних в пам'яті, а тільки зміни вказівників в елементах зв'язної структури. Як приклад наведена перестановка двох сусідніх елементів списку. В алгоритмі перестановки в односвязного списку (рис. 5) виходили з того, що відома адреса елемента, що передує парі, в якій проводиться перестановка. У наведеному алгоритмі також не враховується випадок перестановки першого і другого елементів.

Рисунок 5 - Перестановка сусідніх елементів однозв’язного списку

Тому для такої структури даних було створено наступні класи. Першим є «Вузол».

Таблиця 4. Структура класу «Вузол» (SListNode)

Поле

Призначення

Data

Дані вузла

Next

Вказівник на наступний вузол списку


Методи

Призначення

SListNode

Конструктор

InsertAfter

Метод додавання нового вузла після поточного


Із вузлів складається безпосередньо «Список».

Таблиця 5. Структура класу «Список» (SLinkedList)

Поле

Призначення

Head

«Голова» списку

Tail

Count

Кількість вузлів у списку


Методи

Призначення

SLinkedList

Конструктор

PushBack

Метод додавання елемента у кінець списку

PushFront

Метод додавання елемента у початок списку

PopBack

Метод видалення елемента з кінця списку

PopFront

Метод видалення елемента з початку списку

Insert

Додавання нового вузла після заданого


Клас для пересування по списку - «Ітератор».

Таблиця 5. Структура класу «Ітератор» (SListIterator)

Поле

Призначення

Node

Вузол списка

List

Список, з яким зв’язаний ітератор


Методи

Призначення

SListIterator

Конструктор

Start

Метод пересування літератора на початок списку

Forward

Метод пересування літератора на наступний елемент спсику

Item

Метод повертає значення поточного вузла

Valid

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


3.      Розробка алгоритмів


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

Відображення відносно довільної прямої:

)        Перенести все, щоб пряма проходила через початок координат;

)        Повернути все на кут, щоб пряма співпала з віссю х;

)        Виконати відображення точки відносно осі х;

)        Повернути точку на той же кут, тільки у зворотному напрямку;

)        Виконати перенос протилежний переносу у п. 1 (тобто на таку ж відстань, але у протилежному напрямку.)

Відображення відносно заданої точки:

)        Перенести все, щоб задана точка співпадала з початком координат;

)        Виконати відображення точки відносно центру координат;

)        Перенести точку у протилежному до п. 1 напрямку.

Відстань до заданої точки:


Відстань до заданої прямої:


На базі цих операцій достатньо легко виконати операції перетворення для лінії, дуги та усього об’єкту «Комбо».

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

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

Пошук центру та довжини півкола:

Тепер перейдемо до побудови алгоритмів роботи зі списками об’єктів.

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

 

4.      Розробка програмного забезпечення


У вузлах зв'язаних списків ми будемо зберігати значення типу IceCream.

Клас «Вузол» SListNode

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

Найпростіший список можна реалізувати за допомогою всього лише одного класу, який буде представляти вузли:

SListNode // SListNode - назва класу, що представляє

{ // вузол однозв’язного списку:data; // змінна «Комбо» зберігає данні вузла* next; // вказівник на наступний вузол списку

};

Клас зберігає змінну типу «Морозиво» і вказівник на наступний вузол (вузол - node).

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

Для реалізації однозв'язного списку, нам знадобиться три класи. Перший буде представляти вузли списку (ми вже почали його писати - SListNode), другий - сам однозв'язний список (SLinkedList) а третій - ітератор списку (SListIterator).

:SListNode(void) {d (SemiCircle(MyPoint (0,0), 0,0), SemiCircle (MyPoint(0,0), 0,0), MyLine (MyPoint(0,0), MyPoint (0,0)), MyLine (MyPoint(0,0), MyPoint (0,0)));= d;= 0;

}

Тут все просто, полю data, яке зберігає значення вузла, присвоюється екземпляр класу IceCream. А полю next, в якому зберігається вказівник на наступний вузол, присвоюється 0.

Крім конструктора, в класі Node буде одна функція. Назвемо її InsertAfter (вставити після). Її завданням буде вставка нового елемента списку після поточного:

SListNode: InsertAfter (Combo d) {* new_node = new SListNode; / / Створюємо вказівник на вузол._node-> data = d; / / Заповнюємо поле data._node-> next = next; / / Заповнюємо поле next. Цьому полю присвоюємо

/ / Значення поля next поточного елемента= new_node; / / Міняємо поле next поточного елемента. Тепер, поточний

} / / Вузол вказує на новостворений

Функція приймає один аргумент - значення, яке буде вставлено в поле data.

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

На цьому реалізація класу SListNode закінчена. Приступимо безпосередньо до створення списку.

Клас однозв'язного списку SLinkedList

SLinkedList {:* head; / / перший елемент списку* tail; / / останній елемент спискуcount;

};

У списку будуть зберігається три змінні. Два вказівники на вузли: на перший (head) і на останній (tail) і змінна цілого типу count, в якій буде зберігатися кількість елементів (вузлів) зв'язного списку.

Деструктор списку:

:~SLinkedList() {* delNode = head;* temp;(delNode!= 0) {= delNode->next;delNode;

}

Необхідність деструктора обумовлена тим, що при знищенні класу SLinkedList, також необхідно знищити і всі об'єкти класу SListNode, які є вузлами списку. Але між цими класами немає ніякого зв'язку, і автоматично вузли не знищаться. В результаті чого може виникнути витік пам'яті.

У функції нам необхідні два вказівника на вузли: який ми будемо зараз видаляти, і вказівник на наступний вузол, щоб не загубитися.

У циклі йде перевірка значення поточного елементу списку. Якщо у вказівникові міститься 0, значить список скінчився.

Якщо у списку ще є вузли, то ми зберігаємо вказівник на наступний вузол у тимчасовому вузлі temp. Потім видаляємо поточний вузол операцією delete. Тепер ми не можемо вказати на наступний вузол за допомогою поточного вузла:> next; / / цей код не працює!

Пам'ять виділену під delNode ми вже відпустили, а вказівник тепер вказує на зовсім іншу область пам'яті. Саме для цього нам і потрібна була допоміжна змінна temp. Якби її не було, ми б втратили всі наступні вузли. Тепер вказівнику delNode присвоюється next і у наступній ітерації циклу все повторюється.

Метод додавання елемента у кінець списку

SLinkedList: PushBack (Combo d) {(count == 0) {/ / У списку немає елементів.= tail = new SListNode;> data = d;

}{/ / У списку є хоча б один елемент>InsertAfter(d);= tail->next;

}++;

}

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

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

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

Звичайно ж, у функції PushBack потрібно не забути збільшити змінну count, так як кількість вузлів збільшилась.

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

Метод додавання вузлів у початок зв'язного списку

SLinkedList: PushFront (Combo d) {(count == 0) {= tail = new SListNode;>data = d;

}{* new_node = new SListNode;_node->next = head;= new_node;

}++;

}

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

У разі якщо список пустий, ми робимо те ж саме, що і у функції PushBack.

Якщо ж у списку є елементи, ми створюємо новий вузол. Полю next нового вузла присвоюємо head. А потім міняємо значення head, щоб він вказував на новий вузол.

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

Функція видалення першого елемента списку

SLinkedList: PopFront() {(count!= 0) {* temp = head;= head->next;temp;-;(head == NULL) // у списку був один елемент

}

Видаляти елемент має сенс, якщо список не порожній. Тому ми перевіряємо змінну count.

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

Якщо в списку був один елемент (head == tail == «коректна адреса», а поля head-> next == tail-> next == 0), нам потрібно змінити значення покажчика tail.

Метод видалення останнього вузла списку.

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

SLinkedList: PopBack() {(count == 1) {tail;= tail = 0;-;

}(count > 1) {* temp = new SListNode;= head;(temp->next!= tail) temp = temp->next;temp->next;-;

}

Коли в списку один елемент, ми просто видаляємо його, а вказівниками head і tail присвоюємо 0. Звичайно ж не забуваємо і про змінну count.

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

Тимчасовому вузлу ми присвоюємо адресу першого елемента списку. Далі у циклі відбувається перевірка поля next тимчасового вузла з адресою останнього вузла tail. Цикл припинить виконуватися, коли тимчасовий вузол буде містити адресу передостаннього елемента.

Після циклу ми пересуваємо вказівник tail назад. А потім видаляємо останній вузол. Зверніть увагу, що робиться це за допомогою поля next передостаннього вузла. Тепер, коли останній елемент видалений, поле next передостаннього вузла вказує у «порожнечу», тому ми присвоюємо цьому полю значення 0.

Щоб ще більше розширити функціональність списків для ітераторів необхідно створити свій клас.

Клас ітераторів для однозв'язного списку.

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

SListIterator {:* node;* list;

};

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

Клас Iterator містить конструктор з двома аргументами.

:SListIterator (SListNode* n, SLinkedList* l) {= n;= l;

}

У конструктор передаються вказівники на вузол і список. Заповнюються відповідні поля.

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

SListIterator: Start() {= list->head;

}

Тут все просто, полю node ми присвоюємо поле head змінної list. Тут і list, і node є членами класу Iterator.

SListIterator: Forward() {(node!= NULL)= node->next;

}

Зверніть увагу на перевірку умови. Ми можемо просунути ітератор вперед на один вузол далі вузла tail списку. Цей вузол містить значення 0.

Наступна функція повертає значення поточного вузла.

& SListIterator: Item() {node->data;

}

Метод повертає значення по посиланню.

І остання функція ітератора перевіряє його значення. Якщо у ітератор міститься 0 (список закінчився або у ньому немає елементів), то функція поверне 0. Якщо в ітераторі міститься коректне значення, то функція поверне 1.

SListIterator: Valid() {(node!= NULL);

}

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

Insert (SListIterator& itr, IceCream d) {(itr. Valid()) {.node->InsertAfter(d);(itr.node == tail) {= itr.node->next;

}++;

}

Ми робимо перевірку, на що вказує ітератор. Якщо він вказує на 0, то нічого не відбувається. Якщо ж в ітераторі міститься коректне значення, то ми додаємо вузол за допомогою функції InsertAfter. І тепер потрібно перевірити, якщо ми додали вузол після останнього, потрібно пересунути tail.

І остання функція яку ми розглянемо: функція видалення вузла зі зв'язного списку:

SLinkedList: Remove (SListIterator& itr) {* temp = head;(itr.node == head) {. Forward();();

}{(temp->next!= itr.node) temp = temp->next;. Forward();(temp->next == tail) tail = temp;temp->next;>next = itr.node;

}-;

}

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

5.      Інструкція користувача


Для роботи з додатком необхідно запустити виконуючий файл Var_022.exe. З’явиться вікно.

Рисунок 13 - Головне вікно програми

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

ü  Файл

o   Загрузить список

o   Сохранить текущий список

o   Выход

ü  Объект

o   Создать

o   Переместить

o   Повернуть относительно

§  точки

§  вершины фигуры

o   Отобразить относительно

§  Начала координат

§  Оси х

§  Произвольной прямой

§  Середины фигуры

o   Периметр

o   Расстояние от середины фигуры до…

§  Начала координат

§  Произвольной точки

§  Произвольной прямой

ü  Список

o   Создать

o   Построить список объектов

§  < заданного периметра

§  > заданного периметра

§  < расстояния от середины фигуры до начала координат

§  > расстояния от середины фигуры до начала координат

§  < расстояния от середины фигуры до произвольной точки

§  > расстояния от середины фигуры до произвольной точки

§  < расстояния от середины фигуры до произвольной прямой

§  > расстояния от середины фигуры до произвольной прямой

Розглянемо їх по черзі.

При виборі пункту меню «Файл» -> «Загрузить список» з’являється вікно. У ньому необхідно вибрати необхідний файл і натиснути кнопку «Открыть». Після чого на основному полі будуть відображені фігури списку, що був збережений у обраному файлі.

Для збереження списку після його створення на основному полі необхідно обрати пункт меню «Файл» -> «Сохранить текущий список». У вікні, що з’явилося необхідно обрати каталог, ввести ім’я файлу у полі «Имя файла» і натиснути кнопку «Сохранить».

При виборі пункту меню «Выход» робота програми завершується і вікно закривається.

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

При виборі пункту «Объект» -> «Создать» додаток переходить у режим малювання однієї фігури. Для цього необхідно мишею намалювати «верхню стіну». Після відпускання клавіші миші фігура домальовується пропорційно. Якщо перемалювати фігуру, попередня стирається. Ці етапи відображені на рисунках 14 та 15.

Рисунок 14 - Перемальовування фігури

Рисунок 15 - Фігура промальовується пропорційно лінії

Після вибору пункту меню «Объект» -> «Переместить» необхідно за допомогою миші намалювати пряму, уздовж якої необхідно виконати переміщення. Потім за допомогою клавіш керування курсором «ліворуч» і «праворуч» можна переміщати фігуру.

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

При виборі пункту меню «Объект» -> «Отобразить относительно…» при клацанні мишею по основному полу виконується обране перетворення. Лише при виборі підпункту «произвольной прямой» спочатку цю пряму необхідно намалювати за допомогою миші, а потім натиснути клавішу «ліворуч».

При виборі пункту меню «Объект» -> «Периметр» на основному полі відображається площа намальованої фігури у пікселах (рис. 16).

Рисунок 16 - Обчислення площі фігури

При виборі пункту меню «Объект» -> «Расстояние от середеины фигуры до…» на основному полі буде відображено відстань у пік селах. Тільки при визначенні відстані до заданої точки необхідно її намалювати за допомогою миші (рис. 17), а при визначенні відстані до заданої прямої - намалювати пряму.

Рисунок 17 - Обчислення відстані від середини фігури до заданої точки

При виборі пункту «Список» -> «Создать» додаток переходить у режим малювання списку фігур. Для цього необхідно мишею намалювати стільки фігур, скільки треба. Всі вони будуть додані у список (рис. 18).

Рисунок 18 - Створення списку об’єктів

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

Рисунок 19 - Список фігур, що мають периметр більше заданого

При необхідності перед натисканням клавіші «ліворуч» (при виборі відповідних підпунктів) треба мишею намалювати точку або пряму, до яких визначається відстань.

Перелік літератури


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

2.      Дейтел Х., Дейтел П. Как программировать на C++

.        Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004

.        Пахомов Б.И. C/C++ и MS Visual C++ 2008 для начинающих. - Спб.: БХВ-Петербург, 2009.

.        Прата С. Язык программирования С++. Лекции и упражнения.

Похожие работы на - Об'єктно-орієнтоване програмування

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!