Advertisement
illfate

Untitled

Apr 16th, 2019
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.88 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.Y,first.X,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 - Операция продолжения (Соответствие Г1)" << std::endl
  198. << "10 - Oперация сужения (Соответствие Г1)" << 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. }
  303. return true;//если все компоненты первого графика были найдены во втором графике
  304. }
  305.  
  306. bool CheckConformityes(const Conformity& lhs, const Conformity& rhs) {
  307. return lhs.X == rhs.X && lhs.Y == rhs.Y && CheckIncludeGraphic(lhs.G, rhs.G);
  308. }
  309.  
  310. void Continuation(const Conformity& default_) {//операция продолжение
  311. Conformity conf;
  312. int Q_size, U_size, G_size;
  313. cout << "Введите мощность множества Q\n";
  314. cin >> Q_size;//вводим мощность множества
  315. cout << "Введите элементы множества Q\n";
  316. FillSet(conf.X, Q_size);//заполняем множество
  317. cout << "Введите мощность множества U\n";
  318. cin >> U_size;//вводим размер множества
  319. cout << "Введите элементы множества U\n";
  320. FillSet(conf.Y, U_size);//заполняем множество
  321. cout << "Введите мощность графика G\n";
  322. cin >> G_size;//вводим размер графика
  323. cout << "Введите кортежи графика G\n";
  324. FillGraphic(conf.G, G_size);//заполняем график
  325. cout << conf << endl;
  326. if (CheckConformityes(default_, conf)) {//если соответствие Г7 является продолжением Г1
  327. cout << "Соответствие Г7 является продолжением соответствия Г1\n";
  328. }
  329. else {//если соответствие Г7 не является продолжением Г1
  330. cout << "Соответствие Г7 не является продолжением соответствия Г1\n";
  331. }
  332. if (CheckConformityes(conf,default_)) {////если соответствие Г1 является продолжением Г7
  333. cout << "Соответствие Г1 является продолжением соответствия Г7\n";
  334. }
  335. else {//если соответствие Г1 не является продолжение Г7
  336. cout << "Соответствие Г1 не является продолжением соответствия Г7\n";
  337. }
  338.  
  339. }
  340.  
  341. Conformity Narrowing(const Conformity& conf) {//операции сужения
  342. int size;
  343. cout << "Введите мощность множества А\n";
  344. cin >> size;//вводим мощность множества
  345. set<string> A;
  346. cout << "Введите элементы множества А\n";
  347. set<string> result;//создаем пустое множество
  348. FillSet(A, size);//заполняем множество
  349. return { conf.X,conf.Y,Intersection(conf.G,Cartesian(A,conf.Y)) };
  350. }
  351.  
  352. int main() {
  353. setlocale(LC_ALL, "ru");
  354. Conformity first, second;//создаем пустые соответсвия А и В
  355. int X_size, Y_size, F_size, W_size, Z_size, P_size;
  356. cout << "Введите мощность множества X\n";
  357. cin >> X_size;
  358. cout << "Введите элементы множества X\n";
  359. FillSet(first.X, X_size);
  360. cout << "Введите мощность множества Y\n";
  361. cin >> Y_size;
  362. cout << "Введите элементы множества Y\n";
  363. FillSet(first.Y, Y_size);
  364. cout << "Введите мощность графика G\n";
  365. cin >> F_size;
  366. cout << "Введите кортежи графика G\n";
  367. FillGraphic(first.G, F_size);
  368. cout <<"X:" <<first.X<<endl<<"Y:"<<first.Y<<"G:"<<first.G<<endl;
  369.  
  370. cout << "Введите мощность множества W\n";
  371. cin >> W_size;
  372. cout << "Введите элементы множества W\n";
  373. FillSet(second.X, W_size);
  374. cout << "Введите мощность множества Z\n";
  375. cin >> Z_size;
  376. cout << "Введите элементы множества Z\n";
  377. FillSet(second.Y, Z_size);
  378. cout << "Введите мощность графика P\n";
  379. cin >> P_size;
  380. cout << "Введите кортежи графика P\n";
  381. FillGraphic(second.G, P_size);
  382. cout <<"W:" <<second.X<<endl<<"Z:"<<second.Y<<endl<<"P:"<<second.G<<endl;
  383.  
  384. while (true) {
  385. Menu();//Перечисление всех операций
  386. cout << "Введите номер команды\n";
  387. int number;
  388. cin >> number;
  389. switch (number)//Выбор операции
  390. {
  391. case 1: {//операция объединения
  392. cout << "Объединение:\n" << Union(first, second) << std::endl;
  393. break;
  394. }
  395. case 2: {//операция пересечения
  396. cout << "Пересечение:\n" << Intersection(first, second) << std::endl;
  397. break;
  398. }
  399. case 3: {//операция разности
  400. int k;
  401. cout << "Введите номер операции\n1. Операция разности между соответствиями Г1 и Г2\n2. Операция разности между соответствиями Г2 и Г1\n";
  402. cin >> k;
  403. switch (k)//Выбор операций
  404. {
  405. case 1: {
  406. cout <<" 1 - Операция разности между соответствиями Г1 и Г2:\n" << Difference(first, second) << std::endl;
  407. break;
  408. }
  409. case 2: {
  410. cout <<"2 - Операция разности между соответствиями Г2 и Г1:\n" << Difference(second, first) << std::endl;
  411. break;
  412. }
  413. default:
  414. break;
  415. }
  416.  
  417. break;
  418. }
  419. case 4: {//операция симметрической разности
  420. cout << "Симметрическая разность:\n" << SymmetryDifference(first, second) << std::endl;
  421. break;
  422. }
  423.  
  424. case 5: {//операция инверсия
  425. int k;
  426. cout << "Введите номер операции\n1 - Инверсия графика Г1\n2 - Инверсия графика Г2\n";
  427. cin >> k;
  428. switch (k)
  429. {
  430. case 1: {
  431. cout << "Инверсия соответствия Г1:\n" << "Y:"<<Inversion(first).X<<endl<<"X:"<< Inversion(first).Y<<endl<<"G:"<< Inversion(first).G << std::endl;
  432. break;
  433. }
  434. case 2: {
  435. cout << "Инверсия соответствия Г2:\n" << "Z:" << Inversion(second).X <<endl<< "W:" << Inversion(second).Y <<endl <<"P:" << Inversion(second).G << std::endl;
  436. break;
  437. }
  438. default:
  439. break;
  440. }
  441.  
  442. break;
  443. }
  444. case 6: {//операция композиция
  445. int k;
  446. cout << "Введите номер операции\n1 - Композиция соответствий Г1 и Г2 (Г1*Г2)\n2 - Композиция соответствий Г2 и Г1 (Г2*Г1)\n";
  447. cin >> k;
  448. switch (k)
  449. {
  450. case 1: {
  451. cout << "Композиция соответствий Г1 и Г2 (Г1 * Г2):\n "<< Composition(first, second) << std::endl;
  452. break;
  453. }
  454. case 2: {
  455. cout << "Композиция соответствий Г2 и Г1 (Г2 * Г1):\n " << Composition(second, first) << std::endl;
  456. break;
  457. }
  458. default:
  459. break;
  460. }
  461. break;
  462.  
  463. }
  464. case 7: {//образ
  465. cout << ImageOperation(first)<<endl;
  466. break;
  467. }
  468. case 8: {//прообраз
  469. cout <<PrototypeOperation(first)<<endl;
  470. break;
  471. }
  472. case 9: {//продолжение
  473. Continuation(first);
  474. break;
  475. }
  476. case 10: {//сужение
  477. cout << Narrowing(first)<<endl;
  478. break;
  479. }
  480. case 0: {//операция выхода
  481. return 0;
  482. }
  483. default: {
  484. cout << "Вы ввели неправильную команду\n";
  485. break;
  486. }
  487. }
  488. }
  489. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement