You are on page 1of 12

Міністерство Освіти і Науки України

Київський Національний Університет імені Тараса Шевченка

Факультет Інформаційних Технологій

Звіт з лабораторної роботи №1


з дисципліни Технології програмування

Вико
нав студент групи ІР-22
Музика Марк Сергійович
Викладач : к.ф.-м.н., ас. Пономарнеко Роман
Миколайович

Київ – 2021
ЗМІСТ
1. Постановка завдання 3
2. Аналітичні викладки 3
3. UML діаграма класу 4
4. Алгоритм вирішення розрахункової частини 5
5. Код програми 5
6. Тестування програми 11
7. Висновок 11
Лабораторна робота №1
Тема: Класи С++.
Мета: вивчити основні концепції об'єктно-орієнтованого програмування.
Вивчити особливості використання класів і об'єктів, а також особливості
застосування конструкторів і деструкторів.
Етапи виконання завдання:
Розробити покроковий алгоритм вирішення розрахункової частини завдання
і підзадач (при необхідності). Розробити UML діаграму класів. Виконати
програмну реалізацію завдання відповідно до варіанту. Прототипи класів
повинні містяться в окремому * .h- файлі. У програмі обов'язково передбачити
висновок інформації про виконавця роботи (ПІБ), номер варіанта, обраному
рівні складності і завданні. Передбачити можливість повторного запуску
програми (запит про бажання вийти з програми, або продовжити роботу).
Ключові моменти програми обов'язково повинні містити коментарі.
Завдання 1

Аналітичні викладки:
Клас - різновид абстрактного типу даних в об'єктно-орієнтованому
програмуванні, що характеризується способом свого побудови. Поряд з
поняттям «об'єкта» клас є ключовим поняттям в ООП.
Клас - це визначений користувачем тип. Клас повинен бути оголошений до
того, як буде оголошено хоча б и одна змінна цього класу.
Формат опису класу включає в себе:
 типи даних, які є елементами-даними класу (атрибутами);
 специфікаціями доступу до даних;
 функції, що визначають методи обробки елементів-даних;
 конструктори і деструктор.
Конструктор ініціалізації - в тілі конструктора елементам даних
присвоюються значення, ініціалізація можлива через введення,
присвоювання, список ініціалізації.
Конструктор копіювання - створює новий об'єкт на основі існуючого
(фактично копію) . Як параметр такий конструктор використовує константну
посилання на існуючий об'єкт.
Функції-елементи класу - це функції, які мають доступ до будь-яких інших
функцій-елементів та до будь-яких елементів-даними. Найбільш часто
використовуються функції, що реалізують арифметичні методи, методи
відображення і порівняння даних. Особливим видом функцій-елементів є
конструктори і деструктори.
Деструкція - це спеціальна функція-елемент, що спрацьовує при знищенні
об'єкта класу і звільняє займану ним пам'ять. Ім'я деструктора збігається з ім'ям
класу, але перед ним записують символ ~.

Якщо пряма проходить через дві точки A(x1, y1) і B(x2, y2), такі що x1 ≠ x2 і y1 ≠
y2, то рівняння прямої можна знайти, використовуючи наступну формулу

x - x1 y - y1
 = 
x2 - x1 y2 - y1

UML діаграма класу:


Алгоритм вирішення розрахункової частини:

Обираємо дві точки за


допомогою двох циклів та
умовно проводимо пряму
через них

Вираховуємо положення
точок, які потрібно
розподілити на підмножини,
відносно проведеної прямої

Якщо рівна кількість точок у


підмножинах, то вираховуємо
рівняння прямої через дві
точки

Код програми:
Lab1.cpp:

#include "pch.h"
#include "Point.h"
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

int main()
{
setlocale(0, "rus");

cout << "Варiант 11(В)" << endl;


cout << "Музика Марк IP-12" << endl;
cout << "Ця програма генерує площину заданого розмiру з рандомно вибраними точками,"
<< endl;
cout << "де 0 - це пуста клiтинка, а 1 - це точки, якi ми повиннi розбити прямою" <<
endl;

char p = 'y';
char flag;
int N, M;
int temp_x, temp_y;

while (p == 'y')
{
cout << "Введiть розмiр площини: ";
cin >> M;

cout << "Введiть кiлькiсть точок на площинi: ";


cin >> N;

Point *plane = new Point(N, M);


cout << "Згенерована площина з точками:" << endl;
plane->print();
cout << endl;
flag = 's';

while ((flag == 's') || (flag == 'd'))


{
cout << "Бажаєте додати точки окрiм згенерованих, якщо так то введiть
s, якщо бажаєте видалити то d, якщо нiчого то n: ";
cin >> flag;

if (flag == 's')
{
cout << "Введiть координати точки, спочатку x потiм y через
Enter: " << endl;
cin >> temp_x;
cin >> temp_y;
while ((temp_x > plane->getM()) || (temp_x < 0) || (temp_y >
plane->getM()) || (temp_y < 0))
{
cout << "Повторiть спробу: ";
cin >> temp_x;
cin >> temp_y;
}
plane->setPoint(temp_x, temp_y);
plane->print();
cout << endl;
}
else if (flag == 'd')
{
cout << "Введiть координати точки, спочатку x потiм y через
Enter: " << endl;
cin >> temp_x;
cin >> temp_y;
while ((temp_x > plane->getM()) || (temp_x < 0) || (temp_y >
plane->getM()) || (temp_y < 0))
{
cout << "Повторiть спробу: ";
cin >> temp_x;
cin >> temp_y;
}
plane->delPoint(temp_x, temp_y);
plane->print();
cout << endl;
}

while ((flag != 's') && (flag != 'd') && (flag != 'n'))


{
cout << "Повторiть спробу: ";
cin >> flag;
}
}

cout << "Координати точок на площинi:" << endl;


plane->getPoint();
cout << endl;

cout << "Рiвняння прямої: " << plane->lines() << endl;

Point *plane_copy = new Point(*plane);


cout << "Площина згенерована задопомогою конструктора копiювання:" << endl;
plane_copy->print();
cout << endl;

plane->~Point();
plane_copy->~Point();

cout << "Бажаєте продовжити використання, якщо так то введiть y, якщо нi то n:


";
cin >> p;

while ((p != 'y') && (p != 'n'))


{
cout << "Повторiть спробу: ";
cin >> p;
}
}

return 0;
}

Point.h:

#pragma once
#include <string>

using namespace std;

class Point
{
private:
int Max_Points_Number = 1000; //number of points
int n; //number of points
int m; //array size
int** mas; //array
int* x_array; //array of point's x-axis
int* y_array; //array of point's y-axis
void random(void); //void for points random creating
int findPoint(int x, int y) const; //function for find point by it's cordinates

public:
Point(int N, int M);
Point(const Point& obj);
~Point(void);

int getN(void) const;


int getM(void) const;
void delPoint(int x, int y);
void setPoint(int x, int y);
void getPoint(void);
string lines(void);

void print(void) const;


};

Point.cpp:

#include "pch.h"
#include "Point.h"

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

Point::Point(int N, int M) : n(N), m(M)


{
mas = new int*[m];
x_array = new int[Max_Points_Number];
y_array = new int[Max_Points_Number];

//I make an array of 0


for (int i = 0; i < m; i++)
{
mas[i] = new int[m];
for (int j = 0; j < m; j++)
mas[i][j] = 0;
}

//Now I randomly choose on it points, where I will place 1


random();
}

Point::Point(const Point& obj)


{
n = obj.n;
m = obj.m;
mas = new int*[m];
x_array = new int[Max_Points_Number];
y_array = new int[Max_Points_Number];
int count = 0;

for (int i = 0; i < m; i++)


{
mas[i] = new int[m];
for (int j = 0; j < m; j++)
mas[i][j] = 0;
}

for (int i = 0; i < m; i++)


for (int j = 0; j < m; j++)
if (obj.mas[i][j] == 1)
{
//mirror
mas[j][i] = 1;
x_array[count] = i;
y_array[count] = j;
count++;
}

Point::~Point(void)
{
for (int i = 0; i < m; i++)
if (mas)
delete[] mas[i];

if (mas)
delete[] mas;

if (x_array)
delete[] x_array;

if (y_array)
delete[] y_array;
}

void Point::random(void)
{
srand(static_cast<unsigned int>(time(0)));
int i, j;
bool p;

for (int count = 0; count < n; count++)


{
p = false;
while (p == false)
{
i = rand() % m;
j = rand() % m;
if (mas[i][j] != 1)
{
p = true;
mas[i][j] = 1;
x_array[count] = j;
y_array[count] = i;
}
}
}
}

int Point::getN(void) const


{
return n;
}

int Point::getM(void) const


{
return m;
}

int Point::findPoint(int x, int y) const


{
for (int count = 0; count < n; count++)
if (x_array[count] == x && y_array[count] == y)
return count;
return -1;
}

void Point::delPoint(int x, int y)


{
int temp_index = findPoint(x, y);

if (temp_index != -1)
{
mas[y][x] = 0;
x_array[temp_index] = -1;
y_array[temp_index] = -1;
n--;
}
}

void Point::setPoint(int x, int y)


{
mas[y][x] = 1;
x_array[n] = y;
y_array[n] = x;
n++;
}

void Point::getPoint(void)
{
for (int count = 0; count < n; count++)
cout << "Точка №" << count + 1 << " має координати: " << "х = " <<
x_array[count] << ", y = " << y_array[count] << endl;
}

void Point::print(void) const


{
for (int i = m - 1; i >= 0; i--)
{
for (int j = 0; j < m; j++)
cout << mas[i][j] << " ";
cout << endl;
}
}

string Point::lines(void)
{
// I calculate a line by using formula of two points
// I choose pair of points (0 and 1) and drawing a line
// After that I calculate a location of poits (1) relatively to drawn line
// If value of points in both parts are equal then I make the equation
double left, right;
int points_left, points_right;
string solution;

for (int i = m - 1; i >= 0; i--)


{
for (int j = 0; j < m; j++)
{
for (int i2 = m - 1; i2 >= 0; i2--)
{
for (int j2 = 0; j2 < m; j2++)
{
if ((i != i2) && (j != j2))
{
points_left = 0;
points_right = 0;
//here I calculating number of points for both
parts
for (int count = 0; count < n; count++)
{
left = (x_array[count] - j) * (i2 - i);
right = (y_array[count] - i) * (j2 - j);

if (left < right)


points_left++;
else if (left > right)
points_right++;
}
//here I make equation string
if (points_left == points_right)
{
cout << "Пряму проведено через точки: x1 =
" << j << " y1 = " << i << " та x2 = " << j2 << " y2 = " << i2 << endl;

double temp_var = (i2 - i);


solution = to_string(temp_var) + "*x";

temp_var = (j2 - j);


solution = solution + " - " +
to_string(temp_var) + "*y";

temp_var = (-1) * (j * (i2 - i)) + (i * (j2


- j));

if (temp_var >= 0)
solution = solution + " + " +
to_string(temp_var);
else
solution = solution +
to_string(temp_var);

solution = solution + " = 0";


return solution;
}
}
}
}
}
}
}
Тестування програми:

Висновок: Я вивчив основні концепції об'єктно-орієнтованого


програмування. Я вивчив особливості використання класів і об'єктів, а
також особливості застосування конструкторів і деструкторів на прикладі
мови програмування високого рівня С++.

You might also like