illfate

Untitled

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