Об'єктно-орієнтоване програмування
Хоча, за допомогою ітераторів і можна додавати вузли до списку (метод InsertAfter класу SListNode), робиться це не дуже добре. Якщо ітератор вказує на останній вузол, і ми викликаємо функцію InsertAfter, то список зіпсується, так як в InsertAfter ніяк не обробляється перевірка tail списку. Тому для ітераторів більш правильним рішенням буде написати власну функцію. Причому краще цю функцію зробити… Читати ще >
Об'єктно-орієнтоване програмування (реферат, курсова, диплом, контрольна)
1. Постановка задачі
1. Спроектувати ієрархію класів геометричних об'єктів: точка, проста фігура, композиційна фігура, представлена частиною вершин і способами розрахунку інших вершин і ключових точок.
2. Забезпечити виконання операцій в різних системах координат з геометричними фігурами:
Переміщення на вказану відстань: вздовж заданої прямої;
Поворот на вказаний кут відносно: довільної точки, однією з вершин фігури;
Відображення відносно: початку координат, осі х, довільної прямої, середини фігури;
Проекцію фігури на: вісь х, вісь у;
Визначення: периметра;
Визначення відстані до: початку координат, довільної точки, довільної прямої від середини фігури.
3. Спроектувати клас для організації з фігур списку.
4. Провести на основі вихідного списку побудову кількох нових списків, що містять фігури, що володіють властивостями: 2. V, 2. VI всередині / зовні заданого діапазону, знаходження середини фігури в чверті.
5. Виконати сортування отриманих списків на основі: 2. VІ по не зростанню і не спаданню.
6. Забезпечити введення даних з клавіатури і з файлу, збереження у файл, відображення фігур на екрані.
Згідно із варіантом завдання необхідно створити 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 | |
GetV2 | Метод доступу до вершини 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) Перенести все, щоб пряма проходила через початок координат;
2) Повернути все на кут, щоб пряма співпала з віссю х;
3) Виконати відображення точки відносно осі х;
4) Повернути точку на той же кут, тільки у зворотному напрямку;
5) Виконати перенос протилежний переносу у п. 1 (тобто на таку ж відстань, але у протилежному напрямку.)
Відображення відносно заданої точки:
1) Перенести все, щоб задана точка співпадала з початком координат;
2) Виконати відображення точки відносно центру координат;
3) Перенести точку у протилежному до п. 1 напрямку.
Відстань до заданої точки:
Відстань до заданої прямої:
На базі цих операцій достатньо легко виконати операції перетворення для лінії, дуги та усього об'єкту «Комбо».
Наприклад, щоб виконати зсув лінії уздовж довільної прямої необхідно це перетворення виконати для обох точок лінії.
Але для лінії та дуги додаються такі питання, як обчислення довжини і пошук центру фігури.
Пошук центру та довжини півкола:
Тепер перейдемо до побудови алгоритмів роботи зі списками об'єктів.
Тепер розглянемо алгоритм створення списку об'єктів, що відповідають деяким вимогам.
4. Розробка програмного забезпечення
У вузлах зв’язаних списків ми будемо зберігати значення типу IceCream.
Клас «Вузол» SListNode
Кожний вузол однозв’язного списку складається з двох змінних. У першій зберігається значення. Друга представляє із себе вказівник на наступний вузол.
Найпростіший список можна реалізувати за допомогою всього лише одного класу, який буде представляти вузли:
class SListNode // SListNode — назва класу, що представляє
{ // вузол однозв’язного списку
public:
Combo data; // змінна «Комбо» зберігає данні вузла
SListNode* next; // вказівник на наступний вузол списку
};
Клас зберігає змінну типу «Морозиво» і вказівник на наступний вузол (вузол — node).
При цьому ми створюємо вказівник на перший вузол і через нього отримуємо доступ до всіх наступних вузлів.
Для реалізації однозв’язного списку, нам знадобиться три класи. Перший буде представляти вузли списку (ми вже почали його писати — SListNode), другий — сам однозв’язний список (SLinkedList) а третій — ітератор списку (SListIterator).
Додамо конструктор до класу Node, який буде ініціалізувати поля класу:
SListNode:SListNode (void) {
Combo 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)));
data = d;
next = 0;
}
Тут все просто, полю data, яке зберігає значення вузла, присвоюється екземпляр класу IceCream. А полю next, в якому зберігається вказівник на наступний вузол, присвоюється 0.
Крім конструктора, в класі Node буде одна функція. Назвемо її InsertAfter (вставити після). Її завданням буде вставка нового елемента списку після поточного:
void SListNode: InsertAfter (Combo d) {
SListNode * new_node = new SListNode; / / Створюємо вказівник на вузол.
new_node-> data = d; / / Заповнюємо поле data.
new_node-> next = next; / / Заповнюємо поле next. Цьому полю присвоюємо
/ / Значення поля next поточного елемента
next = new_node; / / Міняємо поле next поточного елемента. Тепер, поточний
} / / Вузол вказує на новостворений Функція приймає один аргумент — значення, яке буде вставлено в поле data.
вузол, що вставляється повинен вказувати на наступний, а вказівник поточного вузла необхідно направити на новостворений елемент списку.
На цьому реалізація класу SListNode закінчена. Приступимо безпосередньо до створення списку.
Клас однозв’язного списку SLinkedList
class SLinkedList {
public:
SListNode * head; / / перший елемент списку
SListNode * tail; / / останній елемент списку
int count;
};
У списку будуть зберігається три змінні. Два вказівники на вузли: на перший (head) і на останній (tail) і змінна цілого типу count, в якій буде зберігатися кількість елементів (вузлів) зв’язного списку.
Деструктор списку:
SLinkedList:~SLinkedList () {
SListNode* delNode = head;
SListNode* temp;
while (delNode≠ 0) {
temp = delNode->next;
delete delNode;
}
Необхідність деструктора обумовлена тим, що при знищенні класу SLinkedList, також необхідно знищити і всі об'єкти класу SListNode, які є вузлами списку. Але між цими класами немає ніякого зв’язку, і автоматично вузли не знищаться. В результаті чого може виникнути витік пам’яті.
У функції нам необхідні два вказівника на вузли: який ми будемо зараз видаляти, і вказівник на наступний вузол, щоб не загубитися.
У циклі йде перевірка значення поточного елементу списку. Якщо у вказівникові міститься 0, значить список скінчився.
Якщо у списку ще є вузли, то ми зберігаємо вказівник на наступний вузол у тимчасовому вузлі temp. Потім видаляємо поточний вузол операцією delete. Тепер ми не можемо вказати на наступний вузол за допомогою поточного вузла:
delNode-> next; / / цей код не працює!
Пам’ять виділену під delNode ми вже відпустили, а вказівник тепер вказує на зовсім іншу область пам’яті. Саме для цього нам і потрібна була допоміжна змінна temp. Якби її не було, ми б втратили всі наступні вузли. Тепер вказівнику delNode присвоюється next і у наступній ітерації циклу все повторюється.
Метод додавання елемента у кінець списку
void SLinkedList: PushBack (Combo d) {
if (count == 0) {/ / У списку немає елементів.
head = tail = new SListNode;
head-> data = d;
}
else {/ / У списку є хоча б один елемент
tail->InsertAfter (d);
tail = tail->next;
}
count++;
}
При додаванні вузла у кінець списку, можливі два варіанти: у списку зовсім немає елементів або в списку є хоча б один елемент. Ці умови ми перевіряємо за допомогою поля count, що зберігає кількість елементів списку.
Так от, якщо у списку немає елементів, то ми створюємо новий вузол, а вказівниками tail і head присвоюємо адресу цього елемента.
Якщо ж у списку є хоча б один елемент, то ми створюємо вузол після вузла tail, а потім пересуваємо tail вперед (щоб цей вказівник вказував на новий елемент).
Звичайно ж, у функції PushBack потрібно не забути збільшити змінну count, так як кількість вузлів збільшилась.
Тепер, коли у нас є функція додавання вузла у кінець списку, непогано було б навчити наш список додавати елементи у початок.
Метод додавання вузлів у початок зв’язного списку
void SLinkedList: PushFront (Combo d) {
if (count == 0) {
head = tail = new SListNode;
head->data = d;
}
else {
SListNode* new_node = new SListNode;
new_node->next = head;
head = new_node;
}
count++;
}
Також як і у функції PushBack, тут можливі два варіанти: список порожній або в списку вже є хоча б один вузол.
У разі якщо список пустий, ми робимо те ж саме, що і у функції PushBack.
Якщо ж у списку є елементи, ми створюємо новий вузол. Полю next нового вузла присвоюємо head. А потім міняємо значення head, щоб він вказував на новий вузол.
Тепер наш список вміє додавати вузли у кінець і на початок. Крім того, список коректно знищується за допомогою деструктора. Непогано було б мати можливість видаляти вузли зі списку під час виконання програми. В рамках класу SLinkedList ми можемо видалити елементи з початку і з кінця. Видалення елементів із середини, у даному класі реалізувати неможливо. Тому видалення елементів з середини списку ми розглянемо пізніше, коли будемо розглядати ітератори.
Функція видалення першого елемента списку
void SLinkedList: PopFront () {
if (count≠ 0) {
SListNode* temp = head;
head = head->next;
delete temp;
count -;
if (head == NULL) // у списку був один елемент
}
Видаляти елемент має сенс, якщо список не порожній. Тому ми перевіряємо змінну count.
У функції використовується тимчасова змінна, так само як у деструкторі. Тільки у даному випадку нам потрібно видалити тільки один елемент. Потім ми зменшуємо кількість елементів у змінній count.
Якщо в списку був один елемент (head == tail == «коректна адреса», а поля head-> next == tail-> next == 0), нам потрібно змінити значення покажчика tail.
Метод видалення останнього вузла списку.
Ця функція складніше попередньої. Ми не можемо просто так видалити вузол, на який вказує tail. tail потрібно пересунути на один елемент назад. Для того щоб дізнатися адресу передостаннього елемента нам потрібно «пройти» по всіх вузлах від початку списку.
void SLinkedList: PopBack () {
if (count == 1) {
delete tail;
head = tail = 0;
count -;
}
if (count > 1) {
SListNode* temp = new SListNode;
temp = head;
while (temp->next≠ tail) temp = temp->next;
delete temp->next;
count -;
}
Коли в списку один елемент, ми просто видаляємо його, а вказівниками head і tail присвоюємо 0. Звичайно ж не забуваємо і про змінну count.
Якщо ж у списку більше одного елемента, то ми створюємо тимчасову змінну, яка буде «пробігати» всі елементи. Такі змінні називаються ітераторами. У деструкторі, до речі, теж був ітератор. Але про ітератор пізніше.
Тимчасовому вузлу ми присвоюємо адресу першого елемента списку. Далі у циклі відбувається перевірка поля next тимчасового вузла з адресою останнього вузла tail. Цикл припинить виконуватися, коли тимчасовий вузол буде містити адресу передостаннього елемента.
Після циклу ми пересуваємо вказівник tail назад. А потім видаляємо останній вузол. Зверніть увагу, що робиться це за допомогою поля next передостаннього вузла. Тепер, коли останній елемент видалений, поле next передостаннього вузла вказує у «порожнечу», тому ми присвоюємо цьому полю значення 0.
Щоб ще більше розширити функціональність списків для ітераторів необхідно створити свій клас.
Клас ітераторів для однозв’язного списку.
Після того, як ми написали класи вузла і безпосередньо списку, потрібно додати клас ітераторів. Ітератори використовуються для пересування по списку. Концепція ітераторів широко поширена і використовується з багатьма структурами даних.
class SListIterator {
public:
SListNode* node;
SLinkedList* list;
};
У класі дві змінні: вказівник на поточний вузол списку і вказівник на сам список. Покажчик на список використовується, щоб визначити, до якого списку належить даний ітератор.
Клас Iterator містить конструктор з двома аргументами.
SListIterator:SListIterator (SListNode* n, SLinkedList* l) {
node = n;
list = l;
}
У конструктор передаються вказівники на вузол і список. Заповнюються відповідні поля.
Коли ітератор добігає до кінця списку, що має відбуватися? Ітератор не може повернутися у попередній елемент. Потрібно знищувати ітератор і створювати новий? Замість цього ми створимо функцію у якій ітератор повернеться у початок списку.
void SListIterator: Start () {
node = list->head;
}
Тут все просто, полю node ми присвоюємо поле head змінної list. Тут і list, і node є членами класу Iterator.
Наступна функція пересуває ітератор у наступний вузол.
void SListIterator: Forward () {
if (node≠ NULL)
node = node->next;
}
Зверніть увагу на перевірку умови. Ми можемо просунути ітератор вперед на один вузол далі вузла tail списку. Цей вузол містить значення 0.
Наступна функція повертає значення поточного вузла.
IceCream& SListIterator: Item () {
return node->data;
}
Метод повертає значення по посиланню.
І остання функція ітератора перевіряє його значення. Якщо у ітератор міститься 0 (список закінчився або у ньому немає елементів), то функція поверне 0. Якщо в ітераторі міститься коректне значення, то функція поверне 1.
bool SListIterator: Valid () {
return (node≠ NULL);
}
Хоча, за допомогою ітераторів і можна додавати вузли до списку (метод InsertAfter класу SListNode), робиться це не дуже добре. Якщо ітератор вказує на останній вузол, і ми викликаємо функцію InsertAfter, то список зіпсується, так як в InsertAfter ніяк не обробляється перевірка tail списку. Тому для ітераторів більш правильним рішенням буде написати власну функцію. Причому краще цю функцію зробити не для ітераторів, а для списків, а ітератори можна передавати у функцію у вигляді аргументів:
void Insert (SListIterator& itr, IceCream d) {
if (itr. Valid ()) {
itr.node->InsertAfter (d);
if (itr.node == tail) {
tail = itr. node->next;
}
count++;
}
Ми робимо перевірку, на що вказує ітератор. Якщо він вказує на 0, то нічого не відбувається. Якщо ж в ітераторі міститься коректне значення, то ми додаємо вузол за допомогою функції InsertAfter. І тепер потрібно перевірити, якщо ми додали вузол після останнього, потрібно пересунути tail.
І остання функція яку ми розглянемо: функція видалення вузла зі зв’язного списку:
void SLinkedList: Remove (SListIterator& itr) {
SListNode* temp = head;
if (itr.node == head) {
itr. Forward ();
PopFront ();
}
else {
while (temp->next≠ itr. node) temp = temp->next;
itr. Forward ();
if (temp->next == tail) tail = temp;
delete temp->next;
temp->next = itr. node;
}
count -;
}
Даний метод схожий на метод видалення останнього елемента списку, тут так само використовується тимчасова змінна для зберігання вказівника на елемент списку.
5. Інструкція користувача
Для роботи з додатком необхідно запустити виконуючий файл Var022.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++
3. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004
4. Пахомов Б. И. C/C++ и MS Visual C++ 2008 для начинающих. — Спб.: БХВ-Петербург, 2009.
5. Прата С. Язык программирования С++. Лекции и упражнения.