Advertisement
THOMAS_SHELBY_18

2_4 Delphi

Nov 3rd, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.72 KB | None | 0 0
  1. Program Lab2_4;
  2.  
  3. Uses
  4. System.SysUtils;
  5.  
  6. Type
  7. TArray = Array Of Integer;
  8.  
  9. Const
  10. MIN_ARR_LENGTH = 1;
  11. MAX_ARR_LENGTH = 20;
  12. MIN_ARR_VALUE = 1;
  13. MAX_ARR_VALUE = 100;
  14.  
  15. Function ReadNum(Min, Max: Integer): Integer;
  16. Var
  17. Num: Integer;
  18. IsCorrect: Boolean;
  19. Begin
  20. Repeat
  21. IsCorrect := True;
  22. Try
  23. Readln(Num);
  24. Except
  25. Write('Некорректный ввод! Введите значение еще раз: ');
  26. IsCorrect := False;
  27. End;
  28. If (IsCorrect) And ((Num < Min) Or (Num > Max)) Then
  29. Begin
  30. Write('Недопустимое значение! Введите значение еще раз: ');
  31. IsCorrect := False;
  32. End;
  33. Until (IsCorrect);
  34. ReadNum := Num;
  35. End;
  36. Function CheckFile(Path: String; Var Arr: TArray): Boolean;
  37. Var
  38. I, Buf, Length: Integer;
  39. IsFileCorrect: Boolean;
  40. InputFile: TextFile;
  41.  
  42. Begin
  43. IsFileCorrect := True;
  44.  
  45. If FileExists(Path) Then
  46. Begin
  47. AssignFile(InputFile, Path);
  48. Try
  49. Reset(InputFile);
  50. Except
  51. Writeln('Не удалось открыть файл');
  52. IsFileCorrect := False;
  53. End;
  54.  
  55. If IsFileCorrect Then
  56. Begin
  57. Try
  58. Read(InputFile, Length);
  59. Except
  60. Writeln('Длина массива введена некорректно!');
  61. IsFileCorrect := False;
  62. End;
  63.  
  64. If Not Eoln(InputFile) Or EoF(InputFile) Then
  65. Begin
  66. Writeln('В первой строке должна содержаться длина массива, во второй строке - все его элементы!');
  67. IsFileCorrect := False;
  68. End;
  69.  
  70. If IsFileCorrect And (Length < MIN_ARR_LENGTH) Or (Length > MAX_ARR_LENGTH) Then
  71. Begin
  72. Writeln('Введена длина массива, не входящая в диапазон допустимых значений!');
  73. IsFileCorrect := False;
  74. End;
  75.  
  76. SetLength(Arr, Length);
  77. I := 0;
  78.  
  79. While (IsFileCorrect And (I < Length)) Do
  80. Begin
  81. Try
  82. Read(InputFile, Buf);
  83. Except
  84. Writeln('Элементы массива введены некорректно!');
  85. IsFileCorrect := False;
  86. End;
  87.  
  88. If IsFileCorrect And Eoln(InputFile) And Not (I = High(Arr)) Then
  89. Begin
  90. Writeln('Все элементы массива должны быть записаны во второй строке!');
  91. IsFileCorrect := False;
  92. End;
  93.  
  94. If IsFileCorrect And (Buf < MIN_ARR_VALUE) Or (Buf > MAX_ARR_VALUE) Then
  95. Begin
  96. Writeln('Элементы массива не входят в диапазон допустимых значений!');
  97. IsFileCorrect := False;
  98. End;
  99.  
  100. Arr[I] := Buf;
  101. Inc(I);
  102. End;
  103.  
  104. If IsFileCorrect And Not EoF(InputFile) Then
  105. Begin
  106. Writeln('Данные в файле представлены в неправильном формате!');
  107. IsFileCorrect := False;
  108. End;
  109.  
  110. CloseFile(InputFile);
  111. End;
  112. End
  113. Else
  114. Begin
  115. Writeln('Файла по данному пути не существует!');
  116. IsFileCorrect := False;
  117. End;
  118. CheckFile := IsFileCorrect;
  119. End;
  120.  
  121. Procedure InputDataFromConsole(Var Arr: TArray);
  122. Var
  123. ArrayLength, I, Buf: Integer;
  124. Begin
  125. Writeln('Введите количесво элементов массива от ', MIN_ARR_LENGTH, ' до ', MAX_ARR_LENGTH, ': ');
  126. ArrayLength := ReadNum(MIN_ARR_LENGTH, MAX_ARR_LENGTH);
  127.  
  128. SetLength(Arr, ArrayLength);
  129.  
  130. Writeln('Введите элементы массива', #10#13, 'Каждый элемент массива - натуральное число от ', MIN_ARR_VALUE, ' до ', MAX_ARR_VALUE);
  131. For I := 0 To High(Arr) Do
  132. Begin
  133. Write('Введите элемент ', I + 1, ': ');
  134. Buf := ReadNum(MIN_ARR_VALUE, MAX_ARR_VALUE);
  135. Arr[I] := Buf;
  136. End;
  137. End;
  138.  
  139. Procedure InputDataFromFile(Var Arr: TArray);
  140. Var
  141. PathFile: String;
  142. IsInputFromFileSuccessfully: Boolean;
  143. Begin
  144. Writeln('Данные в файле должны содержать:', #10, 'Натуральное число - количество элементов массива от ', MIN_ARR_LENGTH, ' до ', MAX_ARR_LENGTH, #10, 'Элементы массива, записанные через пробел, допустимые значения для которых от ', MIN_ARR_VALUE, ' до ', MAX_ARR_VALUE);
  145. Repeat
  146. Write('Введите путь к файлу с его раcширением: ');
  147. Readln(PathFile);
  148. IsInputFromFileSuccessfully := CheckFile(PathFile, Arr);
  149. Until IsInputFromFileSuccessfully;
  150. End;
  151.  
  152.  
  153. Procedure InputData(Var Arr: TArray);
  154. Var
  155. Choice: Integer;
  156. Begin
  157. Write('Выберите вариант ввода:', #10, '1. Ввод из консоли', #10, '2. Ввод из файла', #10, 'Использовать вариант: ');
  158. Choice := ReadNum(1,2);
  159.  
  160. If Choice = 1 Then
  161. InputDataFromConsole(Arr)
  162. Else
  163. InputDataFromFile(Arr);
  164. End;
  165.  
  166. Procedure OutputDataToConsole(Count: Integer);
  167. Begin
  168. If Count = 0 Then
  169. Writeln('Среди элементов массива чисел равных 1 нет')
  170. Else
  171. Writeln('Максимальное количество подряд идущих чисел равных 1 в массиве: ', Count);
  172. End;
  173.  
  174. Procedure OutputDataToFile(Count: Integer);
  175. Var
  176. IsPathCorrect: Boolean;
  177. Path: String;
  178. OutputFile: TextFile;
  179. Begin
  180. Writeln('Для вывода введите путь к файлу и его имя (например, F:\Projects\Matrix\Имя файла.txt). Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)');
  181. Repeat
  182. IsPathCorrect := True;
  183. Write('Введите путь: ');
  184. Readln(Path);
  185. If Path = '' Then
  186. IsPathCorrect := false
  187. Else
  188. Begin
  189. AssignFile(OutputFile, Path);
  190. Try
  191. Rewrite(OutputFile);
  192. Except
  193. Writeln('Не удалось вывести в Файл');
  194. IsPathCorrect := False;
  195. End;
  196. End;
  197. Until IsPathCorrect;
  198.  
  199. If Count = 0 Then
  200. Writeln(OutputFile, 'Среди элементов массива чисел равных 1 нет')
  201. Else
  202. Writeln(OutputFile, 'Максимальное количество подряд идущих чисел равных 1 в массиве: ', Count);
  203. CloseFile(OutputFile);
  204. Writeln('Вывод данных... успешно!');
  205. End;
  206.  
  207.  
  208. Procedure OutputData(Count: Integer);
  209. Var
  210. Choice: Integer;
  211. Begin
  212. Write('Выберите вариант вывода:', #10#13, '1. Вывод в консоль', #10#13, '2. Вывод файл', #10#13, 'Использовать вариант: ');
  213. Choice := ReadNum(1,2);
  214.  
  215. If Choice = 1 Then
  216. OutputDataToConsole(Count)
  217. Else
  218. OutputDataToFile(Count);
  219. End;
  220.  
  221. Function SolveTheTask(Arr: TArray): Integer;
  222. Var
  223. I, Count, MaxCount: Integer;
  224. Begin
  225. Count := 0;
  226. MaxCount := 0;
  227. For I := 0 To High(Arr) Do
  228. Begin
  229. If Arr[I] = 1 Then
  230. Begin
  231. Inc(Count);
  232. If (Count > MaxCount) Then
  233. MaxCount := Count;
  234. End
  235. Else
  236. Begin
  237.  
  238. Count := 0;
  239. End;
  240. End;
  241. SolveTheTask := MaxCount;
  242. End;
  243.  
  244.  
  245. Var
  246. MaxCount: Integer;
  247. ArrA: TArray;
  248. Begin
  249. WriteLn('Дан массив А, состоящий из n-натуральных чисел. Определить', #13#10, 'максимальное число идущих подряд элементов, равных 1 .');
  250. InputData(ArrA);
  251. MaxCount := SolveTheTask(ArrA);
  252. OutputData(MaxCount);
  253. Readln;
  254. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement