Professional Documents
Culture Documents
КурсоваПняк
КурсоваПняк
КР.КІ– 43.00.000 П3
Група КІ-22-2
Перегіняк Христина
2023
Івано-Франківський Національний Технічний
Університет Нафти і Газу
КУРСОВА РОБОТА
з дисципліни ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ
ПОЯСНЮВАЛЬНА ЗАПИСКА
КР.КІ - 43.00.000.ПЗ
Допускається до захисту
Керівник курсової роботи
_________________________________________
(посада) (підпис) (дата) (розшифровка підпису)
м. Івано-Франківськ
2023
Івано-Франківський Національний Технічний Університет Нафти і Газу
Інститут інформаційних технологій
Кафедра комп'ютерних систем і мереж
Дисципліна - Об'єктно-орієнтоване програмування
Спеціальність - Комп'ютерна інженерія
Курс - 2, Група – КІ-22-2, Семестр – 3
ЗАВДАННЯ
НА КУРСОВУ РОБОТУ
Студентка Перегіняк Х. В.
(підпис) (розшифровка підпису)
КР.КІ-43.00.00.000 ПЗ
Змн Лист № докум. Підпис Дата
Розроб. Перегіняк Х. В Розрахунок периметру Літ. Арк. Аркушів
Перевір. Мельничук С.І н 1 22
фронтальної/горизонтальної
Реценз.
проекцій: тетраедр, 4-на
Н. Контр. ІФНТУНГ,КІ-22-2
Затверд. призма, куля.
Розділ 1. Теоретичні відомості
Арк.
КР.КІ-43.00.00.000 ПЗ 2
Змн. Арк. № докум. Підпис Дата
тетраедр так, як він виглядає при огляді ззаду або спереду, паралельно до одного
з його ребер або вздовж осі. Щоб знайти фронтальну проекцію точки тетраедра,
потрібно проекцію відповідної вершини тетраедра на площину фронтальної
проекції.
Якщо координати вершин тетраедра відомі, то координати їх фронтальних
проекцій можна отримати, вибираючи відповідні координати та ігноруючи одну
з осей (наприклад, вибираючи x та y для фронтальної проекції).
Формула фронтальної проекції точки (x, y, z) може виглядати так: Pf (=xf , yf )
Арк.
КР.КІ-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
Змн. Арк. № докум. Підпис Дата
- Знаходження максимального та мінімального значення координати y (або x)
серед вершин тетраедра.
- Різниця між цими значеннями дасть ширину тетраедра в горизонтальній
площині w.
- Довжина горизонтальної проекції буде дорівнювати ширині тетраедра:
Lh=w (1.4)
Довжина фронтальної і горизонтальної проекцій чотирикутної призми
залежить від розміщення її вершин у просторі та орієнтації.
Довжина фронтальної проекції:
- Знаходження максимального та мінімального значення координати z серед
вершин чотирикутної призми.
- Різниця між цими значеннями дасть висоту призми h.
w.
- Довжина горизонтальної проекції буде дорівнювати ширині призми.
Lh=w (1.6)
Довжина фронтальної та горизонтальної проекцій кулі може бути
розрахована залежно від типу проекції та відстані між центром кулі та
площиною проекції. Розглянемо обидві ситуації для ортографічної проекції:
Довжина фронтальної проекції:
- Фронтальна проекція відбиває тіло на площині, яка розташована перед тілом.
Арк.
КР.КІ-43.00.00.000 ПЗ 8
Змн. Арк. № докум. Підпис Дата
Ball: 5.0 5.2 4.3 3.1...
Prizma: 2.5 3.0 5.0 0.5...
де, Tetrahedron – назва фігури, цифри — це дані точок
Дані для файлу text.txt потрібно заносити в текстовому файлі. Приклад
файлу з даними подано на рисунку 1.5.
Таким чином структура запису кожного рядка для кожної фігури матиме
наступний вигляд:
Ball: 5.0 5.2 4.3 3.1 2.5 0.5 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 0.5 4.0 3.0 2.5 3.0 5.0 5.0 0.5
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
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 0
В такому вигляді можна записувати дані у файл text.txt.
Дані для файлу text.txt можна заносити в звичайному текстовому
редакторі, іншими словами блокноті. Приклад файлу з даними подано на рис.
1.5.
Арк.
КР.КІ-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
Змн. Арк. № докум. Підпис Дата
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;
}
double calculateHorizontalCoef() const
{
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;
}
Арк.
КР.КІ-43.00.00.000 ПЗ 16
Змн. Арк. № докум. Підпис Дата
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;
}
};
Цей клас є базовим класом в якому присутні два поля frontal та horizontal.
Ці поля це - кортежі які приймають по три точки які потрібні для того, щоб
вирахувати коефіцієнт відношення. Методи calculateFrontalCoef, calculateHori-
zontalCoef на основі точок які знаходяться в кортежах розраховують коефіцієнти.
FrontalData, horizontalData — чисто віртуальні методи. Ключове слово virtual
означає що про реалізацію даного методу буде відомо на етапі виконання, а не
компіляції як у випадках із звичайними методами. Модифікатор const означає що
цей метод буде доступним в константних об’єктах.
Арк.
КР.КІ-43.00.00.000 ПЗ 20
Змн. Арк. № докум. Підпис Дата
Усі результати, які записуються в консолі, записуються і в файл, який був
відкритий або створений рис. 3.3.
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 ПЗ 21
Змн. Арк. № докум. Підпис Дата
Рисунок 3.4 - Результат виконання Unit-тестів
Приклад негативного виконання модульних тестів.
Арк.
КР.КІ-43.00.00.000 ПЗ 22
Змн. Арк. № докум. Підпис Дата
ВИСНОВКИ
Під час виконання цієї роботи я вивчила багато чого нового, та закріпила
знання на практиці. Я впевнена, що знання, здобуті під час курсової роботи
пригодяться мені в майбутніх проектах.
Арк.
КР.КІ-43.00.00.000 ПЗ 23
Змн. Арк. № докум. Підпис Дата
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
Арк.
КР.КІ-43.00.00.000 ПЗ 24
Змн. Арк. № докум. Підпис Дата
ДОДАТКИ
Додаток А
Файл 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");
}
};
}