Составить описание класса для объектов-векторов, задаваемых координатами концов в трехмерном пространстве. Обеспечить операции сложения и вычитания векторов с получением нового вектора (суммы или разности), вычисления скалярного произведения двух векторов, длины вектора, косинуса угла между векторами.Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
При запуске программа попросит ввести крайние точки для двух векторов. Затем будут выведены координаты и длины этих векторов, а также будут продемонстрированы различные методы класса, такие как сложение и разность векторов, скалярное произведение, косинус угла между векторами, и т.д. .
Весь функционал описан в пользовательском классе 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;
}