Advertisement
illfate

Untitled

Mar 28th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <string>
  5. #include <tuple>
  6.  
  7. using std::set;
  8. using std::vector;
  9. using std::cin;
  10. using std::cout;
  11. using std::string;
  12.  
  13. const set<int> universum = []() {// Заполнение Универсального множества
  14. set<int> result;//создаем пустое множество
  15. for (int i = 1; i <= 35; i++) {// берем элементы от 1-35
  16. result.insert(i);//записываем элементы
  17. }
  18. return result;
  19. }();
  20.  
  21. void FillSet(set<int>& s, int n) {//заполняет множество значениями, введенными с клавиатуры
  22. for (int i = 0; i < n; i++) {//
  23. int temp;
  24. cin >> temp;//Принимает значение элемента
  25. s.insert(temp);//записывает значение
  26. }
  27. }
  28.  
  29. set<int> Union(const set<int>& first, const set<int>& second) {//операция объединения
  30. set<int> result;//создаем пустое множество С
  31. for (const auto& x : first) {//берем эдементы множества А
  32. result.insert(x);//записываем элементы множестав А в множество С
  33. }
  34. for (const auto& y : first) {//1
  35. for (const auto& x : second) {//2
  36. if (x != y) {//сравниваем первый элемент множества А с элементом множества В
  37. result.insert(x);//если не равен(если равен, то идем в пункт 2), то добавляем в множество С, если равен, то переходим в пункт 1 и берем следующий элемент А
  38. }
  39. }
  40. }
  41. return result;
  42. }
  43.  
  44. set<int> Intersection(const set<int>& first, const set<int>& second) {//операция пересечения
  45. set<int> result;//создаем пустое множество
  46. for (const auto& item_first : first) {//1
  47. for (const auto& item_second : second) {//2
  48. if (item_first == item_second) {//сравниваем первый элемент множества А с элементом множества В
  49. result.insert(item_first);//если равен(если не равен, то идем в пункт 2), то добавляем в множество С, переходим в пункт 1 и берем следующий элемент А
  50. }
  51. }
  52. }
  53. return result;
  54. }
  55.  
  56. set<int> Difference(const set<int>& first, const set<int>& second) {// Операция разности
  57. set<int> result;//создаем пустое множество
  58. for (const auto& item_first : first) {// Берем элемент мн-ва А
  59. auto it=std::find(second.begin(), second.end(), item_first);//Берем элемент мн-ва В и сравниваем с элементом мн-ва А
  60. if (it == second.end()) {//Если данного эл-та нету в мн-ве С, то записываем его
  61. result.insert(item_first);
  62. }
  63. }
  64. return result;
  65. }
  66.  
  67. set<int> Addition(const set<int>& first){ //Операция дополнения
  68. return Difference(universum,first);//Берем разность между Универсумом и мн-вом
  69. }
  70.  
  71. set<int> SymmetryDifference(const set<int>& first, const set<int>& second) {//Операция Симм. разности
  72. set<int> result(Difference(first, second)); //записываем во мн-во С разность между мн-вами А и В
  73. for (const auto& x : Difference(second, first)) { // записываем во мн-во С разность между мн-вами В и А
  74. result.insert(x);
  75. }
  76. return result;
  77. }
  78.  
  79. set<std::pair<int, int>> Cartesian(const set<int>& first, const set<int>& second) {//Операция Декартова произведения
  80. set<std::pair<int, int>> result;//создаем пустое множество
  81. for (const auto& first_it : first) {//Берем последовательно элементы множества А
  82. for (const auto& second_it : second) {//Берем последовательно элементы множества А
  83. result.insert(std::make_pair(first_it, second_it));//создаем кортеж <A,B>
  84. }
  85. }
  86. return result;
  87.  
  88. }
  89.  
  90.  
  91. std::ostream& operator<<(std::ostream& out, const set<int>& s) {
  92. out << "{";
  93. if (s.size() == 0) {
  94. out << "}";
  95. return out;
  96. }
  97. for (auto it = s.begin(); it != s.end(); it++) {
  98. if (it != prev(s.end())) {
  99. out << *it << ", ";
  100. }
  101. else {
  102. out << *it << "}";
  103. }
  104. }
  105. return out;
  106. }
  107.  
  108. std::ostream& operator<<(std::ostream& out, const set<std::pair<int, int>>& s) { // Обращение к элементам множества А и В, для вывода кортежа
  109. out << "{";
  110. if (s.size() == 0) {
  111. out << "}";
  112. return out;
  113. }
  114. for (auto it = s.begin(); it != s.end(); it++) {
  115.  
  116. if (it != prev(s.end())) {
  117. out <<"<" <<it->first << ", "<<it->second<<">, " ;
  118. }
  119. else {
  120. out << "<" << it->first << ", " << it->second << ">}";
  121. }
  122. }
  123. return out;
  124. }
  125.  
  126. void Menu() {//выбор операции
  127. cout << "1 - выводит объединение множеств" << std::endl << "2 - выводит пересечения множеств" << std::endl
  128. <<"3 - выводит разность множеств"<<std::endl
  129. <<"4 - выводит симметрическую разность"<<std::endl
  130. << "5 - выводит дополнения множества" << std::endl
  131. << "6 - выводит декартово произведение" << std::endl
  132. << "7 - выйти из программы" << std::endl;
  133. }
  134.  
  135. void DefaultFill( set<int>& first, set<int>& second,int first_size,int second_size) {
  136. for (int i = 1; i <= first_size; i++) {//Заполняем множество А методом высказывания А = {𝑥∈𝑁 | 𝑥=𝑘∗2, 𝑘=1,𝑛} , где n – мощность множества А.
  137. first.insert(2*i );//Добавляем элемент во множество
  138. }
  139. for (int i = 1; i <= second_size; i++) {//Заполняем множество В методом высказывания В ={𝑦∈𝑁 |𝑦=(𝑘+1)∗2, 𝑘= 1,𝑔} , где g – мощность множества В.
  140. second.insert((i+1)*2);//Добавляем элемент во множество
  141. }
  142. }
  143.  
  144. int main() {
  145. setlocale(LC_ALL, "ru");
  146. set<int> first, second;//создаем пустые множества А и В
  147. int first_amount, second_amount;
  148. cout << "Введите размер множеств\n";
  149. cin >> first_amount >> second_amount;//Вводим размеры множеств А и В
  150. int command=0;
  151. do {
  152. cout << "Введите номер команды\n1.Задание множество методом перечисления\n2.Задание множество методом высказивание\n";
  153. cin >> command;
  154. switch (command) {//Выбор операция задания множеств
  155. case 1: {//Перечисление
  156. cout << "Введите элементы первого множетсва\n";
  157. FillSet(first, first_amount);
  158. cout << "Введите элементы второго множетсва\n";
  159. FillSet(second, second_amount);
  160. break;
  161. }
  162. case 2: {//Высказывание
  163. DefaultFill(first,second,first_amount,second_amount);
  164. cout << first << std::endl << second << std::endl;
  165. break;
  166. }
  167. default: {
  168. cout << "Неправильная команда\n";
  169. break;
  170. }
  171. }
  172. } while ((command!=1) && (command !=2));
  173.  
  174. while (true) {
  175. Menu();//Перечисление всех операций
  176. cout << "Введите номер команды\n";
  177. int number;
  178. cin >> number;
  179. switch (number)//Выбор операции
  180. {
  181. case 1: {//операция объединения
  182. cout <<"Объединение двух множеств: "<< Union(first, second) << std::endl;
  183. break;
  184. }
  185. case 2: {//операция пересечения
  186. cout <<"Пересечение двух множеств: "<< Intersection(first, second) << std::endl;
  187. break;
  188. }
  189. case 3: {//операция разности
  190. int k;
  191. cout << "Введите номер операции\n1. Операция разности между множествами А и В (А\\В)\n2. Операция разности между множествами B и A (B\\A)\n";
  192. cin >> k;
  193. switch (k)//Выбор операций
  194. {
  195. case 1: {
  196. cout <<"Разность множества A и B: "<< Difference(first, second) << std::endl;
  197. break;
  198. }
  199. case 2: {
  200. cout << "Разность множества B и A: " << Difference(second, first) << std::endl;
  201. break;
  202. }
  203. default:
  204. break;
  205. }
  206.  
  207. break;
  208. }
  209. case 4: {//операция симметрической разности
  210. cout <<"Симметрическая разность: "<<SymmetryDifference(first,second)<< std::endl;
  211. break;
  212. }
  213.  
  214. case 5: {//операция дополнения
  215. int k;
  216. cout << "Введите номер множества\n";
  217. cin >> k;
  218. switch (k)
  219. {
  220. case 1: {
  221. cout <<"Дополнение множества A: "<<Addition(first) << std::endl;
  222. break;
  223. }
  224. case 2: {
  225. cout << "Дополнение множества B: " << Addition(second) << std::endl;
  226. break;
  227. }
  228. default:
  229. break;
  230. }
  231.  
  232. break;
  233. }
  234. case 6: {//операция декартово произведение
  235. int k;
  236. cout << "Введите номер операции\n1. Декартово произведение множеств А и В (А x B)\n2. Декартово произведение множеств B и A (B x A)\n";
  237. cin >> k;
  238. switch (k)
  239. {
  240. case 1: {
  241. cout << "Декартово произведение множеств А и В(А x B): " << Cartesian(first,second) << std::endl;
  242. break;
  243. }
  244. case 2: {
  245. cout <<"Декартово произведение множеств B и A(B x A): "<< Cartesian(second,first) << std::endl;
  246. break;
  247. }
  248. default:
  249. break;
  250. }
  251. break;
  252.  
  253. }
  254. case 7: {//операция выхода
  255. return 0;
  256. }
  257. default: {
  258. cout << "Вы ввели неправильную команду\n";
  259. break;
  260. }
  261. }
  262. }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement