Advertisement
dxvmxnd

Untitled

Mar 2nd, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <cmath>
  5. #include <string>
  6.  
  7. using namespace std;
  8. int exceptionRead(int i) {
  9. bool isNotCorrect;
  10. int number;
  11.  
  12. number = 0;
  13. do {
  14. isNotCorrect = false;
  15. cout << "Введите " << (i + 1) << " элемент массива" << endl;
  16. cin >> number;
  17. if (cin.fail()) {
  18. isNotCorrect = true;
  19. cout << "Неверный ввод данных!" << endl;
  20. cin.clear();
  21. while (cin.get() != '\n');
  22. }
  23. } while (isNotCorrect);
  24.  
  25. return number;
  26. }
  27.  
  28. int inputSizeFromConsole() {
  29. bool isNotCorrect;
  30. int size;
  31.  
  32. do {
  33. isNotCorrect = false;
  34. cout << "Введите количество элементов в массиве: " << endl;
  35. cin >> size;
  36. if (cin.fail() or (size < 1)) {
  37. isNotCorrect = true;
  38. cout << "Неверный ввод данных!" << endl;
  39. cin.clear();
  40. while (cin.get() != '\n');
  41. }
  42. } while (isNotCorrect);
  43.  
  44. cout << "Количество элементов: " << size << endl;
  45. return size;
  46. }
  47.  
  48. void taskEssence() {
  49. setlocale(LC_ALL, "Rus");
  50. cout << "Данная программа сортирует массив методом подсчета." << endl;
  51. }
  52.  
  53. string pathChoice() {
  54. string path;
  55. bool isNotCorrect;
  56. do {
  57. isNotCorrect = false;
  58. cout << "Введите путь к файлу." << endl;
  59. cin >> path;
  60. ifstream fin(path);
  61. if (fin.is_open()) {
  62. cout << "Файл успешно открыт!" << endl;
  63. }
  64. else {
  65. cout << "Ошибка открытия файла" << endl;
  66. isNotCorrect = true;
  67. }
  68. fin.close();
  69. } while (isNotCorrect);
  70.  
  71.  
  72. return path;
  73. }
  74.  
  75. int inputSizeFromFile(const string& path) {
  76. int size;
  77. bool isNotCorrect;
  78.  
  79. ifstream fin(path);
  80. do {
  81. isNotCorrect = false;
  82. cout << "Ввод количества элементов массива..." << endl;
  83. fin >> size;
  84. if (fin.fail() or (size < 1)) {
  85. isNotCorrect = true;
  86. cout << "Данные введены неккоректно. Впишите данные с клавиатуры." << endl;
  87. fin.clear();
  88. while (fin.get() != '\n');
  89. size = inputSizeFromConsole();
  90. }
  91. } while (isNotCorrect);
  92. fin.close();
  93. cout << "Количество элементов массива: " << size << endl;
  94. return size;
  95. }
  96.  
  97. int* inputArrayFromFile(const string& path, int size, int* array) {
  98. ifstream fin(path);
  99. string line;
  100.  
  101. cout << "Запись матрицы..." << endl;
  102. std::getline(fin, line);
  103. for (int i = 0; i < size; i++) {
  104.  
  105.  
  106. fin >> array[i];
  107. if (fin.fail()) {
  108. cout << "Данные введены неккоректно. Введите значение с клавиатуры." << endl;
  109. fin.clear();
  110. while (fin.get() != ' ');
  111. array[i] = exceptionRead(i);
  112. }
  113.  
  114. }
  115. return array;
  116. }
  117.  
  118. int* sorting(int* arr, int n) {
  119.  
  120. int minVal;
  121. int maxVal;
  122. int range;
  123. int* count;
  124. int k;
  125.  
  126. minVal = arr[0];
  127. maxVal = arr[0];
  128.  
  129. for (int i = 1; i < n; i++) {
  130. if (arr[i] < minVal) {
  131. minVal = arr[i];
  132. }
  133. if (arr[i] > maxVal) {
  134. maxVal = arr[i];
  135. }
  136. }
  137.  
  138. range = maxVal - minVal + 1;
  139. count = new int[range];
  140. for (int i = 0; i < n; i++) {
  141. count[i] = 0;
  142. }
  143.  
  144. for (int i = 0; i < n; i++) {
  145. count[arr[i] - minVal]++;
  146. }
  147.  
  148. k = 0;
  149. for (int i = 0; i < range; i++) {
  150. for (int j = 0; j < count[i]; j++) {
  151. arr[k] = i + minVal;
  152. k++;
  153. }
  154. }
  155.  
  156. delete[] count;
  157.  
  158. return arr;
  159. }
  160.  
  161. void output(int* sortedArray, int size) {
  162. string path;
  163.  
  164. cout << "\nМассив чисел после сортировки методом подсчета: " << endl;
  165. for (int i = 0; i < size; i++) {
  166. cout << sortedArray[i] << " ";
  167. }
  168.  
  169. bool isNotCorrect;
  170. do {
  171. isNotCorrect = false;
  172. cout << "\nВведите путь к файлу для вывода." << endl;
  173. cin >> path;
  174. ofstream fout(path, fstream::app);
  175. if (fout.is_open()) {
  176. cout << "Файл успешно открыт!" << endl;
  177. fout << "Массив чисел после сортировки методом подсчета: " << endl;
  178. for (int i = 0; i < size; i++) {
  179. fout << sortedArray[i] << " ";
  180. }
  181. }
  182. else {
  183. cout << "Ошибка открытия файла" << endl;
  184. isNotCorrect = true;
  185. }
  186. fout.close();
  187. cout << "Ответ записан в файл." << endl;
  188.  
  189. } while (isNotCorrect);
  190.  
  191. delete[] sortedArray;
  192. }
  193.  
  194. int* inputFromFIle(int* array) {
  195. string path;
  196. int size;
  197. int* sortedArray;
  198.  
  199. cout << "При записи данных из файла, учтите, что на первой строке написано количество элементов массива, а далее с следующей строки через пробел сам массив" << endl;
  200. path = pathChoice();
  201. size = inputSizeFromFile(path);
  202. array = new int[size];
  203. array = inputArrayFromFile(path, size, array);
  204. sortedArray = sorting(array, size);
  205. output(sortedArray, size);
  206.  
  207.  
  208. return sortedArray;
  209. }
  210.  
  211. int* inputArrayFromConsole(int* array, int size) {
  212. bool isNotCorrect;
  213.  
  214. for (int i = 0; i < size; i++) {
  215. do {
  216. isNotCorrect = false;
  217. cout << "Введите " << (i + 1) << " элемент массива" << endl;
  218. cin >> array[i];
  219. if (cin.fail()) {
  220. isNotCorrect = true;
  221. cout << "Неверный ввод данных!" << endl;
  222. cin.clear();
  223. while (cin.get() != '\n');
  224. }
  225. } while (isNotCorrect);
  226. }
  227. return array;
  228. }
  229.  
  230. int* inputFromConsole(int* array) {
  231. int size;
  232. int* sortedArray;
  233.  
  234. sortedArray = 0;
  235. size = inputSizeFromConsole();
  236. array = new int[size];
  237. array = inputArrayFromConsole(array, size);
  238. sortedArray = sorting(array, size);
  239. output(sortedArray, size);
  240.  
  241. return sortedArray;
  242.  
  243. }
  244.  
  245. int* sourceChoice(int* array) {
  246. int choiceNumber;
  247. bool isNotCorrect;
  248. int* sortedArray;
  249.  
  250. cout << "Выберите, откуда будут выводиться данные: " << endl;
  251. do {
  252. isNotCorrect = false;
  253. cout << "Введите 0, если с консоли; введите 1, если с файла." << endl;
  254. cin >> choiceNumber;
  255. if (cin.fail() or ((choiceNumber != 0) and (choiceNumber != 1))) {
  256. isNotCorrect = true;
  257. cout << "Данные введены неккоректно" << endl;
  258. cin.clear();
  259. while (cin.get() != '\n');
  260. }
  261. } while (isNotCorrect);
  262.  
  263. if (choiceNumber == 0) {
  264. sortedArray = inputFromConsole(array);
  265. }
  266. else {
  267. sortedArray = inputFromFIle(array);
  268. }
  269.  
  270. return sortedArray;
  271. }
  272.  
  273. int main() {
  274. int* array;
  275. int* sortedArray;
  276.  
  277. array = nullptr;
  278. taskEssence();
  279. sortedArray = sourceChoice(array);
  280. delete[] array;
  281. }
  282.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement