ValeriaAVR

work24

Oct 31st, 2024
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. int const MIN_SIZE = 1;
  6. int const MAX_SIZE = 50;
  7. int const MIN_C = 1;
  8. int const MAX_C = 2;
  9. int const MIN_A = -1000;
  10. int const MAX_A = 1000;
  11.  
  12. int inputInteger(bool isIncorrect, const int MIN, const int MAX) {
  13. int n;
  14. n = 0;
  15. do {
  16. isIncorrect = false;
  17. cout << "Введите значение: " << endl;
  18. cin >> n;
  19. if (cin.fail()) {
  20. isIncorrect = true;
  21. cout << "Некорректный ввод." << endl;
  22. cin.clear();
  23. while (cin.get() != '\n');
  24. }
  25. if (!isIncorrect && (n < MIN || n > MAX)) {
  26. isIncorrect = true;
  27. cout << "Введите корректное значение." << endl;
  28. }
  29. if (!isIncorrect && cin.get() != '\n') {
  30. cout << "Введите корректное значение.";
  31. isIncorrect = true;
  32. cin.clear();
  33. while (cin.get() != '\n');
  34. cout << endl;
  35. }
  36. } while (isIncorrect);
  37. return n;
  38. }
  39.  
  40. void createArray(const int n, bool isIncorrect, int* arr) {
  41. for (int i = 0; i < n; i++) {
  42. do {
  43. cout << "Введите " << i + 1 << " элемент массива : " << endl;
  44. isIncorrect = false;
  45. cin >> arr[i];
  46. if (cin.fail()) {
  47. isIncorrect = true;
  48. cout << "Некорректный ввод. Введите число." << endl;
  49. cin.clear();
  50. while (cin.get() != '\n');
  51. }
  52. if (!isIncorrect && (arr[i] < MIN_A || arr[i] > MAX_A) || (i > 0 && arr[i] < arr[i - 1])) {
  53. isIncorrect = true;
  54. cout << "Массивы должны быть упорядочены по возрастанию. Диапазон значений А от " << MIN_A << " до " << MAX_A << "." << endl;
  55. }
  56. if (!isIncorrect && cin.get() != '\n') {
  57. cout << "Введите число. " << endl;
  58. isIncorrect = true;
  59. cin.clear();
  60. while (cin.get() != '\n');
  61. cout << endl;
  62. };
  63. } while (isIncorrect);
  64. }
  65. }
  66.  
  67.  
  68. bool isFileTxt(string path, bool isIncorrect) {
  69. return (path.length() >= 4 && path.substr(path.length() - 4) == ".txt");
  70. }
  71.  
  72. string takeFilePath(string path, bool isIncorrect) {
  73. do {
  74. isIncorrect = false;
  75. cout << "Введите относительный путь к файлу." << endl;
  76. cin >> path;
  77. fstream in(path);
  78. if (!isFileTxt(path, isIncorrect) || !in.is_open())
  79. {
  80. cout << "Проверьте нахождение файла по заданному пути." << endl;
  81. isIncorrect = true;
  82. }
  83. in.close();
  84. } while (isIncorrect);
  85. return path;
  86. }
  87.  
  88. bool isFileEmpty(bool isIncorrect, string path) {
  89. ifstream in(path);
  90. do {
  91. isIncorrect = false;
  92. if (!in.is_open()) {
  93. cout << "Ошибка открытия файла." << endl;
  94. isIncorrect = true;
  95. path = takeFilePath(path, isIncorrect);
  96. }
  97. } while (isIncorrect);
  98. return in.peek() == ifstream::traits_type::eof();
  99. }
  100.  
  101. int readSizeFromFileForArrA(int& n, string path, bool isIncorrect) {
  102. ifstream in(path);
  103. do {
  104. isIncorrect = false;
  105. if (!in.is_open()) {
  106. cout << "Ошибка открытия файла." << endl;
  107. isIncorrect = true;
  108. path = takeFilePath(path, isIncorrect);
  109. }
  110. else if (isFileEmpty(isIncorrect, path)) {
  111. cout << "Файл пустой." << endl;
  112. isIncorrect = true;
  113. path = takeFilePath(path, isIncorrect);
  114. }
  115. else {
  116. do {
  117. isIncorrect = false;
  118. in >> n;
  119. if (!isIncorrect && (n < MIN_SIZE || n > MAX_SIZE)) {
  120. isIncorrect = true;
  121. cout << "Размер массива должен быть в диапазоне от " << MIN_SIZE << " до " << MAX_SIZE << "." << endl;
  122. path = takeFilePath(path, isIncorrect);
  123. n = readSizeFromFileForArrA(n, path, isIncorrect);
  124. }
  125. } while (isIncorrect);
  126.  
  127. }
  128. } while (isIncorrect);
  129. in.close();
  130. return n;
  131. }
  132.  
  133. int readSizeFromFileForArrB(int& n, string path, bool isIncorrect) {
  134. string str;
  135. str = "";
  136. ifstream in(path);
  137. getline(in, str);
  138. do {
  139. isIncorrect = false;
  140. if (!in.is_open()) {
  141. cout << "Ошибка открытия файла." << endl;
  142. isIncorrect = true;
  143. path = takeFilePath(path, isIncorrect);
  144. }
  145. else if (isFileEmpty(isIncorrect, path)) {
  146. cout << "Файл пустой." << endl;
  147. isIncorrect = true;
  148. path = takeFilePath(path, isIncorrect);
  149. }
  150. else {
  151. do {
  152. isIncorrect = false;
  153. in >> n;
  154. if (!isIncorrect && (n < MIN_SIZE || n > MAX_SIZE)) {
  155. isIncorrect = true;
  156. cout << "Размер массива должен быть в диапазоне от " << MIN_SIZE << " до " << MAX_SIZE << "." << endl;
  157. path = takeFilePath(path, isIncorrect);
  158. n = readSizeFromFileForArrB(n, path, isIncorrect);
  159. }
  160. } while (isIncorrect);
  161.  
  162. }
  163. } while (isIncorrect);
  164. in.close();
  165. return n;
  166. }
  167.  
  168. void readArrAFromFile(int n, int*& arrA, string path, bool isIncorrect) {
  169. string str;
  170. str = "";
  171. ifstream in(path);
  172. getline(in, str);
  173. getline(in, str);
  174. do {
  175. isIncorrect = false;
  176. for (int i = 0; i < n; i++) {
  177. in >> arrA[i];
  178. if (!isIncorrect && (arrA[i] < MIN_A || arrA[i] > MAX_A)) {
  179. isIncorrect = true;
  180. }
  181. }
  182. if (isIncorrect) {
  183. cout << "Диапазон значений элементов от " << MIN_A << " до " << MAX_A << endl;
  184. path = takeFilePath(path, isIncorrect);
  185. n = readSizeFromFileForArrA(n, path, isIncorrect);
  186. readArrAFromFile(n, arrA, path, isIncorrect);
  187. }
  188. } while (isIncorrect);
  189. in.close();
  190. }
  191.  
  192.  
  193. void readArrBFromFile(int n, int*& arrB, string path, bool isIncorrect) {
  194. string str;
  195. str = "";
  196. ifstream in(path);
  197. getline(in, str);
  198. getline(in, str);
  199. getline(in, str);
  200. do {
  201. isIncorrect = false;
  202. for (int i = 0; i < n; i++) {
  203. in >> arrB[i];
  204. if (!isIncorrect && (arrB[i] < MIN_A || arrB[i] > MAX_A)) {
  205. isIncorrect = true;
  206. }
  207. }
  208. if (isIncorrect) {
  209. cout << "Диапазон значений элементов от " << MIN_A << " до " << MAX_A << endl;
  210. path = takeFilePath(path, isIncorrect);
  211. n = readSizeFromFileForArrA(n, path, isIncorrect);
  212. readArrAFromFile(n, arrB, path, isIncorrect);
  213. }
  214. } while (isIncorrect);
  215. in.close();
  216. }
  217.  
  218. int сountSizeOfArrC(int*& arrA, int sizeA, int*& arrB, int sizeB) {
  219. int count = 0;
  220. int j = 0;
  221.  
  222. for (int i = 0; i < sizeA; ++i) {
  223. if (i == 0 || arrA[i] != arrA[i - 1]) {
  224. while (j < sizeB && arrB[j] < arrA[i]) {
  225. if (j == 0 || arrB[j] != arrB[j - 1]) {
  226. ++count;
  227. }
  228. ++j;
  229. }
  230. if (j >= sizeB || arrA[i] != arrB[j]) {
  231. ++count;
  232. }
  233. }
  234. }
  235.  
  236. for (j = j; j < sizeB; ++j) {
  237. if (j == 0 || arrB[j] != arrB[j - 1]) {
  238. ++count;
  239. }
  240. }
  241.  
  242. return count;
  243. }
  244.  
  245. void mergeArrays(int* arrA, int sizeA, int* arrB, int sizeB, int* arrC, int k) {
  246. int index = 0;
  247. int i = 0;
  248. int j = 0;
  249.  
  250. while (i < sizeA && j < sizeB && index < k) {
  251. if (arrA[i] < arrB[j]) {
  252. if (index == 0 || (arrC[index - 1] != arrA[i])){
  253. arrC[index] = arrA[i];
  254. ++index;
  255. }
  256. ++i;
  257. }
  258. else if (arrA[i] > arrB[j]) {
  259. if (index == 0 || arrC[index - 1] != arrB[j]) {
  260. arrC[index] = arrB[j];
  261. ++index;
  262. }
  263. ++j;
  264. }
  265. else {
  266. if (index == 0 || arrC[index - 1] != arrA[i]) {
  267. arrC[index] = arrA[i];
  268. ++index;
  269. }
  270. ++i;
  271. ++j;
  272. }
  273. }
  274. while (i < sizeA && index < k) {
  275. if (index == 0 || arrC[index - 1] != arrA[i]) {
  276. arrC[index] = arrA[i];
  277. ++index;
  278. }
  279. ++i;
  280. }
  281. while (j < sizeB && index < k) {
  282. if (index == 0 || arrC[index - 1] != arrB[j]) {
  283. arrC[index] = arrB[j];
  284. ++index;
  285. }
  286. ++j;
  287. }
  288. }
  289.  
  290. void printToConsole(int* arr, int n) {
  291. for (int i = 0; i < n; i++) {
  292. cout << arr[i] << "\t";
  293. }
  294. cout << "\n";
  295. }
  296.  
  297. void printToFile(int* arr, string path, bool isIncorrect, const int n) {
  298. ofstream in(path);
  299. do {
  300. isIncorrect = false;
  301. if (!in.is_open()) {
  302. cout << "Файл невозможно открыть для записи." << endl;
  303. isIncorrect = true;
  304. path = takeFilePath(path, isIncorrect);
  305. }
  306. } while (isIncorrect);
  307. for (int i = 0; i < n; i++) {
  308. in << arr[i] << "\t";
  309. }
  310. in.close();
  311. cout << "Результат выведен в файле.";
  312. }
  313.  
  314. int main() {
  315. setlocale(LC_ALL, "RU");
  316. int n;
  317. int m;
  318. int k;
  319. int choice;
  320. bool isIncorrect;
  321. string path;
  322. int* arrA = nullptr;
  323. int* arrB = nullptr;
  324. int* arrC = nullptr;
  325. n = 0;
  326. m = 0;
  327. choice = 0;
  328. isIncorrect = true;
  329. path = "";
  330. cout << "Данная программа выполняет слияние двух упорядоченных по возрастанию массивов целых чисел в один упорядоченный массив (без повторений)." << endl <<
  331. "Диапазон размеров массивов : " << MIN_SIZE << "..." << MAX_SIZE << endl << "Диапазон для значений элементов массива : " << MIN_A <<
  332. "..." << MAX_A << endl << "При работе с файлом в нём сначала должны быть прописаны размеры массивов, а затем сами массивы." <<
  333. "Откуда Вы хотите вводить данные ? " << "1 - консоль, 2 - файл." << endl;
  334. choice = inputInteger(isIncorrect, MIN_C, MAX_C);
  335. if (choice == 1) {
  336. cout << "Введите размер массива А. " << endl;
  337. n = inputInteger(isIncorrect, MIN_SIZE, MAX_SIZE);
  338. arrA = new int[n];
  339. createArray(n, isIncorrect, arrA);
  340. cout << "Введите размер массива В. " << endl;
  341. m = inputInteger(isIncorrect, MIN_SIZE, MAX_SIZE);
  342. arrB = new int[m];
  343. createArray(m, isIncorrect, arrB);
  344. }
  345. else {
  346. path = takeFilePath(path, isIncorrect);
  347. n = readSizeFromFileForArrB(n, path, isIncorrect);
  348. arrA = new int[n];
  349. readArrAFromFile(n, arrA, path, isIncorrect);
  350. m = readSizeFromFileForArrB(m, path, isIncorrect);
  351. arrB = new int[m];
  352. readArrBFromFile (m, arrB, path, isIncorrect);
  353. }
  354. k = сountSizeOfArrC(arrA, n, arrB, m);
  355. arrC = new int[k];
  356. mergeArrays(arrA, n, arrB, m, arrC, k);
  357. cout << "Куда Вы хотите вывести результат? 1 - консоль, 2 - файл." << endl;
  358. choice = inputInteger(isIncorrect, MIN_C, MAX_C);
  359. if (choice == 1) {
  360. printToConsole(arrC, k);
  361. }
  362. else {
  363. path = takeFilePath(path, isIncorrect);
  364. printToFile(arrC, path, isIncorrect, n);
  365. }
  366. delete[] arrA;
  367. delete[] arrB;
  368. delete[] arrC;
  369.  
  370. }
Advertisement
Add Comment
Please, Sign In to add comment