Advertisement
dxvmxnd

Untitled

Mar 2nd, 2024
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 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. void outputTask() {
  10. cout << "Данная программа формирует множество Y={X1 * X2* X3} и выделяет из него подмножество Y1, которое представляет все цифры,входящие в Y. Например, дано X1={‘s’, ‘v’, ‘e’, ‘t’, ‘a’,’ ‘2’}; X2={‘*’, ’-‘, ‘*’, ‘-‘}; X3={‘1’, ‘4’, ‘7’, ‘a’, ‘b’, ‘c’}." << endl;
  11. }
  12.  
  13. void outputSet(set<char> charSet, int i) {
  14. cout << "Введенное множество номер " << (i + 1) << " : " << endl;
  15. for (char elem : charSet) {
  16. cout << elem << " ";
  17. }
  18. }
  19.  
  20. set<char> convertToSet(string str) {
  21. set <char> charSet = {};
  22.  
  23. for (char elem : str) {
  24. charSet.insert(elem);
  25. }
  26.  
  27. return charSet;
  28. }
  29.  
  30. string inputStringFromConsole(int num) {
  31. string str;
  32. bool isCorrect;
  33. bool isNotCorrect;
  34.  
  35. do {
  36. isNotCorrect = false;
  37. cout << "Введите элементы " << (num + 1) << " множества в строку без пробелов." << endl;
  38. getline(cin, str);
  39.  
  40. isCorrect = true;
  41. for (int i = 0; i < size(str); i++) {
  42. if ((str[i] == ' ') and (isCorrect)) {
  43. isCorrect = false;
  44. }
  45. }
  46. if ((size(str) < 1) or (!isCorrect)) {
  47. cout << "Строка должна иметь хотя бы 1 символ и не иметь пробелы! Повторите попытку." << endl;
  48. isNotCorrect = true;
  49. }
  50. } while (isNotCorrect);
  51.  
  52.  
  53. return str;
  54. }
  55.  
  56. string inputStringFromFile(string path, int num) {
  57. string str;
  58. bool isCorrect;
  59.  
  60. ifstream fin(path);
  61.  
  62. cout << "Считывание множества номер " << (num + 1) << "..." << endl;
  63. for (int i = 0; i < num; i++) {
  64. fin >> str;
  65. }
  66. fin >> str;
  67. fin.close();
  68.  
  69. isCorrect = false;
  70. for (int i = 0; i < size(str); i++) {
  71. if ((str[i] != ' ') and (!isCorrect)) {
  72. isCorrect = true;
  73. }
  74. }
  75. if ((size(str) < 1) or (!isCorrect)) {
  76. cout << "Строка должна иметь хотя бы 1 символ и не иметь пробелы! Введите данные строки номер " << (num + 1) << " с клавиатуры." << endl;
  77. str = inputStringFromConsole(num);
  78. }
  79.  
  80. return str;
  81. }
  82.  
  83. string choicePath() {
  84. string path;
  85. bool isNotCorrect;
  86.  
  87. do {
  88. isNotCorrect = false;
  89. cout << "Введите путь файла: " << endl;
  90. cin >> path;
  91. ifstream fin(path);
  92. if (fin.is_open() and ((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))) {
  93. cout << "Файл успешно открыт!" << endl;
  94. }
  95. else {
  96. cout << "Ошибка открытия файла!" << endl;
  97. isNotCorrect = true;
  98. }
  99. fin.close();
  100. } while (isNotCorrect);
  101.  
  102. return path;
  103. }
  104.  
  105. set<char>* inputFromFile() {
  106. string path;
  107. string stringOfElements;
  108. set<char>* sets;
  109. set<char> charSet;
  110.  
  111. cout << "При вводе из файла учтите, что в файле элементы множества должны быть записаны в строку без пробелов(1 строка - 1 множество. 2 строка - 2 множество 3 строка - 3 множество)." << endl;
  112.  
  113. path = choicePath();
  114.  
  115. sets = new set<char>[3];
  116. for (int i = 0; i < 3; i++) {
  117. stringOfElements = inputStringFromFile(path, i);
  118. charSet = convertToSet(stringOfElements);
  119. sets[i] = charSet;
  120. outputSet(sets[i], i);
  121. }
  122.  
  123. return sets;
  124. }
  125.  
  126. set<char>* inputFromConsole() {
  127. set<char> charSet = {};
  128. set<char>* sets;
  129. string strOfElements;
  130.  
  131. sets = new set<char>[3];
  132. for (int i = 0; i < 3; i++) {
  133. strOfElements = inputStringFromConsole(i);
  134. charSet = convertToSet(strOfElements);
  135. sets[i] = charSet;
  136. outputSet(sets[i], i);
  137. }
  138.  
  139.  
  140. return sets;
  141. }
  142.  
  143. set<char>* choiceInput() {
  144. set<char>* sets;
  145. int choice;
  146. bool isNotCorrect;
  147.  
  148. do {
  149. isNotCorrect = false;
  150. cout << "Выберите, откуда будут вводиться данные. Введите 0, если с консоли; 1, если с файла" << endl;
  151. cin >> choice;
  152. if (cin.fail() or ((choice != 0) and (choice != 1))) {
  153. cout << "Неверный ввод данных!" << endl;
  154. isNotCorrect = true;
  155. cin.clear();
  156. while (cin.get() != '\n');
  157. }
  158. } while (isNotCorrect);
  159. if (choice == 0) {
  160. sets = inputFromConsole();
  161. }
  162. else {
  163. sets = inputFromFile();
  164. }
  165.  
  166.  
  167. return sets;
  168. }
  169.  
  170. set<char>* calculateSets(set<char>* sets) {
  171. set<char> symbols;
  172. set<char>* resultSets;
  173. set<char> charSet;
  174.  
  175. resultSets = new set<char>[2];
  176. resultSets[0] = {};
  177. resultSets[1] = {};
  178. symbols = {};
  179. for (char digit = '0'; digit <= '9'; ++digit) {
  180. symbols.insert(digit);
  181. }
  182.  
  183. set_intersection(sets[0].begin(), sets[0].end(), sets[1].begin(), sets[1].end(), inserter(charSet, charSet.begin()));
  184. set_intersection(sets[2].begin(), sets[2].end(), charSet.begin(), charSet.end(), inserter(resultSets[0], resultSets[0].begin()));
  185. set_intersection(resultSets[0].begin(), resultSets[0].end(), symbols.begin(), symbols.end(), inserter(resultSets[1], resultSets[1].begin()));
  186.  
  187.  
  188. return resultSets;
  189. }
  190.  
  191. void outputAnswer(set<char>* sets) {
  192. bool isNotCorrect;
  193. string path;
  194.  
  195. cout << "\nМножество Y = X1 * X2 * X3 = ";
  196. for (char elem : sets[0]) {
  197. cout << elem << " ";
  198. }
  199. cout << endl;
  200.  
  201. if (size(sets[1]) == 0) {
  202. cout << "\nЦифры не были встречены в подмножестве Y1!" << endl;
  203. }
  204. else {
  205. cout << "\nЦифры, встретившиеся в подмножестве Y1: " << endl;
  206. for (char elem : sets[1]) {
  207. cout << elem << " ";
  208. }
  209. }
  210. do {
  211. isNotCorrect = false;
  212. cout << "\nВведите путь файла для вывода: " << endl;
  213. cin >> path;
  214. ofstream fout(path, fstream::app);
  215. if ((fout.is_open()) and ((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))) {
  216. cout << "Файл успешно открыт!" << endl;
  217. fout.close();
  218. }
  219. else {
  220. cout << "Ошибка открытия файла" << endl;
  221. isNotCorrect = true;
  222. }
  223. } while (isNotCorrect);
  224.  
  225. ofstream fout(path, fstream::app);
  226.  
  227. fout << "Множество Y = X1 * X2 * X3 = ";
  228. for (char elem : sets[0]) {
  229. fout << elem << " ";
  230. }
  231. fout << endl;
  232.  
  233. if (size(sets[1]) == 0) {
  234. fout << "\nЦифры не были встречены в подмножестве Y1!" << endl;
  235. }
  236. else {
  237. fout << "\nЦифры, встретившиеся в подмножестве Y1: " << endl;
  238. for (char elem : sets[2]) {
  239. fout << elem << " ";
  240. }
  241. }
  242.  
  243. fout.close();
  244.  
  245.  
  246. cout << "Ответ записан в файл." << endl;
  247. }
  248.  
  249. int main() {
  250. setlocale(LC_ALL, "Rus");
  251. system("chcp 1251");
  252. set<char>* sets;
  253. set<char>* resultSets;
  254. resultSets = new set<char>[2];
  255.  
  256.  
  257. outputTask();
  258. sets = choiceInput();
  259. resultSets = calculateSets(sets);
  260. outputAnswer(resultSets);
  261.  
  262. return 0;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement