#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;
}