Загрузка данных


Ниже — пример реализации на C++ класса VECTOR2 (вектор в 2D) и производного класса VECTOR3 (вектор в 3D) с указанными методами и перегрузками операторов.

Коротко реализовано:
• конструкторы с параметрами,
• display() для вывода координат,
• умножение/деление на число,
• сложение/вычитание векторов,
• скалярное произведение (оператор * между двумя векторами),
• сравнение (оператор ==),
• статический метод combine для вычисления c = k*a + m*b,
• класс VECTOR3 наследует VECTOR2, добавляет z и переопределяет операторы для 3D.

Код:

#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_) {}

    // Вывод координат
    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_) {}

    // Конструктор с инициализатором, принимающий VECTOR2 и z
    VECTOR3(const VECTOR2 v2, double z_ = 0.0) : VECTOR2(v2), z(z_) {}

    // Переопределение 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) {