Advertisement
illfate

Untitled

May 10th, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.19 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. for (const auto& [first_of_sec, second_of_sec] : second_graphic) {
  155. if (second == first_of_sec) {
  156. result.insert({ first,second_of_sec });
  157. }
  158. }
  159. }
  160. return result;
  161. }
  162.  
  163. Conformity Composition(const Conformity& first, const Conformity& second) {
  164. return { first.X,second.Y, Composition(first.G,second.G) };//используем операцию композиция для графика
  165. }
  166.  
  167. std::ostream& operator<<(std::ostream& out, const set<std::pair<string, string>>& s) {
  168. out << "{";
  169. if (s.size() == 0) {
  170. out << "}";
  171. return out;
  172. }
  173. for (auto it = s.begin(); it != s.end(); it++) {
  174.  
  175. if (it != prev(s.end())) {
  176. out << "<" << it->first << ", " << it->second << ">, ";
  177. }
  178. else {
  179. out << "<" << it->first << ", " << it->second << ">}";
  180. }
  181. }
  182. return out;
  183. }
  184.  
  185. void Menu() {//выбор операции
  186. cout << "1 - Операция объединения" << std::endl << "2 - Операция пересечения" << std::endl
  187. << "3 - Операция разности" << std::endl
  188. << "4 - Операция симметрической разности" << std::endl
  189. << "5 - Операция инверсии" << std::endl
  190. << "6 - Операция композиции" << std::endl
  191. << "7 - Операция образа (Соответствие Г1)" << std::endl
  192. << "8 - Операция прообраза (Соответствие Г1)" << std::endl
  193. << "9 - Операция продолжения (Соответствие Г1)" << std::endl
  194. << "10 - Oперация сужения (Соответствие Г1)" << endl
  195. << "0 - выйти из программы" << std::endl;
  196. }
  197.  
  198. void FillSet(set<string>& s, int n) {//заполняет множество значениями, введенными с клавиатуры
  199. for (int i = 0; i < n; i++) {//
  200. string temp;
  201. cin >> temp;//Принимает значение элемента
  202. s.insert(temp);//записывает значение
  203. }
  204. }
  205.  
  206. set<std::pair<string, string>> Cartesian(const set<string>& first, const set<string>& second) {//Операция Декартова произведения
  207. set<std::pair<string, string>> result;//создаем пустое множество
  208. for (const auto& first_it : first) {//Берем последовательно элементы множества А
  209. for (const auto& second_it : second) {//Берем последовательно элементы множества А
  210. result.insert(std::make_pair(first_it, second_it));//создаем кортеж <A,B>
  211. }
  212. }
  213. return result;
  214.  
  215. }
  216.  
  217. set<string> ImageOperation(const Conformity& conf ) {//операция образа
  218. int size;
  219. cout << "Введите мощность множества А\n";
  220. cin >> size;//вводим мощность
  221. set<string> A;
  222. cout << "Введите элементы множества А\n";
  223. set<string> result;
  224. FillSet(A, size);//заполняем эдементы
  225. for (const auto& element : A ) {//берем элемент множества А
  226. auto it = find_if(conf.G.begin(), conf.G.end(), [element](pair<string, string> p) {
  227. return p.first == element; }//если элемент множества А равен выбранному первому элементу компоненты графика
  228. );
  229. if (it != conf.G.end()) {
  230. result.insert(it->second);//добавляем множество
  231. }
  232. }
  233. return result;
  234. }
  235.  
  236. set<string> PrototypeOperation(const Conformity& conf) {//операция прообраза
  237. int size;
  238. cout << "Введите мощность множества B\n";//вводим мощность
  239. cin >> size;
  240. set<string> B;//создаем множество В
  241. cout << "Введите элементы множества B\n";
  242. set<string> result;
  243. FillSet(B, size);//заполняем множество
  244. for (const auto& element : B) {//берем элемент множества В
  245. auto it = find_if(conf.G.begin(), conf.G.end(), [element](pair<string, string> p) {//берем второй элемент компоненты графика
  246. return p.second == element; }//если элемент равен второму элементу комоненты графика
  247. );
  248. if (it != conf.G.end()) {
  249. result.insert(it->first);//добавляем его
  250. }
  251. }
  252. return result;
  253. }
  254.  
  255.  
  256. std::ostream& operator<<(std::ostream& out, const set<string>& s) {
  257. out << "{";
  258. if (s.size() == 0) {
  259. out << "}";
  260. return out;
  261. }
  262. for (auto it = s.begin(); it != s.end(); it++) {
  263. if (it != prev(s.end())) {
  264. out << *it << ", ";
  265. }
  266. else {
  267. out << *it << "}";
  268. }
  269. }
  270. return out;
  271. }
  272. ostream& operator<<(ostream& out, const Conformity& conf) {
  273. out <<"X:"<<conf.X<<endl<<"Y:"<< conf.Y<<endl<<"G:" << conf.G;
  274. return out;
  275. }
  276.  
  277. bool operator==(const set<string>& lhs, const set<string>& rhs) {//проверка на равенство множеств
  278. if (lhs.size() != rhs.size()) {
  279. return false;
  280. }
  281. auto y = rhs.begin();
  282. for (const auto& x : lhs) {//берем каждый элемент первого и второго множества
  283. if (x != *y) {//если не равны
  284. return false;
  285. }
  286. y++;
  287. }
  288. return true;
  289. }
  290.  
  291. bool CheckIncludeGraphic(const Graphic& lhs, const Graphic& rhs) {
  292. for (const auto& element : lhs) {//берем компоненту первого графика
  293. auto it=find(rhs.begin(), rhs.end(), element);//берем компоненту второго графика
  294. if (it == rhs.end()) {//если не найдено
  295. return false;
  296. }
  297.  
  298. }
  299. return true;//если все компоненты первого графика были найдены во втором графике
  300. }
  301.  
  302. bool CheckConformityes(const Conformity& lhs, const Conformity& rhs) {
  303. return lhs.X == rhs.X && lhs.Y == rhs.Y && CheckIncludeGraphic(lhs.G, rhs.G);
  304. }
  305.  
  306. void Continuation(const Conformity& default_) {//операция продолжение
  307. Conformity conf;
  308. int Q_size, U_size, G_size;
  309. cout << "Введите мощность множества Q\n";
  310. cin >> Q_size;//вводим мощность множества
  311. cout << "Введите элементы множества Q\n";
  312. FillSet(conf.X, Q_size);//заполняем множество
  313. cout << "Введите мощность множества U\n";
  314. cin >> U_size;//вводим размер множества
  315. cout << "Введите элементы множества U\n";
  316. FillSet(conf.Y, U_size);//заполняем множество
  317. cout << "Введите мощность графика G\n";
  318. cin >> G_size;//вводим размер графика
  319. cout << "Введите кортежи графика G\n";
  320. FillGraphic(conf.G, G_size);//заполняем график
  321. cout << conf << endl;
  322. if (CheckConformityes(default_, conf)) {//если соответствие Г7 является продолжением Г1
  323. cout << "Соответствие Г7 является продолжением соответствия Г1\n";
  324. }
  325. else {//если соответствие Г7 не является продолжением Г1
  326. cout << "Соответствие Г7 не является продолжением соответствия Г1\n";
  327. }
  328. if (CheckConformityes(conf,default_)) {////если соответствие Г1 является продолжением Г7
  329. cout << "Соответствие Г1 является продолжением соответствия Г7\n";
  330. }
  331. else {//если соответствие Г1 не является продолжение Г7
  332. cout << "Соответствие Г1 не является продолжением соответствия Г7\n";
  333. }
  334.  
  335. }
  336.  
  337. Conformity Narrowing(const Conformity& conf) {//операции сужения
  338. int size;
  339. cout << "Введите мощность множества А\n";
  340. cin >> size;//вводим мощность множества
  341. set<string> A;
  342. cout << "Введите элементы множества А\n";
  343. set<string> result;//создаем пустое множество
  344. FillSet(A, size);//заполняем множество
  345. return { conf.X,conf.Y,Intersection(conf.G,Cartesian(A,conf.Y)) };
  346. }
  347.  
  348. int main() {
  349. setlocale(LC_ALL, "ru");
  350. Conformity first, second;//создаем пустые соответсвия А и В
  351. int X_size, Y_size, F_size, W_size, Z_size, P_size;
  352. cout << "Введите мощность множества X\n";
  353. cin >> X_size;
  354. cout << "Введите элементы множества X\n";
  355. FillSet(first.X, X_size);
  356. cout << "Введите мощность множества Y\n";
  357. cin >> Y_size;
  358. cout << "Введите элементы множества Y\n";
  359. FillSet(first.Y, Y_size);
  360. cout << "Введите мощность графика G\n";
  361. cin >> F_size;
  362. cout << "Введите кортежи графика G\n";
  363. FillGraphic(first.G, F_size);
  364. cout <<"X:" <<first.X<<endl<<"Y:"<<first.Y<<"G:"<<first.G<<endl;
  365.  
  366. cout << "Введите мощность множества W\n";
  367. cin >> W_size;
  368. cout << "Введите элементы множества W\n";
  369. FillSet(second.X, W_size);
  370. cout << "Введите мощность множества Z\n";
  371. cin >> Z_size;
  372. cout << "Введите элементы множества Z\n";
  373. FillSet(second.Y, Z_size);
  374. cout << "Введите мощность графика P\n";
  375. cin >> P_size;
  376. cout << "Введите кортежи графика P\n";
  377. FillGraphic(second.G, P_size);
  378. cout <<"W:" <<second.X<<endl<<"Z:"<<second.Y<<endl<<"P:"<<second.G<<endl;
  379.  
  380. while (true) {
  381. Menu();//Перечисление всех операций
  382. cout << "Введите номер команды\n";
  383. int number;
  384. cin >> number;
  385. switch (number)//Выбор операции
  386. {
  387. case 1: {//операция объединения
  388. cout << "Объединение:\n" << Union(first, second) << std::endl;
  389. break;
  390. }
  391. case 2: {//операция пересечения
  392. cout << "Пересечение:\n" << Intersection(first, second) << std::endl;
  393. break;
  394. }
  395. case 3: {//операция разности
  396. int k;
  397. cout << "Введите номер операции\n1. Операция разности между соответствиями Г1 и Г2\n2. Операция разности между соответствиями Г2 и Г1\n";
  398. cin >> k;
  399. switch (k)//Выбор операций
  400. {
  401. case 1: {
  402. cout <<" 1 - Операция разности между соответствиями Г1 и Г2:\n" << Difference(first, second) << std::endl;
  403. break;
  404. }
  405. case 2: {
  406. cout <<"2 - Операция разности между соответствиями Г2 и Г1:\n" << Difference(second, first) << std::endl;
  407. break;
  408. }
  409. default:
  410. break;
  411. }
  412.  
  413. break;
  414. }
  415. case 4: {//операция симметрической разности
  416. cout << "Симметрическая разность:\n" << SymmetryDifference(first, second) << std::endl;
  417. break;
  418. }
  419.  
  420. case 5: {//операция инверсия
  421. int k;
  422. cout << "Введите номер операции\n1 - Инверсия графика Г1\n2 - Инверсия графика Г2\n";
  423. cin >> k;
  424. switch (k)
  425. {
  426. case 1: {
  427. cout << "Инверсия соответствия Г1:\n" << "Y:"<<Inversion(first).X<<endl<<"X:"<< Inversion(first).Y<<endl<<"G:"<< Inversion(first).G << std::endl;
  428. break;
  429. }
  430. case 2: {
  431. cout << "Инверсия соответствия Г2:\n" << "Z:" << Inversion(second).X <<endl<< "W:" << Inversion(second).Y <<endl <<"P:" << Inversion(second).G << std::endl;
  432. break;
  433. }
  434. default:
  435. break;
  436. }
  437.  
  438. break;
  439. }
  440. case 6: {//операция композиция
  441. int k;
  442. cout << "Введите номер операции\n1 - Композиция соответствий Г1 и Г2 (Г1*Г2)\n2 - Композиция соответствий Г2 и Г1 (Г2*Г1)\n";
  443. cin >> k;
  444. switch (k)
  445. {
  446. case 1: {
  447. cout << "Композиция соответствий Г1 и Г2 (Г1 * Г2):\n "<< Composition(first, second) << std::endl;
  448. break;
  449. }
  450. case 2: {
  451. cout << "Композиция соответствий Г2 и Г1 (Г2 * Г1):\n " << Composition(second, first) << std::endl;
  452. break;
  453. }
  454. default:
  455. break;
  456. }
  457. break;
  458.  
  459. }
  460. case 7: {//образ
  461. cout << ImageOperation(first)<<endl;
  462. break;
  463. }
  464. case 8: {//прообраз
  465. cout <<PrototypeOperation(first)<<endl;
  466. break;
  467. }
  468. case 9: {//продолжение
  469. Continuation(first);
  470. break;
  471. }
  472. case 10: {//сужение
  473. cout << Narrowing(first)<<endl;
  474. break;
  475. }
  476. case 0: {//операция выхода
  477. return 0;
  478. }
  479. default: {
  480. cout << "Вы ввели неправильную команду\n";
  481. break;
  482. }
  483. }
  484. }
  485. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement