Курсовая работа. 1. Введение 2 Постановка задачи 4
Скачать 195 Kb.
|
Содержание 1. Введение 2 1.Постановка задачи 4 2.Разработка проекта 5 7.ПРОГРАММНЫЙ КОД, данный преподавателем. 15 8.Исходный код программы 16 1.ВведениеПрограммирование — это процесс создания (написания) программ для компьютера. На самом деле программы можно писать не только для компьютера, но и для других устройств, у которых есть микропроцессорное устройство, способное производить математические вычисления (сложение, вычитание, умножение, деление и т.д.) и выполнять логические операции (если выполняется какое-либо условие, то делаем это (набор действий), иначе делаем то (набор альтернативных действий)). Программирование основывается на специальных алгоритмических языках, с помощью которых и задаются инструкции компьютеру (вернее, его процессору), законченный набор которых называется программой. Алгоритмических языков в данное время имеется большое множество, каждый из которых служит для решения своих задач. В то же время есть и языки общего назначения, на которых пишется большое количество современных приложений для компьютера. К этим языкам можно отнести такие, как C++, Java, C#, Delphi и другие. Программы, которые мы пишем на алгоритмических языках, непосредственно не понятны компьютеру (процессору), т.к. на самом низком уровне он может воспринимать и понимать лишь два числа: ноль и единицу. Иными словами, процессор оперирует лишь значениями и командами в двоичном коде (а двоичный код, как вы знаете, состоит из нулей и единиц). Для того чтобы текст составленной программы смог выполняться компьютером, его нужно преобразовать к понятному компьютеру формату. Для этой цели служат, так называемые трансляторы, у которых в свою очередь есть тоже две разновидности: компиляторы и интерпретаторы. Разница между ними в том, что компиляторы полностью преобразуют код к формату, понятному компьютеру, а затем уже он выполняется. Интерпретаторы построчно преобразуют код к понятному компьютеру формату, которые он так же построчно и выполняет. Вторым способом выполнение программы будет происходить несколько медленнее, нежели первым. В то же время программы, написанные на интерпретируемых языках программирования, могут быть легко перенесены в другую программную среду. К примеру, могут выполняться как на компьютерах, так и на смартфонах. Все вы, наверное, слышали о java-приложениях, которые могут работать в разных средах, за счет того, что java является интерпретируемым языком и выполняется специальной джава-машиной. 1.Постановка задачи1) Реализовать классы Circle и Triangle, моделирующие окружность и треугольник, являющиеся наследниками класса Figureи реализующие интерфейс класса Figure.(приложение 1.) 2) Сгенерировать 100 случайных фигур обоих типов с занесением их в очередь. Реализовать очередь для хранения фигур. Распечатать информацию о фигурах что находятся в очереди в формате CSV при этом очищая саму очередь. 2.Разработка проектаКласс — это абстрактный тип данных. Он сочетает в себе два функционала: 1) Это структура, в которой можно хранить различные типы данных: массивы, переменные, функции; 2) Возможность пользоваться объектно-ориентированным программированием (ООП). Создав класс можно создать его экземпляр — объект. Объект — это функционирующий прототип класса, которому можно задавать свойства и вызывать методы. У каждого вами созданного класса могут быть свойства и методы. Свойства — это все что может хранить информацию, которую вы потом можете заполнять (переменные, массивы и т.д.). Методы — это обычные функции, в функционале которых можно использовать свойства. ООП. Ранее программистам приходилось весь функционал программы записывать в одном файле. Что в будущем неизбежно приводило к путанице из-за нескольких сотен и даже тысяч строк. А с приходом классов появилась возможность отделять любую часть программы в отдельный файл. Пример - один файл отвечает за инициализацию введенных данных, другой за считывание производительности. Таким образом стала возможным структурировать программу. В ООП входит такие свойства:1) Инкапсуляция — это возможность задавать разную область видимости определенной части класса; 2) Наследование — это свойство создавать новый класс на базе старого. Такие классы называют потомками, например, есть класс магазин, на базе которого можно создать потомки (продуктовый магазин, магазин одежды). Полиморфизм — возможность создать объекты с одинаковым интерфейсом, но с разной их реализацией. Например, есть три класса треугольник, круг и квадрат. У каждого из них есть метод SquarePlis(), который вычисляет площадь фигуры. Но для каждого класса функция реализована по-разному. 3.Структуры данных Список — это линейная динамическая структура данных, у каждого элемента может быть только один предок и только один потомок. По сути своей это очень похоже на обыкновенный массив, с той лишь разницей, что размер его не имеет ограничений. Списки также подразделяются на несколько типов. В проекте использовалась такая структура данных как, реализованная через динамическую структуру данных список. Односвязный список — элемент имеет указатель только на своего потомка. Односвязный список Двусвязный список — элемент имеет указатели и на потомка, и на родителя. Двусвязный список Замкнутый (кольцевой, циклический) список — головной и хвостовой элементы которого указывают друг на друга. Замкнутый список На базе простого однонаправленного списка могут быть построены такие структуры данных, как очередь (queue) и стек (stack). Очередь есть ничто иное, как список, операции чтения и добавления элементов, в котором подвержены определенным правилам. При этом, при чтении элемента, он удаляется из очереди. Все операции проводятся по принципу «Первый пришел, первый вышел» (FIFO — first in, first out). Таким образом, для чтения в очереди доступна только голова, в то время как добавление проводится только в хвост. В программе был использован модуль random Он отвечает за генерацию случайных чисел используемые для формирования объектов классов Rectangle и triangle. В программе были разработаны следующие классы: class Point - Он является точкой, расположенной на двумерной координатной плоскости. Он имеет следующие переменные: X – значение на оси x, тип double; Y – значение на оси y, тип double; Он имеет следующие методы: public: Point(double x_, double y_) – конструктор экземпляра класса. public: void PrintAsCSV () const – выводит информацию о точке в формате CSV . class Figure – базовый класс и интерфейс для генерируемых программой фигур Он имеет следующие методы: virtual double square() const = 0; - виртуальный метод описывающий наличие метода для нахождения площади в классах потомков. virtual Rectangle GetBoundBox() const = 0; - виртуальный метод описывающий наличие метода для нахождения минимального прямоугольника в который вписана фигура в классах потомков. virtual void PrintAsCSV () const = 0; - виртуальный метод описывающий наличие метода для вывода информации о фигуре на экран в формате CSV в классах потомков. class Rectangle : public Figure – класс наследник от класса Figure. Является прямоугольником. Он имеет следующие переменные: center; - значение центра прямоугольника на двумерной координатной плоскости, Point; length – значение длинны прямоугольника, double; width – значение ширины прямоугольника, double; Он имеет следующие методы: public : Rectangle(Point center_, double length_, double width_) - конструктор экземпляра класса. Остальные методы соответствуют методам класса Figure. class circle : public Figure - класс наследник от класса Figure. Является окружностью. Он имеет следующие переменные: center; - значение центра прямоугольника на двумерной координатной плоскости, Point; radius – значение радиуса окружности, double; Он имеет следующие методы: public : circle(Point _center, double _radius) - конструктор экземпляра класса. Остальные методы соответствуют методам класса Figure. class triangle : public Figure - класс наследник от класса Figure. Является равнобедренным треугольником. Он имеет следующие переменные: center; - значение центра равнобедренного треугольника на двумерной координатной плоскости, Point; ground - значение основания равнобедренного треугольника, double; thigh - значение бедра равнобедренного треугольника, double; Он имеет следующие методы: public: triangle(Point _center, double _ground, double _thigh) - конструктор экземпляра класса. Остальные методы соответствуют методам класса Figure. В программе были разработаны следующие локальные структуры: struct element_queue – элемент списка. Он имеет следующие переменные: Value – ссылка на значение элемента списка, Figure*. Next - ссылка на следующий элемент списка, element_queue*. struct List – динамическая структура данных список для реализации очереди Он имеет следующие переменные: Counter – счётчик элементов в списке, int. Head – ссылка на выдаваемое списком значение через очередь, element_queue*. Tail - – ссылка на присоединяемое списком значение через очередь, element_queue*. В программе были разработаны следующие локальные методы: element_queue* NewNode(Figure* value) - метод инициализации элемента списка. List* CreateList() - метод инициализации списка. void enQueue(Figure* value, List* list) - метод добавления в очередь через список. Figure* deQueue(List* list) - метод изъятия из очереди через список. 4.Формат CSV CSV (от англ. Comma-SeparatedValues — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми. Формат CSV стандартизирован не полностью. Идея использовать запятые для разделения полей очевидна, но при таком подходе возникают проблемы, если исходные табличные данные содержат запятые или переводы строк. Возможным решением проблемы запятых и переносов строк является заключение данных в кавычки, однако исходные данные могут содержать кавычки. Помимо этого термином «CSV» могут обозначаться похожие форматы, в которых разделителем является символ табуляции (TSV) или точка с запятой. Многие приложения, которые работают с форматом CSV, позволяют выбирать символ разделителя и символ кавычек. В данном проекте печать в формате CSV используется для вывода информации о сгенерированных фигурах, а так же данных об их площади и так далее. 5.Инструкция пользователю Минимальные системные требования к программному продукту соответствуют минимальным требованиям к операционной системе. Для установки программы необходимо 18 КБ свободного места на жестком диске (под исполняемый модуль программы). Для установки программ на персональный компьютер пользователя, необходимо скопировать загрузочный модуль ConsoleApplication2.exe с внешнего носителя на рабочий стол или в специально созданный каталог. Запуск программы: с помощью окна проводника выбрать диск, на котором расположена программа – дважды щелкнуть папку с программой – установить указатель на файл ConsoleApplication2.exe и дважды щелкнуть его мышью. После запуска приложения на экран будет выведено окно консоли. Программа формирует и выводит информацию о сформированных фигурах. Программа предназначены для формирования, хранения и вывода данных о геометрических фигурах. Программное обеспечение написано на С++ и требует для своего запуска операционную систему семейства Windows одной из версий: Windows 7, Windows 10 (возможна работа под более ранними версиями, а также под MS-DOS). 6.Вывод После создания курсового проекта, была разработана программа в среде Microsoft Visual Studio 2022 на языке C++ позволяющая моделировать геометрические фигуры, сохранять данные об этих фигурах в очередь и выводить данные о них. В результате работы были получены навыки программирования на С++. Также полечены знания о работе структур данных таких: список, односвязный список, двусвязный список, замкнутый список, очередь и стек. Также были получены знания о концепции Объектно-ориентированного программирования. Были изучены такие понятия как класс, объект, интерфейс, структура. По итогу была сформировано базовое понимание программирования как на языке С++, так и концепции Объектно-ориентированного программирования. 7.ПРОГРАММНЫЙ КОД, данный преподавателем.Класс Figure: class Figure { public: // Вычислить площадь фигуры. virtual double square() const = 0; // Вычислить минимальный прямоугольник, в который вписана данная фигура. // Реализация класса Прямоугольник (Rectangle) была дана на практическом занятии. virtual Rectangle GetBoundBox() const = 0; // Распечатать в формате sCSV информацию о фигуре: // а) тип фигуры; // б) координаты и радиус (если он есть) фигуры; // в) периметр фигуры; // г) отношение периметра фигуры к периметру прямоугольника, в который она вписана. virtual void PrintAsCSV () const = 0; }; class Rectangle : public Figure { Point center; // центр прямоугольника double length; // длина прямоугольника double width; // ширина прямоугольника // Конструктор public : Rectangle(Point center_, double length_, double width_) : center(center_), length(length_), width(width_) {} double square() const { return length * width; } Rectangle GetBoundBox() const { return Rectangle(center, length, width); } void PrintAsCSV () const { center.PrintAsCSV (); std::cout << ";" << length << ";" << width << ";" << square(); } }; 8.Исходный код программы#include #include class Rectangle; class Point // Класс, релизующий точку на плоскости. { double x, y;// координаты точки public: Point(double x_, double y_) //конструктор { x = x_; y = y_; } public: void PrintAsCSV () const // Распечатать в формате CSV информацию о точке: { std::cout << x << ";" << y; } }; // Базовый класс фигура class Figure { public: // Вычислить площадь фигуры. virtual double square() const = 0; // Вычислить минимальный прямоугольник, в который вписана данная фигура. // Реализация класса Прямоугольник (Rectangle) была дана на практическом занятии. virtual Rectangle GetBoundBox() const = 0; // Распечатать в формате CSV информацию о фигуре: // а) тип фигуры; // б) координаты и радиус (если он есть) фигуры; // в) периметр фигуры; // г) отношение периметра фигуры к периметру прямоугольника, в который она вписана. virtual void PrintAsCSV () const = 0; }; class Rectangle : public Figure { Point center; // центр прямоугольника double length; // длина прямоугольника double width; // ширина прямоугольника // Конструктор public : Rectangle(Point center_, double length_, double width_) : center(center_), length(length_), width(width_) {} // Вычислить площадь прямоугольника. double square() const { return length * width; } // Вычислить минимальный прямоугольник, в который вписан данный прямоугольник. Rectangle GetBoundBox() const { return Rectangle(center, length, width); } //Распечатать в формате CSV информацию о прямоугольнике. void PrintAsCSV () const { center.PrintAsCSV (); std::cout << ";" << length << ";" << width << ";" << square(); } }; class circle : public Figure { Point center; // центр круга double radius; //радиус круга // Конструктор public : circle(Point _center, double _radius) : center(_center), radius(_radius) {} // Вычислить площадь круга. double square() const { return 3.14159265358979323846 * radius * radius; } // Вычислить минимальный прямоугольник, в который вписан данный круг. Rectangle GetBoundBox() const { return Rectangle(center, radius * 2, radius * 2); } //Распечатать в формате CSV информацию о круге. void PrintAsCSV () const { std::cout << "Circle;"; center.PrintAsCSV (); std::cout << ";" << radius << ";" << square() << ";" << square() / GetBoundBox().square(); } }; class triangle : public Figure //треугольник равнобедренный { Point center; // центр треугольник double ground; //основание треугольника double thigh; //боковые стороны треугольника // Конструктор public: triangle(Point _center, double _ground, double _thigh) :center(_center), ground(_ground), thigh(_thigh) {} // Вычислить площадь треугольника. double square() const { return (ground / 4) * sqrt(abs(4 * thigh * thigh - ground * ground)); } // Вычислить минимальный прямоугольник, в который вписан данный треугольник Rectangle GetBoundBox() const { return Rectangle(center, ground, sqrt(abs(thigh * thigh - (ground / 2) * (ground / 2)))); } //Распечатать в формате CSV информацию о треугольнике. public: void PrintAsCSV () const { std::cout << "Triangle;"; center.PrintAsCSV (); std::cout << ";" << ground << ";" << thigh << ";" << square() << ";" << (square() / GetBoundBox().square()); } }; struct element_queue //элимет списка { Figure* value;//Значение element_queue * next;//следующий элимет списка }; element_queue* NewNode(Figure* value)//метод инициализации элимета списка { element_queue* node = new element_queue(); node->value = value; node->next = nullptr; return node; }; struct List//структура список { int counter; // счётчик элементов element_queue* head;//элемент стороны выдачи значениями element_queue* tail;//элемент стороны добавления значениями }; List* CreateList()//метод инициализации списка { List* list = new List(); list->counter = 0; list->head = nullptr; list->tail = nullptr; return list; } void enQueue(Figure* value, List* list)//метод добавления в очередь через список { if (list->counter == 0) { list->counter++; element_queue* node = NewNode(value); list->head = node; list->tail = node; } else { list->counter++; element_queue* node = NewNode(value); list->tail->next = node; list->tail = node; } } Figure* deQueue(List* list)//метод изъятия из очереди через список { if (list->counter == 0) { std::cout << "Очередь пуста"; } else { list->counter--; Figure* _Figure = list->head->value; element_queue* node = list->head; list->head = node->next; delete(node); return _Figure; } return nullptr; }; // Функция генерации случайного целочисленного числа. int GetRandomInt(int min, int max) { return min + rand() % (max - min + 1); } // Функция генерации случайного вещественного числа. double GetRandomDouble(double mixXY = 0.1, double maxXY = 100.) { std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() std::uniform_real_distribution return uniform_dist(gen); } int main() { setlocale(LC_CTYPE, "rus"); List* list = CreateList();//инициализация списка //заполнение списка случайными треугольниками for (int i = 0; i < 50; i++) { enQueue(new triangle(Point(GetRandomInt(0,100), GetRandomInt(0, 100)), GetRandomDouble(), GetRandomDouble()), list); } //заполнение списка случайными кругами for (int i = 0; i < 50; i++) { enQueue(new circle(Point(GetRandomInt(0, 100), GetRandomInt(0, 100)), GetRandomDouble()), list); } //изъятие из списка и вывод всех треугольников std::cout << "type;X;Y;ground;thigh;square;square/GetBoundBox.square\n"; for (int i = 0; i < 50; i++) { Figure* value = deQueue(list); if (value != nullptr) { value->PrintAsCSV (); std::cout << "\n"; } } //изъятие из списка и вывод всех кругов std::cout << "type;X;Y;ground;radius;square/GetBoundBox.square\n"; for (int i = 0; i < 50; i++) { Figure* value = deQueue(list); if (value != nullptr) { value->PrintAsCSV (); std::cout << "\n"; } } } 9.Список литературы Metanit – язык программирования С++ и платформа .NET [Электронный ресурс] Режим доступа: свободный https://metanit.com/cpp/ (Дата обращения 20.01.2022) Г. Н. Фёдорова. Разработка программных модулей программного обеспечения для компьютерных систем: учебник для студ. Учреждений сред. Проф. Образования / Г. Н. Фёдорова. – 2-е изд., стер. – М. : Издетельский центр «Академия», 2017. А. П. Ганенко. Оформление текстовых и графических материалов при подготовке дипломных проектов, курсовых и письменных экзаменационных работ (требования ЕСКД) : учебно-метод. Пособие для студ. Учреждения сред. Проф. Образования / А.П. Ганенко, М. И. Лапсарь. – 9-е изд., стер. – М. : Издательский центр «Академия», 2017. Н. А. Виноградова. Научно-исследовательская работа студента: Технология написания и оформления доклада, реферата, курсовой и выпускной квалификационной работы: учеб. пособие для студ. Учреждений сред. Проф. Образования / Н. А. Виноградова, Н. В. Микляева. – 13-е изд., стер. – М. : Издательский центр «Академия», 2017. Национальный открытый университет [Электронный ресурс] Режим доступа: свободный https://www.intuit.ru/ (Дата обращения 20.01.2022) |