/OOP_lab_3

Primary LanguageC++

Лабораторная работа № 3 (Проектирование и определение базовых классов)

Задание

Составить описание класса для объектов-векторов, задаваемых координатами концов в трехмерном пространстве. Обеспечить операции сложения и вычитания векторов с получением нового вектора (суммы или разности), вычисления скалярного произведения двух векторов, длины вектора, косинуса угла между векторами.Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.

Описание пользовательского интерфейса программы

При запуске программа попросит ввести крайние точки для двух векторов. Затем будут выведены координаты и длины этих векторов, а также будут продемонстрированы различные методы класса, такие как сложение и разность векторов, скалярное произведение, косинус угла между векторами, и т.д. .

Описание используемых алгоритмов и структур данных

Весь функционал описан в пользовательском классе my_vector.

Координаты вектора

Вычисляются и помещаются в приватные переменные x, y и z. Приватными они сделаны для надёжности - доступ к ним возможен только через публичные методы класса

Конструкторы

В классе предусмотрены два конструктора, использующие списки инициализации - современный синтаксис C++.

Один из конструкторов задает вектор тремя его координатами:

my_vector(int _x = 0, int _y = 0, int _z = 0) : x(_x), y(_y), z(_z) {}

Второй конструктор задает вектор его крайними точками и сам вычисляет координаты:

my_vector(int x_0, int y_0, int z_0, int x_1, int y_1, int z_1) : x(x_1 - x_0), y(y_1 - y_0), z(z_1 - z_0) {}

Доступ к координатам

Функции get_x, get_y и get_z возвращают координаты данного вектора. Поскольку эти методы не изменяют данные класса, они объявлены вместе с ключевым словом const.

int get_x() const { return this->x; }
int get_y() const { return this->y; }
int get_z() const { return this->z; }

Изменение координат

Функции set_x, set_y и set_z позволяют изменить соответственно одну из координат вектора.

void set_x(int value) { this->x = value; }
void set_y(int value) { this->y = value; }
void set_z(int value) { this->z = value; }

Получение длины вектора

Метод length возвращает длину веткора. Вычисляет её как корень из суммы квадратов координат.

double length() const {
	return sqrt(this->x * this->x + this->y * this->y + this->z * this->z);
}

Сложение и вычитание двух векторов

Функционал сложения и вычитания векторов было решено реализовать с помощью операторов + и -. Поскольку эти операторы не изменят исходные векторы, а возвращают новый, их определения и аргументы описаны вместе с ключевым словом const. Аргументы передаются по ссылке, а новые вектора создаются конструкторами и возвращаются по значению.

my_vector operator + (const my_vector& t) const {
	return my_vector(this->x + t.x, this->y + t.y, this->z + t.z);
}
my_vector operator - (const my_vector& t) const {
	return my_vector(this->x - t.x, this->y - t.y, this->z - t.z);
}

Скалярное произведение двух векторов

Скалярное произведение реализовано оператором * таким же образом как сложение и разность (const, конструктор, аргументы по ссылкам).

int operator * (const my_vector& t) const {
	return this->x * t.x + this->y * t.y + this->z * t.z;
}

Косинус угла между векторами

Для вычисления косинуса между текущим вестором и другим был написан метод cos. Выражается косинус из формулы скалярного произведения. Сам метод и аргумент объявлены вместе с ключевым словом const для защиты от случайных изменений.

double cos(const my_vector& t) const {
	return (double)(*this * t) / (this->length() * t.length());
}

Пример работы программы

Введите крайние точки первого вектора: 
x[0]: 3
y[0]: 5
z[0]: 1
x[1]: 6
y[1]: 7
z[1]: 8
Введите крайние точки второго вектора: 
x[0]: 2
y[0]: 3
z[0]: 4
x[1]: 1
y[1]: 1
z[1]: 9

Координаты первого вектора:
3 2 7
Длина: 7.87401

Координаты второго вектора:
-1 -2 5
Длина: 5.47723

Координаты суммы этих векторов:
2 0 12
Длина: 12.1655

Координаты разности этих векторов:
4 4 2
Длина: 6

Скалярное произведение этих векторов:
28

Косинус угла между векторами:
0.649234

Исходный код

(Находится в файле main.cpp)

#include <iostream>
#include <cmath>
using namespace std;

class my_vector {
private:
	int x, y, z;

public:
	my_vector(int _x = 0, int _y = 0, int _z = 0) : x(_x), y(_y), z(_z) {}
	my_vector(int x_0, int y_0, int z_0, int x_1, int y_1, int z_1) : x(x_1 - x_0), y(y_1 - y_0), z(z_1 - z_0) {}

	int get_x() const { return this->x; }
	int get_y() const { return this->y; }
	int get_z() const { return this->z; }

	void set_x(int value) { this->x = value; }
	void set_y(int value) { this->y = value; }
	void set_z(int value) { this->z = value; }

	double length() const {
		return sqrt(this->x * this->x + this->y * this->y + this->z * this->z);
	}

	my_vector operator + (const my_vector& t) const {
		return my_vector(this->x + t.x, this->y + t.y, this->z + t.z);
	}

	my_vector operator - (const my_vector& t) const {
		return my_vector(this->x - t.x, this->y - t.y, this->z - t.z);
	}

	int operator * (const my_vector& t) const {
		return this->x * t.x + this->y * t.y + this->z * t.z;
	}

	// Вычисление косинуса угла междлу векторами
	double cos(const my_vector& t) const {
		return (double)(*this * t) / (this->length() * t.length());
	}
};

int main() {

	int x_0, y_0, z_0, x_1, y_1, z_1;

	cout << "Введите крайние точки первого вектора: " << endl;

	cout << "x[0]: ";
	cin >> x_0;
	cout << "y[0]: ";
	cin >> y_0;
	cout << "z[0]: ";
	cin >> z_0;

	cout << "x[1]: ";
	cin >> x_1;
	cout << "y[1]: ";
	cin >> y_1;
	cout << "z[1]: ";
	cin >> z_1;

	my_vector a(x_0, y_0, z_0, x_1, y_1, z_1);

	cout << "Введите крайние точки второго вектора: " << endl;

	cout << "x[0]: ";
	cin >> x_0;
	cout << "y[0]: ";
	cin >> y_0;
	cout << "z[0]: ";
	cin >> z_0;

	cout << "x[1]: ";
	cin >> x_1;
	cout << "y[1]: ";
	cin >> y_1;
	cout << "z[1]: ";
	cin >> z_1;

	my_vector b(x_0, y_0, z_0, x_1, y_1, z_1);

	cout << "\nКоординаты первого вектора:\n";
	cout << a.get_x() << " " << a.get_y() << " " << a.get_z() << endl;
	cout << "Длина: " << a.length() << endl;

	cout << "\nКоординаты второго вектора:\n";
	cout << b.get_x() << " " << b.get_y() << " " << b.get_z() << endl;
	cout << "Длина: " << b.length() << endl;

	my_vector sum = a + b;
	cout << "\nКоординаты суммы этих векторов:\n";
	cout << sum.get_x() << " " << sum.get_y() << " " << sum.get_z() << endl;
	cout << "Длина: " << sum.length() << endl;

	my_vector dif = a - b;
	cout << "\nКоординаты разности этих векторов:\n";
	cout << dif.get_x() << " " << dif.get_y() << " " << dif.get_z() << endl;
	cout << "Длина: " << dif.length() << endl;

	cout << "\nСкалярное произведение этих векторов:\n";
	cout << a * b << endl;

	cout << "\nКосинус угла между векторами:\n";
	cout << a.cos(b) << endl;

	return 0;
}