Advertisement
dxvmxnd

Untitled

Nov 24th, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <set>
  4. #include <algorithm>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int readInt() {
  10. int number;
  11. bool isNotCorrect;
  12.  
  13. number = 0;
  14.  
  15. do {
  16. isNotCorrect = false;
  17. cin >> number;
  18. if (cin.fail()) {
  19. cout << "Неверный ввод данных!" << endl;
  20. isNotCorrect = true;
  21. cin.clear();
  22. while (cin.get() != '\n');
  23. }
  24. } while (isNotCorrect);
  25.  
  26. return number;
  27. }
  28.  
  29. set<int> intersection(set<int> set1, set<int> set2) {
  30. set<int> y;
  31.  
  32. set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(y, y.begin()));
  33.  
  34. return y;
  35. }
  36.  
  37. void writeNumbersMultiple3(set<int> a) {
  38. bool flag;
  39.  
  40. flag = false;
  41. cout << "Элементы множества Y, которые кратны 3: " << endl;
  42.  
  43. for (int i : a) {
  44. if (i % 3 == 0) {
  45. cout << i << " ";
  46. flag = true;
  47. }
  48. }
  49.  
  50. if (!flag) {
  51. cout << "Таких элементов нет!" << endl;
  52. }
  53. }
  54.  
  55. bool isSubset(set<int> subset, set<int> set1) {
  56. bool isCorrect;
  57. set<int> someSet;
  58.  
  59. set_intersection(set1.begin(), set1.end(), subset.begin(), subset.end(),inserter(someSet, someSet.begin()));
  60. isCorrect = ((someSet == subset) && !subset.empty());
  61.  
  62. return isCorrect;
  63. }
  64.  
  65. bool valueRange(int input, int inputType) {
  66. int minValue, maxValue;
  67. bool isCorrect;
  68.  
  69. minValue = 1;
  70. maxValue = 255;
  71. isCorrect = true;
  72.  
  73. if ((input < minValue) or (input > maxValue)) {
  74. isCorrect = false;
  75. if (inputType == 1) {
  76. cout << "Элемент не попал в диапазон." << endl;
  77. }
  78. else {
  79. if (inputType == 2) {
  80. cout << "Размер не попал в диапазон." << endl;
  81. }
  82. }
  83. }
  84.  
  85. return isCorrect;
  86. }
  87.  
  88. int readSizeFromConsole(string forItem) {
  89. int size;
  90. bool isCorrect;
  91.  
  92. do {
  93. cout << "Введите размер множества " << forItem << endl;
  94. size = readInt();
  95. isCorrect = valueRange(size, 2);
  96.  
  97. } while (!isCorrect);
  98.  
  99. return size;
  100. }
  101.  
  102. set<int> createSetFromConsole(int size) {
  103. int element;
  104. bool isCorrect;
  105. set<int> someSet;
  106.  
  107. someSet = {};
  108. for (int i = 0; i < size; i++) {
  109. do {
  110.  
  111. cout << "Введите " << (i + 1) << " элемент множества: " << endl;
  112. element = readInt();
  113. isCorrect = valueRange(element, 1);
  114.  
  115. } while (!isCorrect);
  116.  
  117. someSet.insert(element);
  118. }
  119.  
  120. return someSet;
  121. }
  122.  
  123. int readConfiguration() {
  124. int configuration;
  125. bool isNotCorrect;
  126.  
  127. do {
  128. isNotCorrect = false;
  129. configuration = readInt();
  130. if ((configuration != 1) and (configuration != 2)) {
  131. cout << "Ошибка! Попробуйте еще раз." << endl;
  132. isNotCorrect = true;
  133. }
  134. } while (isNotCorrect);
  135.  
  136. return configuration;
  137. }
  138.  
  139. int readSizeFromFile(string path, int lineToRead) {
  140. int size;
  141. int number;
  142. bool isNotCorrect;
  143.  
  144. ifstream fin(path);
  145. isNotCorrect = false;
  146. size = 0;
  147.  
  148. cout << "Читаю размер " << lineToRead << " строки.." << endl;
  149. for (int i = 2; i = lineToRead; i++) {
  150. fin;
  151. }
  152.  
  153. while (!fin.eof()) {
  154. fin >> number;
  155. size++;
  156. }
  157.  
  158. if (fin.fail()) {
  159. isNotCorrect = true;
  160. cout << "Не получилось считать размер. Перепроверьте файл" << endl;
  161. }
  162.  
  163. fin.close();
  164.  
  165. if (isNotCorrect) {
  166. isNotCorrect = !valueRange(size, 2);
  167. }
  168. if (!isNotCorrect) {
  169. size = 0;
  170. }
  171.  
  172. return size;
  173.  
  174. }
  175.  
  176. set<int> readElementsFromFile(string path, int size, int lineToRead) {
  177. set<int> inputSet;
  178. bool isNotCorrect;
  179. int element;
  180.  
  181. ifstream fin(path);
  182. isNotCorrect = false;
  183. inputSet = {};
  184.  
  185. cout << "Читаю элементы " << lineToRead << " строки..." << endl;
  186.  
  187. for (int i = 2; i = lineToRead; i++) {
  188. fin;
  189. }
  190.  
  191. for (int i = 0; i < size; i++) {
  192. fin >> element;
  193.  
  194. if (fin.fail()) {
  195. isNotCorrect = true;
  196. cout << "Не удалось считать элементы. Перепроверьте файл." << endl;
  197. }
  198. else {
  199. inputSet.insert(element);
  200. isNotCorrect = !valueRange(element, 1);
  201. }
  202. }
  203.  
  204. fin.close();
  205.  
  206. if (isNotCorrect) {
  207. inputSet = {};
  208. }
  209.  
  210.  
  211. return inputSet;
  212. }
  213.  
  214. string findInputFile() {
  215. string filePath;
  216. bool isNotCorrect;
  217.  
  218. do {
  219. isNotCorrect = false;
  220. cout << "Введите путь к файлу с данными: " << endl;
  221. cin >> filePath;
  222.  
  223. ifstream fin(filePath);
  224. if (!fin.is_open()) {
  225. isNotCorrect = true;
  226. cout << "Файл по такому пути не найден." << endl;
  227. }
  228. else {
  229. if (!((filePath[size(filePath) - 1] == 't') and (filePath[size(filePath) - 2] == 'x') and (filePath[size(filePath) - 3] == 't') and (filePath[size(filePath) - 4] == '.'))) {
  230. isNotCorrect = true;
  231. cout << "Ошибка! Неправильный тип файла." << endl;
  232. }
  233. }
  234. } while (isNotCorrect);
  235.  
  236. cout << "Файл найден." << endl;
  237.  
  238. return filePath;
  239. }
  240.  
  241. string findOutputFile() {
  242. string path;
  243. bool isNotCorrect;
  244.  
  245. do {
  246. isNotCorrect = false;
  247. cout << "Введите путь к файлу вывода: " << endl;
  248. cin >> path;
  249.  
  250. ofstream fout(path);
  251. if (!fout.is_open()) {
  252. isNotCorrect = true;
  253. }
  254.  
  255. if (isNotCorrect or ((!((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))))) {
  256. isNotCorrect = true;
  257. cout << "Ошибка! Неправильный тип файла." << endl;
  258. }
  259. } while (isNotCorrect);
  260.  
  261. return path;
  262. }
  263.  
  264. set<int> createSetFromFile(string path, int lineToRead) {
  265. int size;
  266. set<int> someSet;
  267. bool isNotCorrect;
  268.  
  269. isNotCorrect = false;
  270. someSet = {};
  271.  
  272. size = readSizeFromFile(path, lineToRead);
  273. if (size == 0) {
  274. isNotCorrect = true;
  275. cout << "Проверьте строку " << lineToRead << endl;
  276. }
  277.  
  278. if (!isNotCorrect) {
  279. someSet = readElementsFromFile(path, size, lineToRead);
  280. if (someSet.empty()) {
  281. isNotCorrect = true;
  282. cout << "Проверьте строку " << lineToRead << endl;
  283. }
  284. }
  285.  
  286. return someSet;
  287. }
  288.  
  289. void writeAnswerToFile(string path, set<int> y, bool isSubset) {
  290. bool flag;
  291.  
  292. ofstream fout(path, fstream::app);
  293. if (fout.is_open()) {
  294. cout << "Файл открыт для записи!" << endl;
  295. fout << "Элементы множества Y, которые кратны 3:" << endl;
  296. if (!y.empty()) {
  297. for (int i : y) {
  298. fout << i << " ";
  299. }
  300. }
  301. else {
  302. cout << "Таких элементов нет.";
  303. }
  304.  
  305. if (isSubset) {
  306. fout << "Множетсво Х3 является подмножеством множества Y" << endl;
  307. }
  308. else {
  309. fout << "Множетсво Х3 является подмножеством множества Y" << endl;
  310. }
  311. }
  312. else {
  313. cout << "Ошибка открытия файла для записи!" << endl;
  314. }
  315.  
  316. fout.close();
  317.  
  318. cout << "Результат записан в файл." << endl;
  319. }
  320.  
  321. void writeAnswerToConsole(set<int> y, set<int> x3) {
  322. writeNumbersMultiple3(y);
  323. if (isSubset(x3, y)) {
  324. cout << "Множетсво Х3 является подмножеством множества Y" << endl;
  325. }
  326. else {
  327. cout << "Множетсво Х3 не является подмножеством множества Y" << endl;
  328. }
  329. }
  330.  
  331. void rules(int input) {
  332. cout << "Обратите внимание" << endl;
  333. if (input == 1) {
  334. cout << "Диапазон допустимых чисел = 1..255 включительно." << endl;
  335. }
  336. else {
  337. cout << "В файле читаются только 3 первые строки." << endl;
  338. cout << "Первая строка файла должна содержать множество Х1, вторая - Х2, третья - Х3." << endl;
  339. cout << "Все строки должны содержать только числа, без запятых, скобок и т.д." << endl << endl;
  340. cout << "Вот пример правильной записи в файл:" << endl;
  341. cout << "1 2 3 4" << endl;
  342. cout << "2 3" << endl;
  343. cout << "5 6 7 9" << endl;
  344. }
  345. }
  346.  
  347. void info() {
  348. cout << "Эта программа находит все элементы из пересечения множеств X1 и Х2, которые кратны 3" << endl;
  349. cout << "И выводит, является ли множество Х3 подмножеством пересечения Х1 и Х2." << endl;
  350. }
  351.  
  352. int main() {
  353. set<int> x1, x2, x3, y;
  354. int configuration;
  355. string path;
  356.  
  357. info();
  358. cout << "Введите 1, если хотите ввести данные с клавиатуры, 2, если с файла." << endl;
  359. configuration = readConfiguration();
  360. rules(configuration);
  361.  
  362. if (configuration == 1) {
  363. x1 = createSetFromConsole(readSizeFromConsole("X1"));
  364. x2 = createSetFromConsole(readSizeFromConsole("X2"));
  365. x3 = createSetFromConsole(readSizeFromConsole("X3"));
  366. }
  367. else {
  368. do {
  369. path = findOutputFile();
  370. x1 = createSetFromFile(path, 1);
  371. x2 = createSetFromFile(path, 2);
  372. x3 = createSetFromFile(path, 3);
  373.  
  374. } while ((x1.empty()) and (x2.empty()) and (x3.empty()));
  375. }
  376.  
  377. y = intersection(x1, x2);
  378.  
  379. cout << "Введите 1, если хотите вывести данные в консоль, 2, если в файл" << endl;
  380. configuration = readConfiguration();
  381.  
  382. if (configuration == 1) {
  383. writeAnswerToConsole(y, x3);
  384. }
  385. else {
  386. path = findOutputFile();
  387. writeAnswerToFile(path, y, isSubset(x3, y));
  388. }
  389.  
  390. return 0;
  391. }
  392.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement