UlSTU_MLiDM/main.c
2025-05-23 12:16:16 +00:00

176 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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