Загрузка данных
#include <iostream>
#include <cmath>
#include <stdexcept>
const double EPS = 1e-9;
class VECTOR2 {
protected:
double x, y;
public:
// Конструкторы
VECTOR2(double x_ = 0.0, double y_ = 0.0) : x(x_), y(y_) {}
// Оператор присваивания
VECTOR2& operator=(const VECTOR2& other) {
if (this != &other) { // Проверка на самоприсваивание
x = other.x;
y = other.y;
}
return *this;
}
// Вывод координат
virtual void display() const {
std::cout << "(" << x << ", " << y << ")";
}
// Операции сложения и вычитания
VECTOR2 operator+(const VECTOR2& other) const {
return VECTOR2(x + other.x, y + other.y);
}
VECTOR2 operator-(const VECTOR2& other) const {
return VECTOR2(x - other.x, y - other.y);
}
// Умножение на число (вектор * число)
VECTOR2 operator*(double k) const {
return VECTOR2(x * k, y * k);
}
// Деление на число
VECTOR2 operator/(double k) const {
if (std::fabs(k) < EPS) throw std::runtime_error("Division by zero");
return VECTOR2(x / k, y / k);
}
// Скалярное произведение (вектор * вектор)
double operator*(const VECTOR2& other) const {
return x * other.x + y * other.y;
}
// Сравнение
bool operator==(const VECTOR2& other) const {
return (std::fabs(x - other.x) < EPS) && (std::fabs(y - other.y) < EPS);
}
// Статический метод: c = k*a + m*b
static VECTOR2 combine(double k, const VECTOR2& a, double m, const VECTOR2& b) {
return a * k + b * m; // использует operator*(double)
}
// Доступ к компонентам (при необходимости)
double getX() const { return x; }
double getY() const { return y; }
// Дружественная функция для поддержания записи: double * VECTOR2
friend VECTOR2 operator*(double k, const VECTOR2& v) {
return v * k;
}
};
class VECTOR3 : public VECTOR2 {
private:
double z;
public:
// Конструкторы
VECTOR3(double x_ = 0.0, double y_ = 0.0, double z_ = 0.0)
: VECTOR2(x_, y_), z(z_) {}
// Оператор присваивания
VECTOR3& operator=(const VECTOR3& other) {
if (this != &other) { // Проверка на самоприсваивание
VECTOR2::operator=(other); // Вызов оператора присваивания базового класса
z = other.z;
}
return *this;
}
// Переопределение display
void display() const override {
std::cout << "(" << x << ", " << y << ", " << z << ")";
}
// Операции для 3D (возвращают VECTOR3)
VECTOR3 operator+(const VECTOR3& other) const {
return VECTOR3(x + other.x, y + other.y, z + other.z);
}
VECTOR3 operator-(const VECTOR3& other) const {
return VECTOR3(x - other.x, y - other.y, z - other.z);
}
// Умножение на число (вектор * число)
VECTOR3 operator*(double k) const {
return VECTOR3(x * k, y * k, z * k);
}
VECTOR3 operator/(double k) const {
if (std::fabs(k) < EPS) throw std::runtime_error("Division by zero");
return VECTOR3(x / k, y / k, z / k);
}
// Скалярное произведение (вектор * вектор) в 3D
double operator*(const VECTOR3& other) const {
return x * other.x + y * other.y + z * other.z;
}
bool operator==(const VECTOR3& other) const {
return (std::fabs(x - other.x) < EPS) &&
(std::fabs(y - other.y) < EPS) &&
(std::fabs(z - other.z) < EPS);
}
static VECTOR3 combine(double k, const VECTOR3& a, double m, const VECTOR3& b) {
return a * k + b * m;
}
friend VECTOR3 operator*(double k, const VECTOR3& v) {
return v * k;
}
double getZ() const { return z; }
};
// Пример использования
int main() {
VECTOR2 v1(1.0, 2.0);
VECTOR2 v2(3.0, 4.0);
v1.display(); std::cout << std::endl;
v2.display(); std::cout << std::endl;
VECTOR2 v3 = v1 + v2;
v3.display(); std::cout << std::endl;
VECTOR3 v4(1.0, 2.0, 3.0);
VECTOR3 v5(4.0, 5.0, 6.0);
v4.display(); std::cout << std::endl;
v5.display(); std::cout << std::endl;
VECTOR3 v6 = v4 + v5;
v6.display(); std::cout << std::endl;
return 0;
}