illfate

Untitled

Apr 15th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <string>
  5. #include <tuple>
  6. #include <algorithm>
  7. #include <string>//подключение необходимых библиотек
  8. using namespace std;// открытие простравнтсва имен
  9.  
  10. using Graphic = set<std::pair<string, string>>;//предстваление графика
  11.  
  12. struct Conformity {//представление соотношения
  13. set<string> X;
  14. set<string> Y;
  15. Graphic G;
  16. };
  17.  
  18. void FillGraphic(Graphic& g, int n) {//заполняет график значениями, введенными с клавиатуры
  19. for (int i = 0; i < n; i++) {
  20. string first, second;
  21. cin >> first >> second;//Принимает значение элемента
  22. g.insert({ first,second });//создает и записывает кортеж в график
  23. }
  24. }
  25.  
  26. Graphic Union(const Graphic& first, const Graphic& second) {//операция объединения
  27. Graphic result;//создаем пустой график С
  28. for (const auto& x : first) {//берем эдементы графика А
  29. result.insert(x);//записываем элементы графика А в график С
  30. }
  31. for (const auto& y : first) {//берем элемент графика А
  32. for (const auto& x : second) {//берем элемент графика В
  33. if (x != y) {//сравниваем выбранные элементы графика А и с выбранным элемнтом графика В
  34. result.insert(x);//если не равен(если равен, то идем в пункт 2), то добавляем в график С, если равен, то переходим в пункт 1 и берем следующий элемент А
  35. }
  36. }
  37. }
  38. return result;
  39. }
  40.  
  41. set<string> Union(const set<string>& first, const set<string>& second) {//операция объединения
  42. set<string> result;//создаем пустое множество С
  43. for (const auto& x : first) {//берем эдементы множества А
  44. result.insert(x);//записываем элементы множестав А в множество С
  45. }
  46. for (const auto& y : first) {//1
  47. for (const auto& x : second) {//2
  48. if (x != y) {//сравниваем первый элемент множества А с элементом множества В
  49. result.insert(x);//если не равен(если равен, то идем в пункт 2), то добавляем в множество С, если равен, то переходим в пункт 1 и берем следующий элемент А
  50. }
  51. }
  52. }
  53. return result;
  54. }
  55.  
  56.  
  57. Conformity Union(const Conformity& first, const Conformity& second) {
  58. return { Union(first.X,second.X),Union(first.Y,second.Y),Union(first.G,second.G) };//используем операции объединения для множеств и графика
  59. }
  60.  
  61.  
  62. set<string> Intersection(const set<string>& first, const set<string>& second) {//операция пересечения
  63. set<string> result;//создаем пустое множество
  64. for (const auto& item_first : first) {//1
  65. for (const auto& item_second : second) {//2
  66. if (item_first == item_second) {//сравниваем первый элемент множества А с элементом множества В
  67. result.insert(item_first);//если равен(если не равен, то идем в пункт 2), то добавляем в множество С, переходим в пункт 1 и берем следующий элемент А
  68. }
  69. }
  70. }
  71. return result;
  72. }
  73.  
  74. Graphic Intersection(const Graphic& first, const Graphic& second) {//операция пересечения
  75. Graphic result;//создаем пустой график
  76. for (const auto& item_first : first) {//берем элемент графика А
  77. for (const auto& item_second : second) {//берем элемент графика В
  78. if (item_first == item_second) {//сравниваем выбранный элемент множества А с выбранным элементом множества В
  79. result.insert(item_first);//если равен(если не равен, то идем в пункт 2), то добавляем в множество С, переходим в пункт 1 и берем следующий элемент А
  80. }
  81. }
  82. }
  83. return result;
  84. }
  85.  
  86. Conformity Intersection(const Conformity& first, const Conformity& second) {
  87. return { Intersection(first.X,second.X),Intersection(first.Y,second.Y),Intersection(first.G,second.G) };//используем операции пересечения для множеств и графика
  88. }
  89.  
  90. Graphic Difference(const Graphic& first, const Graphic& second) {// Операция разности
  91. Graphic result;//создаем пустой график С
  92. for (const auto& item_first : first) {// Берем элемент графика А
  93. auto it = find(second.begin(), second.end(), item_first);//Берем элемент графика В и сравниваем с элементом графика А
  94. if (it == second.end()) {//Если данного эл-та нету в графкие В, то записываем его в график С
  95. result.insert(item_first);
  96. }
  97. }
  98. return result;
  99. }
  100.  
  101. set<string> Difference(const set<string>& first, const set<string>& second) {// Операция разности
  102. set<string> result;//создаем пустое множество
  103. for (const auto& item_first : first) {// Берем элемент мн-ва А
  104. auto it = std::find(second.begin(), second.end(), item_first);//Берем элемент мн-ва В и сравниваем с элементом мн-ва А
  105. if (it == second.end()) {//Если данного эл-та нету в мн-ве С, то записываем его
  106. result.insert(item_first);
  107. }
  108. }
  109. return result;
  110. }
  111.  
  112. Conformity Difference(const Conformity& first, const Conformity& second) {
  113. return { Difference(first.X,second.X),Difference(first.Y,second.Y),Difference(first.G,second.G) };//используем операции разности для множеств и графика
  114. }
  115.  
  116.  
  117. Graphic SymmetryDifference(const Graphic& first, const Graphic& second) {//Операция Симметрической разности
  118. Graphic result(Difference(first, second)); //записываем в график С разность между графиками А и В
  119. for (const auto& x : Difference(second, first)) { //Берем элемент разности между графиками В и А
  120. result.insert(x);//записываем в график С
  121. }
  122. return result;
  123. }
  124.  
  125.  
  126. set<string> SymmetryDifference(const set<string>& first, const set<string>& second) {//Операция Симм. разности
  127. set<string> result(Difference(first, second)); //записываем во мн-во С разность между мн-вами А и В
  128. for (const auto& x : Difference(second, first)) { // записываем во мн-во С разность между мн-вами В и А
  129. result.insert(x);
  130. }
  131. return result;
  132. }
  133.  
  134. Conformity SymmetryDifference(const Conformity& first, const Conformity& second) {
  135. return { SymmetryDifference(first.X,second.X),SymmetryDifference(first.Y,second.Y),SymmetryDifference(first.G,second.G) };//используем
  136. //операции симметрической разности для множеств и графика
  137. }
  138.  
  139. Graphic Inversion(const Graphic& graphic) {
  140. Graphic result;//создаем пустой график С
  141. for (const auto& [first, second] : graphic) {//берем элемент графика А
  142. result.insert({ second,first });//записываем инверсированный кортеж элемента из графика А в график С
  143. }
  144. return result;
  145. }
  146.  
  147. Conformity Inversion(const Conformity& first) {
  148. return { first.X,first.Y,Inversion(first.G) };//используем операцию инверсии для графика
  149. }
  150.  
  151. Graphic Composition(const Graphic& first_graphic, const Graphic& second_graphic) {
  152. Graphic result;//создаем пустой график С
  153. for (const auto& [first, second] : first_graphic) {//берем элемент графика А
  154. auto it = find_if(second_graphic.begin(), second_graphic.end(), [second](const pair<string, string> & p) {//Если вторая компонента выбранного кортежа графика А
  155. return p.first == second;
  156. });
  157. if (it != second_graphic.end()) {//равна первой компоненте выбранного кортежа графика В
  158. result.insert({ first,it->second });//Создаем новый кортеж
  159. // Первой компонентой нового кортежа является первая компонента выбранного кортежа А.
  160. //Второй компонентой нового кортежа является вторая компонента выбранного кортежа B.
  161. //Записываем новый кортеж в график J.
  162. }
  163. }
  164. return result;
  165. }
  166.  
  167. Conformity Composition(const Conformity& first, const Conformity& second) {
  168. return { first.X,second.Y, Composition(first.G,second.G) };//используем операцию композиция для графика
  169. }
  170.  
  171. std::ostream& operator<<(std::ostream& out, const set<std::pair<string, string>>& s) {
  172. out << "{";
  173. if (s.size() == 0) {
  174. out << "}";
  175. return out;
  176. }
  177. for (auto it = s.begin(); it != s.end(); it++) {
  178.  
  179. if (it != prev(s.end())) {
  180. out << "<" << it->first << ", " << it->second << ">, ";
  181. }
  182. else {
  183. out << "<" << it->first << ", " << it->second << ">}";
  184. }
  185. }
  186. return out;
  187. }
  188.  
  189. void Menu() {//выбор операции
  190. cout << "1 - Операция объединения" << std::endl << "2 - Операция пересечения" << std::endl
  191. << "3 - Операция разности" << std::endl
  192. << "4 - Операция симметрической разности" << std::endl
  193. << "5 - Операция инверсии" << std::endl
  194. << "6 - Операция композиции" << std::endl
  195. << "7 - Операция образа(Соответствие Г1)" << std::endl
  196. << "8 - Операция прообраза (Соответствие Г1)" << std::endl
  197. << "9 - Операция продолжения" << std::endl
  198. << "10 - Oперация сужения" << endl
  199. << "0 - выйти из программы" << std::endl;
  200. }
  201.  
  202. void FillSet(set<string>& s, int n) {//заполняет множество значениями, введенными с клавиатуры
  203. for (int i = 0; i < n; i++) {//
  204. string temp;
  205. cin >> temp;//Принимает значение элемента
  206. s.insert(temp);//записывает значение
  207. }
  208. }
  209.  
  210. set<std::pair<string, string>> Cartesian(const set<string>& first, const set<string>& second) {//Операция Декартова произведения
  211. set<std::pair<string, string>> result;//создаем пустое множество
  212. for (const auto& first_it : first) {//Берем последовательно элементы множества А
  213. for (const auto& second_it : second) {//Берем последовательно элементы множества А
  214. result.insert(std::make_pair(first_it, second_it));//создаем кортеж <A,B>
  215. }
  216. }
  217. return result;
  218.  
  219. }
  220.  
  221. set<string> ImageOperation(const Conformity& conf ) {//операция образа
  222. int size;
  223. cout << "Введите мощность множества А\n";
  224. cin >> size;//вводим мощность
  225. set<string> A;
  226. cout << "Введите элементы множества А\n";
  227. set<string> result;
  228. FillSet(A, size);//заполняем эдементы
  229. for (const auto& element : A ) {//берем элемент множества А
  230. auto it = find_if(conf.G.begin(), conf.G.end(), [element](pair<string, string> p) {
  231. return p.first == element; }//если элемент множества А равен выбранному первому элементу компоненты графика
  232. );
  233. if (it != conf.G.end()) {
  234. result.insert(it->second);//добавляем множество
  235. }
  236. }
  237. return result;
  238. }
  239.  
  240. set<string> PrototypeOperation(const Conformity& conf) {
  241. int size;
  242. cout << "Введите мощность множества B\n";
  243. cin >> size;
  244. set<string> B;
  245. cout << "Введите элементы множества B\n";
  246. set<string> result;
  247. FillSet(B, size);
  248. for (const auto& element : B) {
  249. auto it = find_if(conf.G.begin(), conf.G.end(), [element](pair<string, string> p) {
  250. return p.second == element; }
  251. );
  252. if (it != conf.G.end()) {
  253. result.insert(it->first);
  254. }
  255. }
  256. return result;
  257. }
  258.  
  259.  
  260. std::ostream& operator<<(std::ostream& out, const set<string>& s) {
  261. out << "{";
  262. if (s.size() == 0) {
  263. out << "}";
  264. return out;
  265. }
  266. for (auto it = s.begin(); it != s.end(); it++) {
  267. if (it != prev(s.end())) {
  268. out << *it << ", ";
  269. }
  270. else {
  271. out << *it << "}";
  272. }
  273. }
  274. return out;
  275. }
  276. ostream& operator<<(ostream& out, const Conformity& conf) {
  277. out <<"X: "<< conf.X << endl<<"Y: " << conf.Y<<endl <<"G: "<< conf.G;
  278. return out;
  279. }
  280.  
  281. bool operator==(const set<string>& lhs, const set<string>& rhs) {
  282. if (lhs.size() != rhs.size()) {
  283. return false;
  284. }
  285. auto y = rhs.begin();
  286. for (const auto& x : lhs) {
  287. if (x != *y) {
  288. return false;
  289. }
  290. y++;
  291. }
  292. return true;
  293. }
  294.  
  295. bool CheckIncludeGraphic(const Graphic& lhs, const Graphic& rhs) {
  296. for (const auto& element : lhs) {
  297. auto it=find(rhs.begin(), rhs.end(), element);
  298. if (it == rhs.end()) {
  299. return false;
  300. }
  301. }
  302. return true;
  303. }
  304.  
  305. bool CheckConformityes(const Conformity& lhs, const Conformity& rhs) {
  306. return lhs.X == rhs.X && lhs.Y == rhs.Y && CheckIncludeGraphic(lhs.G, rhs.G);
  307. }
  308.  
  309. void Continuation(const Conformity& default_) {
  310. Conformity conf;
  311. int Q_size, U_size, G_size;
  312. cout << "Введите мощность множества Q\n";
  313. cin >> Q_size;
  314. cout << "Введите элементы множества Q\n";
  315. FillSet(conf.X, Q_size);
  316. cout << "Введите мощность множества U\n";
  317. cin >> U_size;
  318. cout << "Введите элементы множества U\n";
  319. FillSet(conf.Y, U_size);
  320. cout << "Введите мощность графика G\n";
  321. cin >> G_size;
  322. cout << "Введите кортежи графика G\n";
  323. FillGraphic(conf.G, G_size);
  324. cout << conf << endl;
  325. if (CheckConformityes(default_, conf)) {
  326. cout << "Соответствие Г7 является продолжением соответствия Г1\n";
  327. }
  328. else {
  329. cout << "Соответствие Г7 не является продолжением соответствия Г1\n";
  330. }
  331. if (CheckConformityes(conf,default_)) {
  332. cout << "Соответствие Г1 является продолжением соответствия Г7\n";
  333. }
  334. else {
  335. cout << "Соответствие Г1 не является продолжением соответствия Г7\n";
  336. }
  337.  
  338. }
  339.  
  340. Conformity Narrowing(const Conformity& conf) {
  341. int size;
  342. cout << "Введите мощность множества А\n";
  343. cin >> size;
  344. set<string> A;
  345. cout << "Введите элементы множества А\n";
  346. set<string> result;
  347. FillSet(A, size);
  348. return { conf.X,conf.Y,Intersection(conf.G,Cartesian(A,conf.Y)) };
  349. }
  350.  
  351. int main() {
  352. setlocale(LC_ALL, "ru");
  353. Conformity first, second;//создаем пустые соответсвия А и В
  354. int X_size, Y_size, F_size, W_size, Z_size, P_size;
  355. cout << "Введите мощность множества X\n";
  356. cin >> X_size;
  357. cout << "Введите элементы множества X\n";
  358. FillSet(first.X, X_size);
  359. cout << "Введите мощность множества Y\n";
  360. cin >> Y_size;
  361. cout << "Введите элементы множества Y\n";
  362. FillSet(first.Y, Y_size);
  363. cout << "Введите мощность графика G\n";
  364. cin >> F_size;
  365. cout << "Введите кортежи графика G\n";
  366. FillGraphic(first.G, F_size);
  367. cout << first<<endl;
  368.  
  369. cout << "Введите мощность множества W\n";
  370. cin >> W_size;
  371. cout << "Введите элементы множества W\n";
  372. FillSet(second.X, W_size);
  373. cout << "Введите мощность множества Z\n";
  374. cin >> Z_size;
  375. cout << "Введите элементы множества Z\n";
  376. FillSet(second.Y, Z_size);
  377. cout << "Введите мощность графика P\n";
  378. cin >> P_size;
  379. cout << "Введите кортежи графика P\n";
  380. FillGraphic(second.G, P_size);
  381. cout << second<<endl;
  382.  
  383. while (true) {
  384. Menu();//Перечисление всех операций
  385. cout << "Введите номер команды\n";
  386. int number;
  387. cin >> number;
  388. switch (number)//Выбор операции
  389. {
  390. case 1: {//операция объединения
  391. cout << "Объединение:\n" << Union(first, second) << std::endl;
  392. break;
  393. }
  394. case 2: {//операция пересечения
  395. cout << "Пересечение:\n" << Intersection(first, second) << std::endl;
  396. break;
  397. }
  398. case 3: {//операция разности
  399. int k;
  400. cout << "Введите номер операции\n1. Операция разности между соответствиями Г1 и Г2\n2. Операция разности между соответствиями Г2 и Г1\n";
  401. cin >> k;
  402. switch (k)//Выбор операций
  403. {
  404. case 1: {
  405. cout <<" 1 - Операция разности между соответствиями Г1 и Г2:\n" << Difference(first, second) << std::endl;
  406. break;
  407. }
  408. case 2: {
  409. cout <<"2 - Операция разности между соответствиями Г2 и Г1:\n" << Difference(second, first) << std::endl;
  410. break;
  411. }
  412. default:
  413. break;
  414. }
  415.  
  416. break;
  417. }
  418. case 4: {//операция симметрической разности
  419. cout << "Симметрическая разность:\n" << SymmetryDifference(first, second) << std::endl;
  420. break;
  421. }
  422.  
  423. case 5: {//операция инверсия
  424. int k;
  425. cout << "Введите номер операции\n1 - Инверсия графика Г1\n2 - Инверсия графика Г2\n";
  426. cin >> k;
  427. switch (k)
  428. {
  429. case 1: {
  430. cout << "Инверсия соответствия Г1:\n" << Inversion(first) << std::endl;
  431. break;
  432. }
  433. case 2: {
  434. cout << "Инверсия соответствия Г2:\n" << Inversion(second) << std::endl;
  435. break;
  436. }
  437. default:
  438. break;
  439. }
  440.  
  441. break;
  442. }
  443. case 6: {//операция композиция
  444. int k;
  445. cout << "Введите номер операции\n1 - Композиция соответствий Г1 и Г2 (Г1*Г2)\n2 - Композиция соответствий Г1 и Г2 (Г1*Г2)\n";
  446. cin >> k;
  447. switch (k)
  448. {
  449. case 1: {
  450. cout << "Композиция соответствий Г1 и Г2 (Г1 * Г2):\n " << Composition(first, second) << std::endl;
  451. break;
  452. }
  453. case 2: {
  454. cout << "Композиция соответствий Г1 и Г2 (Г1 * Г2):\n " << Composition(second, first) << std::endl;
  455. break;
  456. }
  457. default:
  458. break;
  459. }
  460. break;
  461.  
  462. }
  463. case 7: {//образ
  464. cout << "Ваше множество: " << ImageOperation(first)<<endl;
  465. break;
  466. }
  467. case 8: {//прообраз
  468. cout <<"Ваше множество: "<< PrototypeOperation(first)<<endl;
  469. break;
  470. }
  471. case 9: {//продолжение
  472. Continuation(first);
  473. break;
  474. }
  475. case 10: {//сужение
  476. cout << Narrowing(first)<<endl;
  477. break;
  478. }
  479. case 0: {//операция выхода
  480. return 0;
  481. }
  482. default: {
  483. cout << "Вы ввели неправильную команду\n";
  484. break;
  485. }
  486. }
  487. }
  488. }
Add Comment
Please, Sign In to add comment