Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
3.81 Кб
Скачать
#include <iostream>
#include <locale>
#include <cmath>
using namespace std;

class Point {
protected:
    double x, y;
public:
    Point(double x_val = 0, double y_val = 0) : x(x_val), y(y_val) {}
    virtual void draw() const {
        cout << "(" << x << ", " << y << ")";
    }
    virtual void move(double dx, double dy) {
        x += dx;
        y += dy;
    }
    
    // Методы доступа
    double getX() const { return x; }
    double getY() const { return y; }
    void setX(double x_val) { x = x_val; }
    void setY(double y_val) { y = y_val; }
    
    virtual ~Point() {}
};

class Segment : public Point {
protected:
    Point endPoint;
public:
    Segment(double x1 = 0, double y1 = 0, double x2 = 1, double y2 = 1) 
        : Point(x1, y1), endPoint(x2, y2) {}
    
    void draw() const override {
        cout << "Отрезок "; Point::draw(); 
        cout << " - "; endPoint.draw(); cout << endl;
    }
    
    double length() const {
        return sqrt(pow(endPoint.getX() - x, 2) + pow(endPoint.getY() - y, 2));
    }
};

class Parallelogram : public Segment {
protected:
    Point point3, point4;
public:
    Parallelogram(double x1, double y1, double x2, double y2, 
                  double x3, double y3, double x4, double y4)
        : Segment(x1, y1, x2, y2), point3(x3, y3), point4(x4, y4) {}
    
    void draw() const override {
        cout << "Параллелограмм: "; Point::draw(); cout << ", ";
        endPoint.draw(); cout << ", "; point3.draw(); cout << ", "; 
        point4.draw(); cout << endl;
    }
    
    void fill() const {
        cout << "Закрашиваем параллелограмм" << endl;
    }
    
    virtual double area() const {
        // Упрощённый расчёт площади
        return length() * 2;
    }
};

class Rectangle : public Parallelogram {
public:
    Rectangle(double x, double y, double width, double height)
        : Parallelogram(x, y, x + width, y, x + width, y + height, x, y + height) {}
    
    void draw() const override {
        cout << "Прямоугольник: "; Point::draw(); 
        cout << " размером " << length() << "x" << (point3.getY() - y) << endl;
    }
    
    double area() const override {
        return length() * (point3.getY() - y);
    }
};

class Square : public Rectangle {
public:
    Square(double x, double y, double side)
        : Rectangle(x, y, side, side) {}
    
    void draw() const override {
        cout << "Квадрат: "; Point::draw(); 
        cout << " со стороной " << length() << endl;
    }
};

class Rhombus : public Parallelogram {
public:
    Rhombus(double x, double y, double diagonal1, double diagonal2)
        : Parallelogram(x, y - diagonal2/2, x + diagonal1/2, y, 
                       x, y + diagonal2/2, x - diagonal1/2, y) {}
    
    void draw() const override {
        cout << "Ромб с центром в "; Point::draw(); cout << endl;
    }
    
    double area() const override {
        return (length() * 2) * 0.5; // Упрощённо
    }
};

int main() {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    
    Point point(0, 0);
    Segment segment(0, 0, 3, 0);
    Square square(0, 0, 4);
    Rectangle rectangle(0, 0, 4, 3);
    Rhombus rhombus(0, 0, 6, 4);
    Parallelogram parallelogram(0, 0, 4, 0, 5, 3, 1, 3);
    
    point.draw(); cout << endl;
    segment.draw();
    square.draw();
    rectangle.draw();
    rhombus.draw();
    parallelogram.draw();
    
    cout << "Площадь квадрата: " << square.area() << endl;
    cout << "Площадь прямоугольника: " << rectangle.area() << endl;
    
    return 0;
}
Соседние файлы в папке Лаба5