#include <iostream>
#include <string>
 
using namespace std;
 
 
//Объявление класса "Множество":
template <class T>
class set
{
public:
        T *a;
        int max_size;
        int size;
public:
        //Конструкторы:
        set(int maxim);
        set(set <T> &x);
 
        //Деструктор:
        ~set();
 
        void add(T x);//добавление эл-та в множество
        bool check_in(T x);//проверка вхождения эл-та в множество
         
        void output();//Вывод множества на экран
        set<T> operator= (const set <T> &s);//операция: присвоение одного множества другому
        set<T> operator* (set <T> &s2);//операция: пересечение двух множеств
         
 
};
 
 
void menu();
 
int main()
{
        setlocale(LC_ALL, "Russian");
        cout << "Добро пожаловать в программу!" << endl;
        menu();
        
        return 0;
}
 
 
void menu()
{
        bool p1, p2; p1 = p2 = true;
        char n;
        char choose;
        int max_1, max_2;
        cout << "Введите максимальный размер первого множества: ";
        cin >> max_1;
        cout << "Введите максимальный размер второго множества: ";
        cin >> max_2;
        set <int> set1(max_1);
        set <int> set2(max_2);
        set <int> set3(std::min(max_1,max_2));
        
        
        int x;
        do {
                cout << '\n'
                        << "Меню:"
                        << '\n' << "1. Добавление эл-та в множество"
                         
                        << '\n' << "5. Пересечение двух множеств"
                         
                        << '\n' << "0. Выход"
                        << '\n' << "<";
                cin >> n;
                //system("cls");
                switch (n)
                {
 
                case '1':cout << "Выберите множество для добавления (1 или 2): ";
                        cin >> choose;
 
                        if (choose == '1')
                        {
                                if (p1 == true)
                                {
                                        for (int i = 0; i < max_1; i++)
                                        {
                                                cout << "Введите э-т: ";
                                                cin >> x;
                                                set1.add(x);
                                        }
                                        cout << "Получившееся множество 1" << endl;
                                        set1.output();
                                        cout << " " << endl;
                                        p1 = false;
                                }
                                else { cout << "Вы уже ввели множество 1" << endl; set1.output(); }
                        }
                        if (choose == '2')
                        {
                                if (p2 == true){
                                        for (int i = 0; i < max_2; i++)
                                        {
                                                cout << "Введите э-т: ";
                                                cin >> x;
                                                set2.add(x);
                                        }
                                        cout << "Получившееся множество 2" << endl;
                                        set2.output();
                                        cout << " " << endl;
                                        p2 = false;
                                }
                                else { cout << "Вы уже ввели множество 2" << endl; set2.output(); }
                        }
 
                        break;
                 
                 
                case '5':set3 = (set1*set2);
                        cout << "Исходное множество 1" << endl;
                        set1.output();
                        cout << "Исходное множество 2" << endl;
                        set2.output();
                        cout << "Получившееся множество 3" << endl;
                        set3.output();
                        cout << " " << endl;
                        break;
                 
                 
                 
                case '0':return;
                default:cout << "Действие не выбрано";
                }
        } while (true);
      
        
}
template <class T>
bool set <T>::check_in(T x)
{
        for (int i = 0; i<size; i++)
        if (a[i] == x)
                return true;
        return false;
}
template <class T>
void set<T> ::add(T x)
{
        if (size<max_size)
        {
                if (!check_in(x))
                {
                        a[size] = x;
                        size += 1;
                        cout << "Добавление прошло успешно" << endl;
                }
                else
                {
                        cout << "Добавление невозможно!!!" << endl;
                        cout << "Одинаковые элементы содержаться в множестве только один раз!!!" << endl;
                }
        }
        else
        {
                cout << "Добавление невозможно" << endl;
                cout << "Размер множества не соответствует количеству элементов!!!" << endl;
        }
}
template <class T>
void set<T>::output()
{
        if (size == 0)
        {
                cout << "{}";
                return;
        }
        cout << "{" << a[0];
        for (int i = 1; i<size; i++)
                cout << ", " << a[i];
        cout << "}" << endl;
 
}
 
 
 
 
 
template <class T>
set<T> set<T>:: operator* (  set <T> &s2)
{
        int k;
        k = 0;
        set <T> s(max_size);
        s.size = 0;
        for (int i = 0; i < size; i++)
                cout << a[i] <<  " ";
        cout << endl;
        for (int j = 0; j < s2.size; j++)
                cout <<  s2.a[j] << " ";
        cout << endl;
        for (int i = 0; i < size; i++)
        {
                for (int j = 0; j < s2.size; j++)
                if (s2.a[j] == a[i])
                {
                         
                        s.a[k] = s2.a[j];
                        k++;
                        s.size += 1;
                }
        }
         
        return s;
}
 
 
 
 
 
template <class T>
set<T> set<T>:: operator= (const set <T> &s)
{
        if (this == &s)
                return *this;
        if (max_size != s.max_size)
        {
                delete[]a;
                a = new T[s.max_size];
                size = 0;
                max_size = s.max_size;
        }
        for (int i = 0; i<max_size; i++)
        {
                a[i] = s.a[i];
        }
        size = s.size;
        return *this;
}
 
 
 
 
 
 
 
template <class T>
set<T>::set(int maxim)
{
        a = new T[maxim];
        for (int i = 0; i<maxim; i++)
                a[i] = 0;
        max_size = maxim;
        size = 0;
}
 
 
template <class T>
set<T>::set(set<T> &x)
{
        max_size = x.max_size;
        a = new T[max_size];
        for (int i = 0; i<max_size; i++)
                a[i] = x.a[i];
}
 
 
template <class T>
set<T>::~set()
{
        delete[]a;
}