|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Опис фізичної структури програми
Відповідно постановки задачі, діаграми класів та логічної структури розробленого головного меню програми було складено визначення методів класів Figure, Circle та Ellipse і тестова програма можливостей цих класів. Код визначення класів Figure, Circle та Ellipse знаходиться у файлі Header.h, реалізація методів у файлі AdditionalSource.cpp. Код запуску програми знаходиться у файли Source.cpp. Код програми складений на мові програмування С++ та складається з визначення абстрактних типів даних та функцій-членів класу. Для повноцінного функціонування методів класів та тестової програми необхідно підключення допоміжних бібліотечних файлів за допомогою директиви препроцесора #include, тобто бібліотек визначення типів, констант, вбудованих функцій і т.д., які забезпечують: - <iostream> - функції вводу-виводу мови С; - <fstream> - інструменти файлового вводу-виводу мови С++; - <string> - містить функції роботи з нуль-термінальними ряками і різними функціями роботи с пам’яттю; - <deque> - забезпечує методи обробки послідовного контейнеру типу deque STL; - <algorithm> - спеціальні шаблонні функції, які займаються разного роду обробкою даних у вказаних ним інтервалах контейнерів STL; - <sstream> - забезпечує роботу із рядками(string) з допомогою інтерфейсу потокового вводу/виводу; - <iomanip> - забезпечує маніпуляцію потоками; Після підключення бібліотечних файлів для облегшення та зменшення записів звернення до функцій стандартної бібліотеки STL визначаємо простір імен глобально: using namespace std; Далі виконуємо оголошення та визначення абстрактних типів даних, класів – Figure, Circle та Ellipse. Список атрибутів та операторів класів наведений у підрозділі 2.3 У класі Circle визначені два конструктори, які дозволяють привласнити захищеним членам класу привласнити початкові значення. Так, в конструкторі Figure() дані-члени centerX, centerY, angle, scaleFactor ініціалізуються значенням 0, а також параметр visible ініціалізується як true. У конструкторі Figure(float _xCenter, float _yCenter, float _angle, float _scaleFactor) закритим даним-членам відповідно передаються значення параметрів конструктору. Для перевантаження операторів «<<» та «>>» для екземплярів класу Figure визначені дружні функції. Для оператору «<<» перевантажена функція дозволяє записувати екземпляри класу у файл - friend ostream &operator<<(ostream &output, Figure &f); У середині функції у файл через знак табуляції «\t» записуються значення полів класу. Функція повертає екземпляр потоку. Для оператору «>>» перевантажена функція дозволяє зчитувати з однієї строки екземпляр класу - friend string &operator>>(string &line, Figure &f); У середині функції за допомогою substr парсимо строку по черзі, використовуючи символ табуляції(\t) як роздільник. Отримані значення присвоюємо екземпляру класу, який був переданий як аргумент функції. Функція-член класу Figure - show() виконує форматований вивід даних на екран, якщо параметр класу visible встановлений в true. Інакше замість даних о фігурі на екран буде виведено «invisible». За допомогою функції-члену input() виконується наповнення класу даними, які будуть введені з клавіатури. При чому запис дробової частини дійсних чисел буде записуватися при розділенні цілої і дробової частини числа як символом «.», так символом «,», за допомогою фунції char* dotsToCommasChar(char *c, int N), яка замінює усі точки в рядку на коми та повертає цей рядок. Функція-член класу Figure - hide() ставить параметр visible у значення false, який використовується при виводі фігури на екран. Функція-член класу Figure - unHide() ставить параметр visible у значення true. Функція-член класу Figure - rotateBy(float _angle) збільшує параметр angle фігури на передане значення _angle. Функція-член класу Figure - moveBy(float x, float y) збільшує параметри centerX та centerY на передані значення x та y. Функції-члени класу Figure: float getXCenter(),float getYCenter(), float getAngle(), float getScaleFactor() відповідно повертають значення полів centerX, centerY, angle, scaleFactor. Для зручного використання класів Figure, Circle та Ellipse об’являємо клас Programm. У ролі захищеного члена класу виступає послідовний контейнер бібліотеки STL – deque, який зберігає показники на елементи класу Figure. За допомогою директиви typedef визначаємо синонім для типу колекції - typedef deque<Figure*> MyCollection. Та створюємо показник на екземпляр цієї коллекції - MyCollection* collection;
У класі Programm є три головні фунції: · init(); · run(); · done();
void Programm::init() – задає локалізацію мови для застосунку, та ініціалізує колекцію – виділяє під неї пам’ять. void Programm::done() – видаляє усі елементи колекції видаляє показник на саму колекцію – звільняє пам’ть. void Programm::run() – фунція, в якій виконується головний цикл програми – користувачеві виводиться меню, та пропонується здійснити вибір одного з його елементів. Цикл триває до тих пір, доки користувач не вибере пункт, який відповідає за вихід з програми. Схема меню наведена на рисунку 2.2 Programm:: createCircleManually() – створює показник типу Figure, ініціалізує її як тип Circle. Викликає у нього метод input() та додає до колекції за допомогою методу колекції push_back(f); Programm:: createEllipseManually() – створює показник типу Figure, ініціалізує її як тип Elipse. Викликає у нього метод input() та додає до колекції за допомогою методу колекції push back(f); Programm:: showAllElements() – викликає метод void Programm::showAllElements(deque<Figure*> *elements), передає туди в якості аргумента collection та виводить на екран дані з колекції у форматованому вигляді. За домогою фунції setw() та параметру left бібліотеки <iomanip>, які використовуються при потоковому виводі, дані виводяться на екран в форматованому табличному вигляді. void Programm::deleteAllElements() – викликає у колекції метод clear, в результаті чого з неї повністю видаляється список фігур: collection->clear(); void Programm:: save() – зберігає колекцію фігур у файлі. Викликає функцію int Programm::writeFigures(deque <Figure*>& figures), яка по черзі записує екземпляр класу Figure у файл, та повертає кількість записаних фігур. У середині цієї функції відкривається зовнішній файл за допомогою потокового файлового виводу - ofstream out("figures.dat"). Об’являється ітератор, якому присвоюють посилання на початок списку: deque<Figure*>::iterator it = figures.begin(); Та за допомогою ітератора у циклі кожен елемент колекції перевіряється на тип: if(typeid(*(*it))==typeid(<Клас - потомок>)). Якщо тип класу – Circle(if(typeid(*(*it))==typeid(Circle))) – тоді в файловий рядок записуюється «C» та за допомогою перегруженого оператора ostream& operator<<(ostream& os, Figure& f) виконується запис у файл конкретного екземпляру класу: out <<(*((Circle*)(*it))); Якщо тип класу – Elipse – ті ж самі дії, тільки замість Circle пишемо Elipse. Void Programm:: load(); - завантажує колекцію з файлу. Викликає функцію int Programm::readFigures(deque <Figure*> &figures), яка повертає кількість зчитаних фігур. У середині файлу створюється файловий потік та відкривається для читання: ifstream in("figures.dat"); Об’являються змінні – Circle* c; // Показчик на Circle Elipse* e; // Показчик на Elipse int count=0; // Кількість зчитаних фігур string line; // Строковий рядок для читання з файлу string objType; // Тип об’єкту У циклі, доки не кінець файлу, зчитується рядок, та перевіряється перший символ, який відповідає за тип файлу: getline(in, line); objType = line.substr(0, 1); line.erase(0, line.find('\t')+1); Якщо тип об’єкту – Circle, то виділяється пам’ять під Circle, за допомогою string& operator>>(string& line, Figure& f) ідє зчитування об’єту з фалу. Після чого він додається до колекції. if(objType == "C"){ c = new Circle(); line >> (*c); figures.push_back(c); count++; } Так само і з об’єктом типу Elipse: if(objType == "E"){//Это объект Elipse e = new Elipse(); line >> (*e); figures.push_back(e); count++; } void Programm::sort() – функція для сортування. Вона спочатку пропонує користувачеві зробити вибір, для якого поля проводити сортування. Потім пропонує вибрати між сортуванням за зростанням або спаданням. Сортує за допомогою функії std::sort, яка у якості аргументів приймає посилання на перший елемент колекції, на останній, та структуру сортування. Приклад структури сортування – struct CmpXCenterDec { bool operator() (Figure *f1, Figure *f2) { return (f1->getXCenter() > f2->getXCenter()); } } cmpXCenterDec; Сенс полягає у тому, щоб перевантажити оператор порівняння bool operator() для того, щоб функція std::sort «зрозуміла», по яким критеріям проводити сортування. void Programm::find() – фунція для пошуку. Також пропонує користувачеві зробити вибір, по якому полю шукати елемент. Створється тимчасовий контейнер для зберігання знайдених елементів – deque<Figure*> *findedFigures; findedFigures = new deque<Figure*>; Та у циклі, перевіряється кожен елемент f (Figure *f = collection->at(i)) на відповідність критеріям пошуку. Якщо елемент відповідає цим критеріям, то він додається до тимчасового контейнеру findedFigures. Після циклу цей контейнер показується на екран користувачеві - showAllElements(findedFigures); Та видаляється - delete findedFigures; void Programm::requestsMenu() – додаткове меню запитів, яке складається з 5-ти пунктів: 1. Додати елемент 2. Змінити елемент; 3. Видалити елемент 4. Працювати с елементом 5. Вийти в головне меню 1.Користувачеві пропонується створити на вибір елемент типу Cirlce або Elipse та після чого пропонується вибрати позицію, куди вставити елемент з урахуванням кількості елементів в колекції. Тобто, якщо буде вибрана позиція, яка більша за розмір колекції – елемент додасться у кінець колекції. Якщо меньша за 0 – у початок. 2.Користувачеві пропонується вибрати елемент зі списку колекції та повністю змінити його, ввівши нові параметри для нього. 3.Користувачеві пропонується вибрати елемент для видалення. Якщо буде вибраний неіснуючий елемент, то буде повідомлення, що елементу з таким номером не існує. 4.Користувачеві надається доступ до вибраного їм елементу та функції роботи з ним, а саме: a. Перемістити на заданий вектор b. Повернути на заданий кут; c. Зробити невидимою d. Зробити видимою Після кожного запиту користувачеві виводиться список усіх фігур для зручної роботи. Блок-схеми та лістинг програми наведені у додатках
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.) |