Untitled

 avatar
unknown
c_cpp
2 years ago
10 kB
4
Indexable
#pragma once
#include <iostream>
#include "Point.h"
#include "Circle.h"
using namespace std;

class FigureCircles
{
private:
    //розмір масиву
    int size;
    //масив об'єктів типу КОЛО
    Circle* arr;
public:
    // Ітераторний клас 
    class Iterator
    {
    private:
        // вказівник на елемент даних 
        Circle* i;
    public:
        //конструктор ініціалізації
        explicit Iterator(Circle* i);
        //конструктор копіювання
        Iterator(const Iterator& x);
        //перевантажена операція присвоєння
        Iterator& operator=(const Iterator x);
        //перевантажена операція розіменування ітератора
        Circle operator*() const;
        // перевантажена операція префіксного інкременту ітератора
        Iterator operator++();
        // перевантажена операція префіксного декременту ітератора
        Iterator operator--();
        // перевантажена операція постфіксного інкременту ітератора
        Iterator operator++(int);
        // перевантажена операція постфіксного декременту ітератора
        Iterator operator--(int);
        // перевантажена операція зміщення ітератора на задане число позицій 
        Iterator operator + (int n);
        // перевантажена операція зміщення ітератора на задане число позицій 
        Iterator operator - (int n);
        // перевантажена операція зміщення ітератора на задане число позицій 
        Iterator operator += (int n);
        //перевантажена операція перевірки на рівність
        bool operator == (const Iterator x) const;
        //перевантажена операція перевірки на нерівність
        bool operator != (const Iterator x) const;
        //перевантажена операція строгого порівняння
        bool operator < (const Iterator& x) const;
        //перевантажена операція строгого порівняння
        bool operator > (const Iterator& x) const;
        //перевантажена операція нестрогого порівняння
        bool operator <= (const Iterator& x) const;
        //перевантажена операція нестрогого порівняння
        bool operator >= (const Iterator& x) const;
        //перевантажена операція віднімання двох ітераторів
        friend int operator - (const Iterator x, const Iterator y);
    };
    //повертає позицію початкового елемента масиву
    Iterator begin();
    //повертає позицію кінцевого елемента масиву
    Iterator end();
    //деструктор
    ~FigureCircles();
    //конструктор за замовчуванням
    FigureCircles();
    //конструктор 
    FigureCircles(int size);
    //зчитування масиву з консолі
    void ReadArrayConsole();
    //відстань між центрами двох кіл
    double DistanceCenters(Point P1, Point P2);
    //перевірка, чи кола перетинаються
    bool CirclesIntersect(Circle C1, Circle C2);
    //знаходження максимальної кількості перетинів кіл у масиві кіл
    void CountCirclesIntersectedMax();
};

//конструктор ініціалізації
FigureCircles::Iterator::Iterator(Circle* i = 0)
{
    this->i = i;
}

//конструктор копіювання
FigureCircles::Iterator::Iterator(const Iterator& x)
{
    this->i = x.i;
}

//перевантажена операція присвоєння
FigureCircles::Iterator& FigureCircles::Iterator::operator=(const Iterator x)
{
    i = x.i;
    return *this;
}

//перевантажена операція розіменування ітератора
Circle FigureCircles::Iterator::operator*() const
{
    return *i;
}

// перевантажена операція префіксного інкременту ітератора
FigureCircles::Iterator FigureCircles::Iterator::operator++()
{
    ++i;
    return *this;
}

// перевантажена операція префіксного декременту ітератора
FigureCircles::Iterator FigureCircles::Iterator::operator--()
{
    --i;
    return *this;
}

// перевантажена операція постфіксного інкременту ітератора
FigureCircles::Iterator FigureCircles::Iterator::operator++(int)
{
    i++;
    return *this;
}

// перевантажена операція постфіксного денкременту ітератора
FigureCircles::Iterator FigureCircles::Iterator::operator--(int)
{
    i--;
    return *this;
}

// перевантажена операція зміщення ітератора на задане число позицій 
FigureCircles::Iterator FigureCircles::Iterator::operator + (int n)
{
    return Iterator(i + n);
}

// перевантажена операція зміщення ітератора на задане число позицій 
FigureCircles::Iterator FigureCircles::Iterator::operator - (int n)
{
    return Iterator(i - n);
}

// перевантажена операція зміщення ітератора на задане число позицій 
FigureCircles::Iterator FigureCircles::Iterator::operator += (int n)
{
    i += n;
    return *this;
}

//перевантажена операція перевірки на рівність
bool FigureCircles::Iterator::operator == (const Iterator x)   const
{
    return i == x.i;
}

//перевантажена операція перевірки на нерівність
bool FigureCircles::Iterator::operator != (const Iterator x) const
{
    return i != x.i;
}

//перевантажена операція строгого порівняння
bool FigureCircles::Iterator::operator < (const Iterator& x) const
{
    return i < x.i;
}

//перевантажена операція строгого порівняння
bool FigureCircles::Iterator::operator > (const Iterator& x) const
{
    return i > x.i;
}

//перевантажена операція нестрогого порівняння
bool FigureCircles::Iterator::operator <= (const Iterator& x) const
{
    return i <= x.i;
}

//перевантажена операція нестрогого порівняння
bool FigureCircles::Iterator::operator >= (const Iterator& x) const
{
    return i >= x.i;
}

//перевантажена операція віднімання двох ітераторів
int operator - (const FigureCircles::Iterator x, const FigureCircles::Iterator y)
{
    return x.i - y.i;
}

//повертає позицію початкового елемента масиву
FigureCircles::Iterator FigureCircles::begin()
{
    return Iterator(&arr[0]);
}

//повертає позицію кінцевого елемента масиву
FigureCircles::Iterator FigureCircles::end()
{
    return Iterator(&arr[size]);
}

//деструктор
FigureCircles::~FigureCircles()
{
    if (arr)
    {
        delete[] arr;
    }
    arr = NULL;
}

//конструктор за замовчуванням
FigureCircles::FigureCircles()
{
    this->size = 0;
    this->arr = NULL;
}

//конструктор 
FigureCircles::FigureCircles(int size)
{
    this->size = size;
    this->arr = new Circle[size];
}

//зчитування масиву з консолі
void FigureCircles::ReadArrayConsole()
{

    if (arr == NULL)
    {
        cout << "Введiть розмiр масиву об'єктiв класу коло: ";
        cin >> size;
        this->arr = new Circle[size];
    }

    //кількість введених елементів масиву
    int count = 0;

    for (int i = 0; i < size; ++i)
    {
        cin >> arr[i];
        count++;
    }
    //якщо введено не всі елементи масиву, то завершити виконання і звільнити пам'ять
    if (count < size)
    {
        throw("введено менше елементів масиву, ніж очікувалося");
        delete[] arr;

    }
}


//відстань між центрами двох кіл
double FigureCircles::DistanceCenters(Point P1, Point P2)
{
    return sqrt(pow((P1.Get_X() - P2.Get_X()), 2) + pow((P1.Get_Y() - P2.Get_Y()), 2));
}

//перевірка, чи кола перетинаються
bool FigureCircles::CirclesIntersect(Circle C1, Circle C2)
{
    return(DistanceCenters(Point(C1.Get_X(), C1.Get_Y()), Point(C2.Get_X(), C2.Get_Y())) < C1.Get_R() + C2.Get_R());
}

//знаходження максимальної кількості перетинів кіл у масиві кіл
void FigureCircles::CountCirclesIntersectedMax()
{
    //максимальна кількість перетинів кіл
    int max_count = 0;
    for (Iterator i = begin(); i != end(); ++i)
    {
        //кількість перетинів для кожного окремого кола
        int count = 0;

        for (Iterator j = begin(); j != end(); ++j)
        {
            count += CirclesIntersect(*i, *j);
        }

        if (max_count < count)
        {
            max_count = count;
        }
    }

    cout << "Максимальна кiлькiсть перетинiв кiл " << max_count << endl;
}
Editor is loading...