Professional Documents
Culture Documents
Курсова
Курсова
КР.КІ– 43.00.000 П3
Група КІ-22-2
Перегіняк Христина
2023
Івано-Франківський Національний Технічний
Університет Нафти і Газу
КУРСОВА РОБОТА
з дисципліни ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ
ПОЯСНЮВАЛЬНА ЗАПИСКА
КР.КІ - 43.00.000.ПЗ
Допускається до захисту
Керівник курсової роботи
_________________________________________
(посада) (підпис) (дата) (розшифровка підпису)
м. Івано-Франківськ
2023
Івано-Франківський Національний Технічний Університет Нафти і Газу
Інститут інформаційних технологій
Кафедра комп'ютерних систем і мереж
Дисципліна - Об'єктно-орієнтоване програмування
Спеціальність - Комп'ютерна інженерія
Курс - 2, Група – КІ-22-2, Семестр – 3
ЗАВДАННЯ
НА КУРСОВУ РОБОТУ
Студентка Перегіняк Х. В.
(підпис) (розшифровка підпису)
КР.КІ-43.00.00.000 ПЗ
Змн Лист № докум. Підпис Дата
Розроб. Перегіняк Х. В Розрахунок периметру Літ. Арк. Аркушів
Перевір. Мельничук С.І н 1 26
фронтальної/горизонтальної
Реценз.
проекцій: тетраедр, 4-на
Н. Контр. ІФНТУНГ,КІ-22-2
Затверд. призма, куля.
Розділ 1. Теоретичні відомості
Арк.
КР.КІ-43.00.00.000 ПЗ 2
Змн. Арк. № докум. Підпис Дата
тетраедр так, як він виглядає при огляді ззаду або спереду, паралельно до одного
з його ребер або вздовж осі. Щоб знайти фронтальну проекцію точки тетраедра,
потрібно проекцію відповідної вершини тетраедра на площину фронтальної
проекції.
Якщо координати вершин тетраедра відомі, то координати їх фронтальних
проекцій можна отримати, вибираючи відповідні координати та ігноруючи одну
з осей (наприклад, вибираючи x та y для фронтальної проекції).
Формула фронтальної проекції точки (x, y, z) може виглядати так: Pf (=xf , yf )
Ph=(xh, zh).
Арк.
КР.КІ-43.00.00.000 ПЗ 3
Змн. Арк. № докум. Підпис Дата
Рисунок 1.3 - Горизонтальна проекція тетраедра
Призма
Чотирикутна призма - це геометричне тіло, у якого обидві основи є
чотирикутниками (четвертий кут). Бокові грані призми є прямокутниками, і вони
з'єднують відповідні вершини основ.
Така призма може мати різні форми чотирикутних основ, такі як квадрат
(якщо обидва чотирикутники основ однакові) або прямокутник (якщо
чотирикутники основ різні).
Арк.
КР.КІ-43.00.00.000 ПЗ 4
Змн. Арк. № докум. Підпис Дата
Рисунок 1.5 - Фронтальна проекція чотирикутної призми
Арк.
КР.КІ-43.00.00.000 ПЗ 5
Змн. Арк. № докум. Підпис Дата
6. Площа поверхні кулі: Площа зовнішньої поверхні кулі. Формула:
A=4 πr ² (1.2)
де r - радіус кулі.
Арк.
КР.КІ-43.00.00.000 ПЗ 6
Змн. Арк. № докум. Підпис Дата
серед вершин тетраедра.
- Різниця між цими значеннями дасть ширину тетраедра в горизонтальній
площині w.
- Довжина горизонтальної проекції буде дорівнювати ширині тетраедра:
Lh=w (1.4)
Довжина фронтальної і горизонтальної проекцій чотирикутної призми
залежить від розміщення її вершин у просторі та орієнтації.
Довжина фронтальної проекції:
- Знаходження максимального та мінімального значення координати z серед
вершин чотирикутної призми.
- Різниця між цими значеннями дасть висоту призми h.
w.
- Довжина горизонтальної проекції буде дорівнювати ширині призми.
Lh=w (1.6)
Довжина фронтальної та горизонтальної проекцій кулі може бути
розрахована залежно від типу проекції та відстані між центром кулі та
площиною проекції. Розглянемо обидві ситуації для ортографічної проекції:
Довжина фронтальної проекції:
- Фронтальна проекція відбиває тіло на площині, яка розташована перед тілом.
- Довжина горизонтальної проекції буде залежати від відстані між центром кулі
Арк.
КР.КІ-43.00.00.000 ПЗ 7
Змн. Арк. № докум. Підпис Дата
та площиною проекції. Якщо D - це відстань, то довжина горизонтальної
проекції буде
Lh=2 √ R2−D2 (1.8)
де, R - радіус кулі.
Для розрахунку коефіцієнта подібності потрібно довжину від центру
проектування до проектованої фігури поділити на довжину від центру
проектування до фігури. Звідси коефіцієнт подібності k розраховується за
формулою:
b
k= (1.9)
a
де, b – довжина від центру проектування до проектованої фігури, a – довжина від
центру проектування до фігури.
Арк.
КР.КІ-43.00.00.000 ПЗ 9
Змн. Арк. № докум. Підпис Дата
Розділ 2 Розробка структурного забезпечення
Арк.
КР.КІ-43.00.00.000 ПЗ 10
Змн. Арк. № докум. Підпис Дата
Рисунок 2.1 - Блок-схема основної програми
Арк.
КР.КІ-43.00.00.000 ПЗ 11
Змн. Арк. № докум. Підпис Дата
Завдяки розробленим блок-схемам можливо зрозуміти алгоритм роботи
програми, що значно полегшує роботу.
Арк.
КР.КІ-43.00.00.000 ПЗ 12
Змн. Арк. № докум. Підпис Дата
Наступним кроком є запуск і компіляція програми, яка є входом у
середовище, що містить код. Під час запуску програми з’являється нове вікно
(консоль), у якому користувачеві пропонується ввести ім’я файлу. Ім’я файлу
має бути вказаним користувачем і повинно містити розширення «.txt». Після
чого відбувається перевірка чи є файл, назву якого ми ввели, у репозиторії. Якщо
користувач вводить неправильне ім’я файлу, тобто якщо програма не може
знайти файл із такою назвою та розширенням у сховищі, в консолі з’явиться
повідомлення «Bad path name» і програма перестає працювати. Якщо користувач
все зробив правильно, програма відкриє файл, прочитає дані в ньому.
Якщо дані вірні, то програма розрахує периметр фронтальної/
горизонтальної проекцій: тетраедру, чотирикутної призми та кулі, вказаних у
файлі. Після цього результати записуються у файл «result.txt», цей файл
знаходиться в репозиторії програми. Окрім запису в файл, результати виводяться
на консоль, та після натискання любої клавіші клавіатури завершує свою роботу.
Арк.
КР.КІ-43.00.00.000 ПЗ 14
Змн. Арк. № докум. Підпис Дата
Розділ 3 Реалізація і демонстрація коду програми
Арк.
КР.КІ-43.00.00.000 ПЗ 15
Змн. Арк. № докум. Підпис Дата
Оператор приведення визначає, як структура Point3D може бути
конвертована до типу bool. За ключовим словом explicit вказує, що цей оператор
не може бути використаний для неявного перетворення типу. Якщо будь-яка з
координат (x, y, z) не дорівнює нулю, метод повертає true, що вказує на те, що
об'єкт Point3D існує (не є "порожнім"). В іншому випадку, повертається false. Це
дозволяє використовувати об'єкти Point3D в контексті, де очікується тип bool,
наприклад, в умовних виразах.
Арк.
КР.КІ-43.00.00.000 ПЗ 16
Змн. Арк. № докум. Підпис Дата
double A = std::sqrt(std::pow(horizontalData[0].x - horizontalData[1].x, 2) +
std::pow(horizontalData[0].y - horizontalData[1].y, 2) + std::pow(horizontalData[0].z -
horizontalData[1].z, 2));
double B = std::sqrt(std::pow(horizontalData[0].x - horizontalData[2].x, 2) +
std::pow(horizontalData[0].y - horizontalData[2].y, 2) + std::pow(horizontalData[0].z -
horizontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}
public:
explicit operator bool()
{
if (((bool)frontalData[0] || (bool)horizontalData[0]) && is_created)
{
return true;
}
return false;
}
_3D_Shape(const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend,
const Point3D& Hbegin, const Point3D& Hmid, const Point3D& Hend) :
frontalData{ Fbegin,Fmid,Fend }, horizontalData{ Hbegin,Hmid,Hend },
is_created{ true } {}
_3D_Shape() : is_created{ true } {}
virtual double frontalProjectionPerimetr() = 0;
virtual double horizontalProjectionPerimetr() = 0;
bool get_stat() const
{
return is_created;
Арк.
КР.КІ-43.00.00.000 ПЗ 17
Змн. Арк. № докум. Підпис Дата
}
};
Цей клас є базовим класом в якому присутні два поля frontal та horizontal.
Ці поля це - кортежі які приймають по три точки які потрібні для того, щоб
вирахувати коефіцієнт відношення. Методи calculateFrontalCoef, calculateHori-
zontalCoef на основі точок які знаходяться в кортежах розраховують коефіцієнти.
FrontalData, horizontalData — чисто віртуальні методи. Ключове слово virtual
означає що про реалізацію даного методу буде відомо на етапі виконання, а не
компіляції як у випадках із звичайними методами. Модифікатор const означає що
цей метод буде доступним в константних об’єктах.
1. Захищені члени класу:
frontalData[3] та horizontalData[3]: масиви точок типу Point3D, що
представляють координати трьох точок для фронтальної та горизонтальної
проекцій відповідно.
is_created: логічна змінна, яка вказує, чи створено фігуру.
2. Методи обчислення коефіцієнта:
calculateFrontalCoef(): обчислює коефіцієнт для фронтальної проекції на основі
відстаней між точками.
calculateHorizontalCoef(): обчислює коефіцієнт для горизонтальної проекції.
3. Оператор приведення до типу bool:
explicit operator bool(): перевіряє, чи існують фронтальні або горизонтальні
дані та чи створено фігуру.
4. Конструктори:
Конструктор із параметрами приймає координати точок для фронтальної та
горизонтальної проекцій та ініціалізує відповідні члени.
Конструктор за замовчуванням ініціалізує is_created значенням true.
5. Віртуальні методи:
virtual double frontalProjectionPerimeter() = 0;: чисто віртуальний метод, який
вимагає від підкласів реалізації обчислення периметра фронтальної проекції.
Арк.
КР.КІ-43.00.00.000 ПЗ 18
Змн. Арк. № докум. Підпис Дата
virtual double horizontalProjectionPerimeter() = 0;: чисто віртуальний метод для
обчислення периметра горизонтальної проекції.
6. Метод get_stat():
bool get_stat() const: повертає значення is_created, що вказує на те, чи
створено фігуру.
Арк.
КР.КІ-43.00.00.000 ПЗ 21
Змн. Арк. № докум. Підпис Дата
Конструктор із параметрами приймає координати вершин призми та
викликає конструктор базового класу _3D_Shape, передаючи йому координати
для фронтальної та горизонтальної проекцій.
Конструктор за замовчуванням ініціалізує об'єкт призми, не передаючи
конкретних координат.
3. Віртуальні методи:
double horizontalProjectionPerimeter() override: перевизначає віртуальний
метод базового класу для обчислення периметра горизонтальної проекції
призми.
double frontalProjectionPerimeter() override: перевизначає віртуальний метод
базового класу для обчислення периметра фронтальної проекції призми.
4. Оператор введення з файлу (operator >>):
friend ifstream& operator >> (ifstream& in, _4_Prizma& data): перевизначає
френд-функціональний оператор для зчитування об'єкта класу з файлу. Очікує
введення визначеної маркерною стрічкою ("Prizma:") та зчитує координати
вершин призми та проекцій з файлу.
Загально, _4_Prizma є класом, який розширює функціональність базового
класу _3D_Shape для обробки конкретного типу 3D-фігури - прямокутної
призми.
Арк.
КР.КІ-43.00.00.000 ПЗ 22
Змн. Арк. № докум. Підпис Дата
Рисунок 3.2 - Результат роботи програми, якщо ввести не коректні дані
TEST_METHOD(TestConstructorParameters)
{
Point3D point{ 1,1,1 };
Assert::IsTrue((bool)ball, L"Constructor with parameters error");
Assert::IsTrue((bool)tetrahedron, L"Constructor with parameters error");
Assert::IsTrue((bool)prizma, L"Constructor with parameters error");
Assert::IsTrue((bool)point, L"Constructor with parameters error");
Арк.
КР.КІ-43.00.00.000 ПЗ 23
Змн. Арк. № докум. Підпис Дата
Даний тест перевіряє коректність ініціалізації та можливість перетворення
до типу bool для об'єктів, створених з параметрами конструктора.
Арк.
КР.КІ-43.00.00.000 ПЗ 24
Змн. Арк. № докум. Підпис Дата
ВИСНОВКИ
Арк.
КР.КІ-43.00.00.000 ПЗ 25
Змн. Арк. № докум. Підпис Дата
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
Арк.
КР.КІ-43.00.00.000 ПЗ 26
Змн. Арк. № докум. Підпис Дата
ДОДАТКИ
Додаток А
Файл Kursova.cpp
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
struct Point3D {
double x, y, z;
friend ifstream& operator >> (ifstream& in, Point3D& data) {
in >> data.x;
in >> data.y;
in >> data.z;
return in;
}
explicit operator bool()
{
if (x || y || z)
{
return true;
}
return false;
}
};
class _3D_Shape {
protected:
Point3D frontalData[3], horizontalData[3];
bool is_created;
double calculateFrontalCoef() const
{
double A = std::sqrt(std::pow(frontalData[0].x - frontalData[1].x, 2) + std::pow(frontalData[0].y - frontalData[1].y, 2) +
std::pow(frontalData[0].z - frontalData[1].z, 2));
double B = std::sqrt(std::pow(frontalData[0].x - frontalData[2].x, 2) + std::pow(frontalData[0].y - frontalData[2].y, 2) +
std::pow(frontalData[0].z - frontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}
Ball ball{};
_4_Prizma _4_prizma{};
Tetrahedron tetrahedron{};
ifstream stream;
string path_name;
while (true)
stream.open(path_name);
if (stream.is_open())
cout << "Ball: " << ball.frontalProjectionPerimetr() << ' ' << ball.horizontalProjectionPerimetr() << endl;
cout << "4Prizma: " << _4_prizma.frontalProjectionPerimetr() << ' ' << _4_prizma.horizontalProjectionPerimetr() <<
endl;
cout << "Tetrahedron: " << tetrahedron.frontalProjectionPerimetr() << ' ' <<
tetrahedron.horizontalProjectionPerimetr() << endl;
write << "Ball: " << ball.frontalProjectionPerimetr() << ' ' << ball.horizontalProjectionPerimetr() << endl;
write << "4Prizma: " << _4_prizma.frontalProjectionPerimetr() << ' ' << _4_prizma.horizontalProjectionPerimetr() <<
endl;
write << "Tetrahedron: " << tetrahedron.frontalProjectionPerimetr() << ' ' <<
tetrahedron.horizontalProjectionPerimetr() << endl;
return 0
{
return 1;
}
else
{
cout << "Bad path name " << endl;
}
Кінець додатку А
Додаток Б
Файл KursovaUnitTest.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "../kursova/kursova.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace KursovaUnitTest
{
TEST_CLASS(KursovaUnitTest)
{
Ball ball{ {3.1, 2.5, 0.5 },5.0, {4.0, 3.0, 2.5 }, {3.0, 5.0, 5.0 }, {0.5, 4.0, 3.0 }, {2.5, 3.0, 5 }, {5.0, 5.2,
4.3 }, {3.1, 2.5} };
Tetrahedron tetrahedron{ {0, 0, 0,},{ 1, 0, 0}, {0, 1, 0}, {0 ,0, 1},{0.5, 0.5, 2}, {0.5, 0.5, 1},{ 0.5, 0.5, 0},
{ 0, 1, 1}, {0, 1, 0}, {0, 0, 1} };
_4_Prizma prizma{ {2.5, 3.0, 5.0 }, {0.5, 4.0 ,3.0}, { 3.0, 2.5 ,4.0} ,{0.0 ,0.0, 2.5 }, {3.0, 5.0 ,0.5 }, {4.0,
3.0 ,2.5 }, {3.0, 0.5, 4.0 }, {5.0, 3.5, 0.0 }, {1.5, 3.0 ,4.0 } ,{0.5, 4.0 ,3.0 }, {2.5 ,3.0 ,5.0 }, {0.0, 0.0 ,2.5}, { 3.0, 5.0, 0.5 },
{4.0, 3.0 ,2.5} };
public:
TEST_METHOD(TestConstructorParameters)
{
Point3D point{ 1,1,1 };
Assert::IsTrue((bool)ball, L"Constructor with parameters error");
Assert::IsTrue((bool)tetrahedron, L"Constructor with parameters error");
Assert::IsTrue((bool)prizma, L"Constructor with parameters error");
Assert::IsTrue((bool)point, L"Constructor with parameters error");
}
TEST_METHOD(TestDefault)
{
Ball ball;
Tetrahedron tetrahedron;
_4_Prizma prizma;
Point3D point{};
Assert::IsTrue(ball.get_stat(), L"Constructor default error");
Assert::IsTrue(tetrahedron.get_stat(), L"Constructor default error");
Assert::IsTrue(prizma.get_stat(), L"Constructor default error");
Assert::IsTrue(point.x == 0 && point.y == 0 && point.z == 0, L"Constructor default error");
}
TEST_METHOD(TestHorizontalProjectionPerimetr)
{
Assert::IsTrue(ball.horizontalProjectionPerimetr() != -1, L"Ball horizontal projection perimetr er-
ror");
Assert::IsTrue(prizma.horizontalProjectionPerimetr() != -1, L"Prizma horizontal projection
perimetr error");
Assert::IsTrue(tetrahedron.horizontalProjectionPerimetr() != -1, L"Tetrahedron horizontal projec-
tion perimetr error");
}
TEST_METHOD(TestFrontalProjectionPerimetr)
{
Assert::IsTrue(ball.frontalProjectionPerimetr() != -1, L"Ball frontal projection perimetr error");
Assert::IsTrue(prizma.frontalProjectionPerimetr() != -1, L"Prizma frontal projection perimetr er-
ror");
Assert::IsTrue(tetrahedron.frontalProjectionPerimetr() != -1, L"Tetrahedron frontal projection
perimetr error");
}
};
}