Vanilla_Fury

laba_3_3_del

Dec 2nd, 2020
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.18 KB | None | 0 0
  1. program laba_3_3_del;
  2.  
  3. uses
  4. System.SysUtils,
  5. System.RegularExpressions;
  6.  
  7. type
  8. TArr = Array of Integer;
  9. TBuckets = Array of Array of Integer;
  10.  
  11. const
  12. MES_TASK = 'Пошаговая сортировка. Разработать алгоритм c методом пошаговой детализации и программу, реализующую этот алгоритм.';
  13. ERROR_FILE_NOT_FOUND = 'Файл не найден. ';
  14. MES_INPUT_OF_PATH = 'Пожалуйста, введите путь к файлу';
  15. MES_ASK_INPUT_METHOD = 'Откуда брать данные?' + #10#13 + '1 - из файла' + #10#13 + '2 - ввести вручную';
  16. MES_ASK_AGAIN_INPUT_METHOD = '"1" - повторить попытку.' + #10#13 + '"2" - ввести данные из консоли.';
  17. ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY = 'Файл не может быть прочитан или пуст. ';
  18. MES_ASK_OUTPUT_TO_FILE = 'Хотите вывести ответ в файл?' + #10#13 + '1 - да' + #10#13 + '2 - нет';
  19. ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED = 'Файл не может быть создан или открыт. ';
  20. ERROR_CHOICE_IS_INCORRECT = 'Надо ввести "1" или "2". ';
  21. ERROR_STRING_WITHOUT_NUMBERS = 'Введённая строка не содержит целые числа. ';
  22. ERROR_NO_NUMBERS_IN_STRING_IN_FILE = 'Первая строка в файле не содержит целые числа. ';
  23. ERROR_NUMBER_OUT_OF_RANGE = 'Одно или несколько чисел в строке выходят за рамки допустимых значений. ';
  24. ERROR_TOO_MANY_NUMBERS_IN_STRING = 'В строке слишком много чисел. ';
  25. MES_INPUT_REQUEST = 'Введите строку с числами через пробел:';
  26. MES_TRY_AGAIN = 'Повторите попытку:';
  27. SYS_IP_METHOD_FILE = 'FromFile';
  28. SYS_IP_METHOD_CONS = 'FromConsole';
  29. SYS_OP_TO_FILE_YES = 'Output to file';
  30. SYS_OP_TO_FILE_NO = 'Don''t output to file';
  31. MIN_NUMBER = -1000000;
  32. MAX_NUMBER = 1000000;
  33. MAX_QUANTITY_OF_NUMBERS = 10000;
  34. SPACE = ' ';
  35. END_OF_ROW = #10;
  36. NEW_ROW = #13;
  37.  
  38. function Choose(SChoice1: String; SChoice2: String; SQuestion: String) : String;
  39. var
  40. NChoice: ShortInt;
  41. BIsCorrect: Boolean;
  42. SAnswer: String;
  43.  
  44. begin
  45. NChoice := 2;
  46.  
  47. writeln(SQuestion, END_OF_ROW + NEW_ROW + 'Ваш выбор: ');
  48. repeat
  49. BIsCorrect := true;
  50. try
  51. readln(NChoice);
  52. except
  53. BIsCorrect := false;
  54. end;
  55. if (BIsCorrect and (NChoice <> 1) and (NChoice <> 2)) then
  56. BIsCorrect := false;
  57. if (not BIsCorrect) then
  58. writeln(ERROR_CHOICE_IS_INCORRECT, MES_TRY_AGAIN);
  59. until (BIsCorrect);
  60. if (NChoice = 1) then
  61. SAnswer := SChoice1
  62. else
  63. SAnswer := SChoice2;
  64.  
  65. Choose := SAnswer;
  66. end;
  67.  
  68. function InputPathToFile(BIsInput: Boolean) : String;
  69. var
  70. SPartOfText, SPath: String;
  71. begin
  72. if (BIsInput) then
  73. SPartOfText := 'ввода'
  74. else
  75. SPartOfText := 'вывода';
  76.  
  77. writeln('Пожалуйста, введите путь к файлу ', SPartOfText, ': ');
  78. readln(SPath);
  79. InputPathToFile := SPath;
  80. end;
  81.  
  82. function FindNumbersInString(SInput: String) : TArr;
  83. var
  84. AArr: TArr;
  85. RegEx: TRegEx;
  86. MatchCollection: TMatchCollection;
  87. i: Integer;
  88.  
  89. begin
  90. RegEx := TRegEx.Create('\b-?[0-9]+\b');
  91. MatchCollection := RegEx.Matches(SInput);
  92.  
  93. SetLength(AArr, MatchCollection.Count);
  94. for i := 0 to MatchCollection.Count - 1 do
  95. AArr[i] := StrToInt(MatchCollection.Item[i].Value);
  96. FindNumbersInString := AArr;
  97. end;
  98.  
  99. function ChechForErrorsInArrFromFile(AArr: TArr) : ShortInt;
  100. var
  101. i: Integer;
  102. MyError: ShortInt;
  103.  
  104. begin
  105. MyError := 0;
  106. if (Length(AArr) < 1) then
  107. MyError := 3
  108. else
  109. if (Length(AArr) > MAX_QUANTITY_OF_NUMBERS) then
  110. MyError := 4;
  111. if (MyError = 0) then
  112. begin
  113. i := 0;
  114. while ((i < Length(AArr)) and (MyError = 0)) do
  115. begin
  116. if ((AArr[i] < MIN_NUMBER) or (AArr[i] > MAX_NUMBER)) then
  117. MyError := 5;
  118. end;
  119. end;
  120. end;
  121.  
  122. function ReadArrFromFile(SPathToFile: String; var MyError: ShortInt) : TArr;
  123. var
  124. FInput: TextFile;
  125. SInput: String;
  126. AInput: TArr;
  127.  
  128. begin
  129. SInput := '';
  130. if (FileExists(SPathToFile)) then
  131. try
  132. AssignFile(FInput, SPathToFile);
  133. Reset(FInput);
  134. except
  135. MyError := 1;
  136. end
  137. else
  138. MyError := 1;
  139. if (MyError = 0) then
  140. begin
  141. if (Eof(FInput)) then
  142. MyError := 2
  143. else
  144. readln(FInput, SInput);
  145. CloseFile(FInput);
  146. end;
  147.  
  148. AInput := FindNumbersInString(SInput);
  149.  
  150.  
  151. ReadArrFromFile := AInput;
  152. end;
  153.  
  154. procedure ChechForErrorsInArrFromConsole(AInput: TArr; var BIsCorrect: Boolean);
  155. var
  156. i: Integer;
  157.  
  158. begin
  159. if (Length(AInput) < 1) then
  160. begin
  161. writeln(ERROR_STRING_WITHOUT_NUMBERS, MES_TRY_AGAIN);
  162. BIsCorrect := false;
  163. end
  164. else
  165. if (Length(AInput) > MAX_QUANTITY_OF_NUMBERS) then
  166. begin
  167. writeln(ERROR_TOO_MANY_NUMBERS_IN_STRING, MES_TRY_AGAIN);
  168. BIsCorrect := false;
  169. end;
  170. if (BIsCorrect) then
  171. begin
  172. i := 0;
  173. while ((i < Length(AInput)) and BIsCorrect) do
  174. begin
  175. if ((AInput[i] < MIN_NUMBER) or (AInput[i] > MAX_NUMBER)) then
  176. begin
  177. writeln(ERROR_NUMBER_OUT_OF_RANGE, MES_TRY_AGAIN);
  178. BIsCorrect := false;
  179. end;
  180. Inc(i);
  181. end;
  182. end;
  183. end;
  184.  
  185. function ReadArrFromConsole() : TArr;
  186. var
  187. AInput: TArr;
  188. SInput: String;
  189. BIsCorrect: Boolean;
  190. i: Integer;
  191.  
  192. begin
  193. writeln(MES_INPUT_REQUEST);
  194. repeat
  195. readln(SInput);
  196. AInput := FindNumbersInString(SInput);
  197. BIsCorrect := true;
  198. ChechForErrorsInArrFromConsole(AInput, BIsCorrect);
  199. until (BIsCorrect);
  200.  
  201. readArrFromConsole := AInput;
  202. end;
  203.  
  204. function GetInput() : TArr;
  205. var
  206. SInputMethod, SPathToFile: String;
  207. BInputIsDone: Boolean;
  208. MyError: ShortInt;
  209. AInput: TArr;
  210. Num: Integer;
  211.  
  212. begin
  213. BInputIsDone := false;
  214.  
  215. SInputMethod := Choose(SYS_IP_METHOD_FILE, SYS_IP_METHOD_CONS, MES_ASK_INPUT_METHOD);
  216.  
  217. repeat
  218. if (SInputMethod = SYS_IP_METHOD_FILE) then
  219. begin
  220. MyError := 0;
  221. SPathToFile := InputPathToFile(true);
  222.  
  223. AInput := ReadArrFromFile(SPathToFile, MyError);
  224. if (MyError > 0) then
  225. begin
  226. case MyError of
  227. 1: writeln(ERROR_FILE_NOT_FOUND, MES_TRY_AGAIN);
  228. 2: writeln(ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY, MES_TRY_AGAIN);
  229. 3: writeln(ERROR_NO_NUMBERS_IN_STRING_IN_FILE, MES_TRY_AGAIN);
  230. 4: writeln(ERROR_TOO_MANY_NUMBERS_IN_STRING, MES_TRY_AGAIN);
  231. 5: writeln(ERROR_NUMBER_OUT_OF_RANGE, MES_TRY_AGAIN);
  232. end;
  233. SInputMethod := choose(SYS_IP_METHOD_FILE, SYS_IP_METHOD_CONS, MES_ASK_AGAIN_INPUT_METHOD);
  234. end
  235. else
  236. BInputIsDone := true;
  237. end
  238. else
  239. begin
  240. AInput := ReadArrFromConsole();
  241. BInputIsDone := true;
  242. end
  243. until (BInputIsDone);
  244.  
  245. writeln('На входе:');
  246. for Num in AInput do
  247. write(Num, Space);
  248. writeln;
  249. writeln;
  250.  
  251. GetInput := AInput;
  252. end;
  253.  
  254. function SplitInputBetweenLists(AInput: TArr; NDivisor: Integer; var ArrBuckets: TBuckets; NBITNESS: ShortInt) : Boolean;
  255. var
  256. Temp, Num, Index: Integer;
  257. FlStillWorking: Boolean;
  258.  
  259. begin
  260. FlStillWorking := false;
  261.  
  262. for Num in AInput do
  263. begin
  264. Temp := Num div NDivisor;
  265. Index := Temp mod NBitness;
  266. SetLength(ArrBuckets[Index], Length(ArrBuckets[Index]) + 1);
  267. ArrBuckets[Index][High(ArrBuckets[Index])] := Num;
  268. if ((not FlStillWorking) and (Temp > 0)) then
  269. FlStillWorking := true;
  270. end;
  271.  
  272. SplitInputBetweenLists := FlStillWorking;
  273. end;
  274.  
  275. function LsdSort(AInput: TArr) : TArr;
  276. const
  277. NBITNESS = 10; // разрядность
  278.  
  279. var
  280. i, j, NDivisor, Num: Integer;
  281. FlStillWorking: Boolean;
  282. ArrBuckets: TBuckets;
  283.  
  284. Begin
  285. FlStillWorking := true;
  286. NDivisor := 1;
  287. SetLength(ArrBuckets, NBITNESS);
  288.  
  289. for i := 0 to High(ArrBuckets) do
  290. Setlength(ArrBuckets[i], 0);
  291.  
  292. while (FlStillWorking) do
  293. begin
  294. FlStillWorking := SplitInputBetweenLists(AInput, NDivisor, ArrBuckets, NBITNESS);
  295.  
  296. // moving lists back into input array
  297. i := 0;
  298. for j := 0 to NBITNESS - 1 do
  299. begin
  300. for Num in ArrBuckets[j] do
  301. begin
  302. aInput[i] := Num;
  303. write(Num, Space);
  304. Inc(i);
  305. end;
  306.  
  307. Setlength(ArrBuckets[j], 0); //clear ArrBuckets
  308. end;
  309. writeln;
  310.  
  311. NDivisor := NDivisor * NBITNESS;
  312. end;
  313. end;
  314.  
  315. procedure OutputToFile(AArr: TArr; SPathToFIle: String);
  316. var
  317. BOutputReady: Boolean;
  318. FOutput: TextFile;
  319. i: Integer;
  320.  
  321. begin
  322. BOutputReady := false;
  323. repeat
  324. try
  325. AssignFile(FOutput, SPathToFIle);
  326. Rewrite(FOutput);
  327. for i := 0 to High(AArr) do
  328. write(FOutput, AArr[i], SPACE);
  329. CloseFile(FOutput);
  330. BOutputReady := true;
  331. except
  332. writeln(ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED);
  333. end;
  334. until (bOutputReady);
  335. end;
  336.  
  337. procedure OutputAnswer(AArr: TArr);
  338. var
  339. SShouldOutputInfoToFile, SPathToFile: String;
  340. BOutputIsReady: Boolean;
  341. i: Integer;
  342.  
  343. begin
  344. writeln;
  345. writeln('Ответ:');
  346. for i := 0 to High(AArr) do
  347. write(AArr[i], SPACE);
  348. writeln;
  349.  
  350. repeat
  351. BOutputIsReady := true;
  352. SShouldOutputInfoToFile := Choose(SYS_OP_TO_FILE_YES, SYS_OP_TO_FILE_NO, MES_ASK_OUTPUT_TO_FILE);
  353.  
  354. if (SShouldOutputInfoToFile = SYS_OP_TO_FILE_YES) then
  355. begin
  356. SPathToFile := InputPathToFile(false);
  357. if (FileExists(SPathToFile)) then
  358. OutputToFile(AArr, SPathToFile)
  359. else
  360. begin
  361. BOutputIsReady := false;
  362. writeln(ERROR_FILE_NOT_FOUND);
  363. end;
  364. end;
  365. until (BOutputIsReady);
  366. end;
  367.  
  368. var
  369. SInput: String;
  370. AArr: TArr;
  371. Num: Integer;
  372.  
  373. begin
  374. writeln(MES_TASK);
  375. // Путь к моему файлу ввода: C:\Users\Aleksandr\Desktop\input.txt
  376. // Путь к моему файлу вывода: C:\Users\Aleksandr\Desktop\output.txt
  377.  
  378. AArr := GetInput();
  379. LsdSort(AArr);
  380. OutputAnswer(AArr);
  381.  
  382. readln;
  383. end.
  384.  
Advertisement
Add Comment
Please, Sign In to add comment