Vanilla_Fury

laba_3_2_del

Nov 22nd, 2020
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. program laba_3_2_del;
  2.  
  3. uses
  4. System.SysUtils,
  5. System.RegularExpressions;
  6.  
  7. type
  8. TSet = Set of Byte;
  9.  
  10. const
  11. MES_TASK = 'Дана непустая последовательность символов, требуется построить и напечатать ' +
  12. 'множество, элементами которого являются встречающиеся в последовательности знаки арифметических операций и нечётные цифры.';
  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".' + #10#13 + 'Повторите попытку: ';
  21. ERROR_EMPTY_STRING = 'Обнаружена пустая строка. ';
  22. MES_NO_APPROPRIATE_CHARS_FOUND = 'Нет ни одного подходящего под описание символа';
  23. SPACE = ' ';
  24. END_OF_ROW = #10;
  25. NEW_ROW = #13;
  26.  
  27. function Choose(SChoice1: String; SChoice2: String; SQuestion: String) : String;
  28. var
  29. NChoice: ShortInt;
  30. BIsCorrect: Boolean;
  31. SAnswer: String;
  32.  
  33. begin
  34. NChoice := 2;
  35.  
  36. writeln(sQuestion, END_OF_ROW + NEW_ROW + 'Ваш выбор: ');
  37. repeat
  38. BIsCorrect := true;
  39. try
  40. readln(NChoice);
  41. except
  42. BIsCorrect := false;
  43. end;
  44. if (BIsCorrect and (nChoice <> 1) and (nChoice <> 2)) then
  45. BIsCorrect := false;
  46. if (not BIsCorrect) then
  47. writeln(ERROR_CHOICE_IS_INCORRECT);
  48. until (BIsCorrect);
  49. if (NChoice = 1) then
  50. SAnswer := sChoice1
  51. else
  52. SAnswer := sChoice2;
  53.  
  54. Choose := SAnswer;
  55. end;
  56.  
  57. function InputPathToFile(IsInput: Boolean) : String;
  58. var
  59. SPartOfText, SPath: String;
  60. begin
  61. if (IsInput) then
  62. SPartOfText := 'ввода'
  63. else
  64. SPartOfText := 'вывода';
  65.  
  66. writeln('Пожалуйста, введите путь к файлу ', SPartOfText, ': ');
  67. readln(SPath);
  68. InputPathToFile := SPath;
  69. end;
  70.  
  71. function ReadStringFromFile(SPathToFile: String; var MyError: ShortInt) : String;
  72. var
  73. FInput: TextFile;
  74. SInput: String;
  75.  
  76. begin
  77. SInput := '';
  78. if (FileExists(SPathToFile)) then
  79. try
  80. AssignFile(FInput, SPathToFile);
  81. Reset(FInput);
  82. except
  83. MyError := 1;
  84. end
  85. else
  86. MyError := 1;
  87. if (MyError = 0) then
  88. begin
  89. if (Eof(FInput)) then
  90. MyError := 2
  91. else
  92. begin
  93. readln(FInput, SInput);
  94. end;
  95. CloseFile(FInput);
  96. end;
  97. ReadStringFromFile := SInput;
  98. end;
  99.  
  100. function ReadStringFromConsole() : String;
  101. var
  102. SInput: String;
  103.  
  104. begin
  105. writeln('Введите строку:');
  106. readln(SInput);
  107.  
  108. readStringFromConsole := SInput;
  109. end;
  110.  
  111. function GetInput() : String;
  112. var
  113. SInput, SInputMethod, SPathToFile: String;
  114. BInputIsDone: Boolean;
  115. MyError: ShortInt;
  116.  
  117. begin
  118. SInput := '';
  119. BInputIsDone := false;
  120.  
  121. SInputMethod := Choose('FromFile', 'FromConsole', MES_ASK_INPUT_METHOD);
  122.  
  123. repeat
  124. if (SInputMethod = 'FromFile') then
  125. begin
  126. MyError := 0;
  127. SPathToFile := InputPathToFile(true);
  128.  
  129. SInput := ReadStringFromFile(SPathToFile, MyError);
  130. if (MyError > 0) then
  131. begin
  132. case MyError of
  133. 1: writeln(ERROR_FILE_NOT_FOUND);
  134. 2: writeln(ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY);
  135. end;
  136. SInputMethod := choose('FromFile', 'FromConsole', MES_ASK_AGAIN_INPUT_METHOD);
  137. end
  138. else
  139. BInputIsDone := true;
  140. end
  141. else
  142. begin
  143. SInput := ReadStringFromConsole();
  144. BInputIsDone := true;
  145. end
  146. until (BInputIsDone);
  147.  
  148. GetInput := SInput;
  149. end;
  150.  
  151. function ComputeAns(SInput: String) : TSet;
  152. var
  153. SetSet: TSet;
  154. RegEx: TRegEx;
  155. MatchCollection: TMatchCollection;
  156. i: Integer;
  157. SOneChar: String;
  158. ChChar: Char;
  159.  
  160. begin
  161. SetSet := [];
  162. RegEx := TRegEx.Create('[13579+*/-]');
  163. MatchCollection := RegEx.Matches(SInput);
  164.  
  165. for i := 0 to MatchCollection.Count - 1 do
  166. begin
  167. SOneChar := MatchCollection.Item[i].Value;
  168. ChChar := SOneChar[1];
  169. Include(SetSet, Ord(ChChar));
  170. end;
  171. ComputeAns := SetSet;
  172. end;
  173.  
  174. procedure OutputToFile(SetSet: TSet; SPathToFIle: String);
  175. var
  176. BOutputNotReady: Boolean;
  177. FOutput: TextFile;
  178. i: Integer;
  179.  
  180. begin
  181. BOutputNotReady := true;
  182. repeat
  183. try
  184. AssignFile(FOutput, SPathToFIle);
  185. Rewrite(FOutput);
  186. for i := 0 to 255 do
  187. if (i in SetSet) then
  188. write(FOutput, Chr(i), SPACE);
  189. CloseFile(FOutput);
  190. BOutputNotReady := false;
  191. except
  192. writeln(ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED);
  193. end;
  194.  
  195. until (bOutputNotReady);
  196. end;
  197.  
  198. procedure OutputAnswer(SetSet: TSet);
  199. var
  200. SShouldOutputInfoToFile, SPathToFile: String;
  201. BOutputIsReady: Boolean;
  202. i: Integer;
  203.  
  204. begin
  205. writeln('Ответ:');
  206. for i := 0 to 255 do
  207. if (i in SetSet) then
  208. write(Chr(i) + SPACE);
  209. writeln;
  210.  
  211. repeat
  212. BOutputIsReady := true;
  213. SShouldOutputInfoToFile := Choose('Output to file', 'Don''t output to file', MES_ASK_OUTPUT_TO_FILE);
  214.  
  215. if (SShouldOutputInfoToFile = 'Output to file') then
  216. begin
  217. SPathToFile := InputPathToFile(false);
  218. if (FileExists(SPathToFile)) then
  219. OutputToFile(SetSet, SPathToFile)
  220. else
  221. begin
  222. BOutputIsReady := false;
  223. writeln(ERROR_FILE_NOT_FOUND);
  224. end;
  225. end;
  226. until (BOutputIsReady);
  227. end;
  228.  
  229. var
  230. SInput: String;
  231. SetSet: TSet;
  232.  
  233. begin
  234. writeln(MES_TASK);
  235. // Путь к моему файлу ввода: C:\Users\Aleksandr\Desktop\input.txt
  236. // Путь к моему файлу вывода: C:\Users\Aleksandr\Desktop\output.txt
  237. SInput := GetInput();
  238. SetSet := ComputeAns(SInput);
  239. OutputAnswer(SetSet);
  240. readln;
  241. end.
Advertisement
Add Comment
Please, Sign In to add comment