176 lines
4.2 KiB
C
176 lines
4.2 KiB
C
#include <iostream>
|
||
#include <string>
|
||
#include <vector>
|
||
#include <set>
|
||
|
||
using namespace std;
|
||
|
||
struct elem // Структура - элемент множества
|
||
{
|
||
int evNumb;
|
||
int nonEvNum;
|
||
int regNumb;
|
||
char letter;
|
||
};
|
||
|
||
struct elem_compare
|
||
{
|
||
bool operator()(const elem& a, const elem& b) const
|
||
{
|
||
if (a.evNumb != b.evNumb) return a.evNumb < b.evNumb;
|
||
if (a.nonEvNum != b.nonEvNum) return a.nonEvNum < b.nonEvNum;
|
||
if (a.regNumb != b.regNumb) return a.regNumb < b.regNumb;
|
||
return a.letter < b.letter;
|
||
}
|
||
};
|
||
|
||
|
||
void make_unique(vector<elem>& mass)
|
||
{
|
||
set<elem, elem_compare> unique_set(mass.begin(), mass.end());
|
||
mass.assign(unique_set.begin(), unique_set.end());
|
||
}
|
||
|
||
|
||
void printArray(const vector<elem>& mass)
|
||
{
|
||
for (int i = 0; i < mass.size(); ++i)
|
||
{
|
||
cout << i+1 <<" element" << ": " << mass[i].evNumb << " "
|
||
<< mass[i].nonEvNum << " " << mass[i].regNumb << " "
|
||
<< mass[i].letter << endl;
|
||
}
|
||
|
||
cout<<endl;
|
||
}
|
||
|
||
|
||
bool validate_input(const string& str)
|
||
{
|
||
return (str.length() == 4) &&
|
||
(str[0] >= '0' && str[0] <= '9') && ((str[0] - '0') % 2 == 0) && // Чётная цифра
|
||
(str[1] >= '0' && str[1] <= '9') && ((str[1] - '0') % 2 == 1) && // Нечётная цифра
|
||
(str[2] >= '0' && str[2] <= '9') && // цифра
|
||
(str[3] >= 'a' && str[3] <= 'z'); // буква
|
||
}
|
||
|
||
void push_to_array(vector<elem>& mass, const string& input)
|
||
{
|
||
elem El;
|
||
El.evNumb = input[0] - '0';
|
||
El.nonEvNum = input[1] - '0';
|
||
El.regNumb = input[2] - '0';
|
||
El.letter = input[3];
|
||
mass.push_back(El);
|
||
}
|
||
|
||
void input_array(vector<elem>& mass, int size)
|
||
{
|
||
for (int i = 0; i < size; ++i)
|
||
{
|
||
cout << "Input in ijcb format for " << i+1 << " element: ";
|
||
string input;
|
||
cin >> input;
|
||
|
||
if (validate_input(input))
|
||
{
|
||
push_to_array(mass, input);
|
||
}
|
||
else
|
||
{
|
||
cout << "Input error" << endl;
|
||
i--;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
vector<elem> set_union(const vector<elem>& A, const vector<elem>& B) // Объединение
|
||
{
|
||
set<elem, elem_compare> result(A.begin(), A.end());
|
||
result.insert(B.begin(), B.end());
|
||
return vector<elem>(result.begin(), result.end());
|
||
}
|
||
|
||
|
||
vector<elem> set_intersection(const vector<elem>& A, const vector<elem>& B) // Пересечение
|
||
{
|
||
|
||
vector<elem> result;
|
||
set<elem, elem_compare> setB(B.begin(), B.end());
|
||
|
||
for (const auto& item : A) // Пробегаемся по А
|
||
{
|
||
if (setB.find(item) != setB.end()) // Сравниваем с B
|
||
{
|
||
result.push_back(item);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
vector<elem> set_difference(const vector<elem>& A, const vector<elem>& B) // Дополнение
|
||
{
|
||
vector<elem> result;
|
||
set<elem, elem_compare> setB(B.begin(), B.end());
|
||
|
||
for (const auto& item : A)
|
||
{
|
||
if (setB.find(item) == setB.end())
|
||
{
|
||
result.push_back(item);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
vector<elem> set_symmetric_diff(const vector<elem>& A, const vector<elem>& B) // Симметричная разность
|
||
{
|
||
vector<elem> diffAB = set_difference(A, B);
|
||
vector<elem> diffBA = set_difference(B, A);
|
||
return set_union(diffAB, diffBA);
|
||
}
|
||
|
||
int main()
|
||
{
|
||
int mass1Size, mass2Size;
|
||
vector<elem> mass1, mass2;
|
||
|
||
cout << "Enter size of first array: ";
|
||
cin >> mass1Size;
|
||
input_array(mass1, mass1Size);
|
||
printArray(mass1);
|
||
|
||
cout << "Enter size of second array: ";
|
||
cin >> mass2Size;
|
||
input_array(mass2, mass2Size);
|
||
printArray(mass2);
|
||
|
||
make_unique(mass1);
|
||
make_unique(mass2);
|
||
|
||
cout<<"Cleared masses are:"<<endl;
|
||
printArray(mass1);
|
||
|
||
printArray(mass2);
|
||
|
||
|
||
cout << "Union A and B:"<<endl;
|
||
printArray(set_union(mass1, mass2));
|
||
|
||
cout << "Intersection A and B"<<endl;
|
||
printArray(set_intersection(mass1, mass2));
|
||
|
||
cout << "Difference (A \\ B):"<<endl;
|
||
printArray(set_difference(mass1, mass2));
|
||
|
||
cout << "Difference (B \\ A):"<<endl;
|
||
printArray(set_difference(mass2, mass1));
|
||
|
||
cout << "Symmetric Difference A and B:"<<endl;
|
||
printArray(set_symmetric_diff(mass1, mass2));
|
||
|
||
return 0;
|
||
} |