Untitled
unknown
plain_text
2 years ago
13 kB
5
Indexable
#include <iostream> #include <vector> #include <functional> #include <string> #include <algorithm> using namespace std; // множества vector <int> set_1; vector <int> set_2; vector <int> set_3; // универсум vector <int> main_set = { -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25,-24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 }; //------------------------ // побочные функции // функция удаление повторяющихся элементов в векторе vector<int> removing_duplicate_elements(vector<int>& vect) { vector<int> temp; temp.push_back(vect[0]); for (int i = 0; i < vect.size(); i++) { if ((count(temp.begin(), temp.end(), vect[i]) + 1) == 1) { temp.push_back(vect[i]); } } return temp; } // функция вывода множесства в консоль void print_vector(vector <int> v) { for (int i = 0; i < v.size(); i++) { if (i % 10 == 0) cout << endl; cout << v[i] << " "; } cout << "\n\n"; } // вывод всех множеств void print_sets() { cout << "\n\nмножество 1:\n"; print_vector(set_1); cout << "множество 2:\n"; print_vector(set_2); cout << "множество 3:\n"; print_vector(set_3); } //------------------------ // функции ввода множества // ввод множества пересечением void set_input(vector<int>& vect) { int size; cout << "Введите длинну множества\n"; cin >> size; cout << "Введите множество\n"; for (int i = 0; i < size; i++) { int temp; cin >> temp; vect.push_back(temp); } } // проверка границ диапазона bool range_check(int first, int second) { bool result = true; if ((first < -50) || (second > 50) || (first > second)) { result = false; } return result; } // ввод множества диапазоном void set_input_diapason(vector<int>& vect) { int first_number; int second_number; cout << "Введите первую границу\n"; cin >> first_number; cout << "Введите вторую границу\n"; cin >> second_number; while (range_check(first_number, second_number) == false) { cout << "Диапазон выходит за границы универсума\n"; cout << "Введите границы диапазона зановоn\n"; cout << "Введите первую границу\n"; cin >> first_number; cout << "Введите вторую границу\n"; cin >> second_number; } for (int i = first_number; i < second_number + 1; i++) { vect.push_back(i); } } // создание случайного множества void random_set(vector<int>& vect) { cout << "Введите размер множества\n"; int size; cin >> size; int temp = 10; for (int i = 0; i < size; i++) { srand(time(NULL) + i + temp); vect.push_back(-50 + rand() % 100); temp = (temp + 23) / temp; } sort(vect.begin(), vect.end()); } // ввод множества кратностью с диапазоном void set_input_diapason_condition(vector<int>& vect) { int choice_multiplicity; cout << "Введите число-кратность\n"; cin >> choice_multiplicity; int first_number; int second_number; cout << "Введите первую границу\n"; cin >> first_number; cout << "Введите вторую границу\n"; cin >> second_number; while (range_check(first_number, second_number) == false) { cout << "Диапазон выходит за границы универсума\n" << "Введите границы диапазона зановоn\n" << "Введите первую границу\n"; cin >> first_number; cout << "Введите вторую границу\n"; cin >> second_number; } for (int i = first_number; i < second_number + 1; i++) { if (i % choice_multiplicity == 0) { vect.push_back(i); } } } // ввод множества кратностью с знаком void set_input_sign_condition(vector<int>& vect) { int choice_multiplicity; cout << "Введите число-кратность\n"; cin >> choice_multiplicity; cout << "Выберите знак множества\n" << "1 - Плюс\n" << "2 - Минус\n"; int sign; cin >> sign; switch (sign) { case 1: for (int i = 1; i < 50; i++) { if (i % choice_multiplicity == 0) { vect.push_back(i); } } break; case 2: for (int i = -50; i < 0; i++) { if (i % choice_multiplicity == 0) { vect.push_back(i); } } break; } } //------------------------ // Операции: // операция объединения vector<int> union_sets(vector<int>& vect_1, vector<int>& vect_2) { vector <int> temp; temp = vect_1; for (int i = 0; i < vect_2.size(); i++) { temp.push_back(vect_2[i]); } temp = removing_duplicate_elements(temp); return temp; } // функция операции дополнение vector<int> unary_operation_sets(vector<int>& vect_1) { vector<int> temp; for (int i = 0; i < 101; i++) { if (count(vect_1.begin(), vect_1.end(), main_set[i]) == 0) { temp.push_back(main_set[i]); } } return temp; } // функция пересечения vector<int> intersect_sets(vector<int>& vect_1, vector<int>& vect_2) { vector<int> temp; for (int i = 0; i < main_set.size(); i++) { if ((count(vect_1.begin(), vect_1.end(), main_set[i]) == 1) && (count(vect_2.begin(), vect_2.end(), main_set[i]) == 1)) { temp.push_back(main_set[i]); } } return temp; } // фукнция разности vector<int> difference_sets(vector<int>& vect_1, vector<int>& vect_2) { vector<int> temp; for (int i = 0; i < vect_1.size(); i++) { if ((count(vect_1.begin(), vect_1.end(), vect_1[i]) == 1) && (count(vect_2.begin(), vect_2.end(), vect_1[i]) != 1)) { temp.push_back(vect_1[i]); } } return temp; } // функция симметрической разности vector<int> symmetrical_difference_sets(vector<int>& vect_1, vector<int>& vect_2) { vector<int> temp; for (int i = 0; i < main_set.size(); i++) { if ((count(vect_1.begin(), vect_1.end(), main_set[i]) == 1 && count(vect_2.begin(), vect_2.end(), main_set[i]) == 0) || ((count(vect_2.begin(), vect_2.end(), main_set[i]) == 1) && (count(vect_1.begin(), vect_1.end(), main_set[i]) == 0))) { temp.push_back(main_set[i]); } } return temp; } //------------------------ // меню // меню задания множества void first_menu() { cout << "Выберите способ задания множества:\n" << "1 - Перечислением\n" << "2 - Диапазоном\n" << "3 - Условием\n" << "4 - Случайное множество\n" << "0 - Выход\n\n"; } // меню операций над множествами void print_menu() { cout << endl << endl << "Меню:\n\n" << "Выбор операции над множествами: \n" << "1 - Объединение\n" << "2 - Пересечение\n" << "3 - Разность\n" << "4 - Симметричная разность\n" << "5 - Дополнение\n" << "6 - Показать множества\n" << "0 - Выход\n" << endl; } // меню выбора множества void print_menu_sets() { cout << "Выберите множество: \n" << "1 - Множество 1\n" << "2 - Множество 2\n" << "3 - Множество 3\n\n"; //<< "0 - Назад\n"; } void print_menu_sets(int choice) { cout << "Выберите множество: \n"; switch (choice) { case(1): cout << "2 - Множество 2\n" << "3 - Множество 3\n\n"; break; case(2): cout << "1 - Множество 1\n" << "3 - Множество 3\n\n"; break; case(3): cout << "1 - Множество 1\n" << "2 - Множество 2\n\n"; break; } } // меню задания множества с условием void menu_choice_condition(vector<int>& vect) { cout << "\nВыберете условие\n" << "1 - Кратность с диапазоном\n" << "2 - Кратность со знаком\n\n"; int choice; cin >> choice; switch (choice) { case 1: set_input_diapason_condition(vect); break; case 2: set_input_sign_condition(vect); break; } } // задание множеств void choice_input(vector<int>& vect) { first_menu(); int choice; cin >> choice; switch (choice) { // пересечением case (1): set_input(vect); break; // диапазоном case (2): set_input_diapason(vect); break; // условием case (3): menu_choice_condition(vect); break; // случайное case (4): random_set(vect); break; default: cout << "Введен некорректный вариант\n"; break; } } // функция для выбора множеств для совершения операции и дальнейший вывод результата операции void func_menu(function<vector<int>(vector<int>& vect_1, vector<int>& vect_2)> func) { int choice_1; int choice_2; vector<int> temp; print_menu_sets(); cin >> choice_1; switch (choice_1) { case (1): print_menu_sets(1); cin >> choice_2; switch (choice_2) { case(2): temp = func(set_1, set_2); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; case(3): temp = func(set_1, set_3); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; } break; case(2): print_menu_sets(2); cin >> choice_2; switch (choice_2) { case(1): temp = func(set_2, set_1); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; case(3): temp = func(set_2, set_3); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; } break; case(3): print_menu_sets(3); cin >> choice_2; switch (choice_2) { case(1): temp = func(set_3, set_1); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; case(2): temp = func(set_3, set_2); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; } break; } } void main() { setlocale(LC_ALL, "Rus"); cout << "Калькулятор множеств\n" << "Универсум - все целые числа от -50 до 50\n\n"; // ввод множеств cout << "\nВведите первое множество\n"; choice_input(set_1); cout << "\nВведите второе множество\n"; choice_input(set_2); cout << "\nВведите третье множество\n"; choice_input(set_3); print_sets(); // операции над множествами int choice = 1; // для выбора множеств int choice_1; vector<int> temp; while (choice != 0) { print_menu(); cin >> choice; switch (choice) { case(1): func_menu(union_sets); break; case(2): func_menu(intersect_sets); break; case(3): func_menu(difference_sets); break; case(4): func_menu(symmetrical_difference_sets); break; case(5): print_menu_sets(); cin >> choice_1; switch (choice_1) { case(1): temp = unary_operation_sets(set_1); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; case(2): temp = unary_operation_sets(set_2); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; case(3): temp = unary_operation_sets(set_3); if (!temp.empty()) { print_vector(temp); } else { cout << "Пустое множество" << "\n"; } break; } break; case(6): print_sets(); break; case(0): break; default: cout << "Введён некорректный вариант"; break; } } }
Editor is loading...
Leave a Comment