Advertisement
dxvmxnd

Untitled

Mar 2nd, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.77 KB | None | 0 0
  1. Program Find_Of_NoD;
  2.  
  3. uses
  4. System.SysUtils;
  5.  
  6. Type
  7. TArray = Array Of Integer;
  8.  
  9. Procedure OutputTask();
  10. Begin
  11. Writeln('Данная программа находит НОД для заданных чисел.');
  12. End;
  13.  
  14. Function ChooseInput() : Boolean;
  15. Var
  16. Num : Integer;
  17. IsCorrect : Boolean;
  18. Begin
  19. Repeat
  20. IsCorrect := True;
  21. Writeln('Выберите, откуда вводить данные: 0, если с консоли; 1, если с файла.');
  22. Try
  23. Readln(Num);
  24. Except
  25. IsCorrect := False;
  26. End;
  27. If ((Not IsCorrect) Or ((Num <> 0) And (Num <> 1))) Then
  28. Begin
  29. IsCorrect := False;
  30. Writeln('Ошибка ввода! Повторите попытку.');
  31. End;
  32. Until IsCorrect;
  33.  
  34. ChooseInput := (Num = 1);
  35. End;
  36.  
  37. Function ChoosePath() : String;
  38. Var
  39. Path : String;
  40. IsCorrect : Boolean;
  41. InputFile : TextFile;
  42. Begin
  43. Begin
  44. Repeat
  45. Writeln('Введите путь к файлу для ввода информации: ');
  46. IsCorrect := True;
  47. Readln(Path);
  48. Try
  49. AssignFile(InputFile, Path);
  50. Reset(InputFile);
  51. Except
  52. IsCorrect := False;
  53. End;
  54. If (Not IsCorrect) Or (Length(Path) < 5) Then
  55. Begin
  56. IsCorrect := False;
  57. Writeln('Ошибка ввода! Повторите попытку.');
  58. End
  59. Else
  60. Begin
  61. If ((Path[High(Path)] <> 't') And (Path[High(Path) - 1] <> 'x') And (Path[High(Path) - 2] <> 't') And (Path[High(Path) - 3] <> '.')) Then
  62. Begin
  63. IsCorrect := False;
  64. Writeln('Ошибка ввода! Повторите попытку.');
  65. End;
  66. End;
  67. Until IsCorrect;
  68. End;
  69.  
  70. CloseFile(InputFile);
  71.  
  72. ChoosePath := Path;
  73. End;
  74.  
  75. Function InputSizeFromConsole() : Integer;
  76. Var
  77. Num : Integer;
  78. IsCorrect : Boolean;
  79. Begin
  80. Repeat
  81. Writeln('Введите количество чисел: ');
  82. IsCorrect := True;
  83. Try
  84. Readln(Num);
  85. Except
  86. IsCorrect := False;
  87. End;
  88. If (Not IsCorrect) Or (Num < 2) Then
  89. Begin
  90. IsCorrect := False;
  91. Writeln('Ошибка ввода! Повторите попытку.');
  92. End;
  93. Until IsCorrect;
  94.  
  95. InputSizeFromConsole := Num;
  96. End;
  97.  
  98. Function InputSizeFromFile(Path : String) : Integer;
  99. Var
  100. InputFile : TextFile;
  101. Size : Integer;
  102. IsCorrect : Boolean;
  103. Begin
  104. Writeln('Запись размера...');
  105. AssignFile(InputFile, Path);
  106. Reset(InputFile);
  107. Try
  108. Readln(InputFile, Size);
  109. Except
  110. IsCorrect := False;
  111. End;
  112. If (Not IsCorrect) Or (Size < 2) Then
  113. Begin
  114. Writeln('Ошибка ввода! Введите корректное значение с клавиатуры.');
  115. Size := InputSizeFromConsole();
  116. End;
  117.  
  118. CloseFile(InputFile);
  119.  
  120. InputSizeFromFile := Size;
  121. End;
  122.  
  123. Function ExceptionRead(I : Integer) : Integer;
  124. Var
  125. Num : Integer;
  126. IsCorrect : Boolean;
  127. Begin
  128. Repeat
  129. Writeln('Введите ', (I+1), ' элемент с клавиатуры: ');
  130. IsCorrect := True;
  131. Try
  132. Readln(Num);
  133. Except
  134. IsCorrect := False;
  135. End;
  136. If (Not IsCorrect) Or (Num < 1) Then
  137. Begin
  138. IsCorrect := False;
  139. Writeln('Ошибка ввода! Повторите попытку.');
  140. End;
  141. Until IsCorrect;
  142.  
  143. ExceptionRead := Num;
  144. End;
  145.  
  146. Procedure FillNumbersFromFile(var Numbers : TArray; Path : String);
  147. Var
  148. I : Integer;
  149. IsCorrect : Boolean;
  150. InputFile : TextFile;
  151. Begin
  152. Writeln('Запись чисел...');
  153. AssignFile(InputFile, Path);
  154. Reset(InputFile);
  155. Readln(InputFile);
  156.  
  157. For I := 0 To High(Numbers) Do
  158. Begin
  159. Try
  160. Read(InputFile, Numbers[I]);
  161. Except
  162. IsCorrect := False;
  163. End;
  164. If (Not IsCorrect) Or (Numbers[I] < 1) Then
  165. Begin
  166. Writeln('Ошибка ввода! Введите ', (I+1), ' элемент с клавиатуры!');
  167. Numbers[I] := ExceptionRead(I);
  168. End;
  169. End;
  170.  
  171. CloseFile(InputFile);
  172. End;
  173.  
  174. Procedure FillNumbersFromConsole(var Numbers : TArray);
  175. Var
  176. I : Integer;
  177. IsCorrect : Boolean;
  178. Begin
  179. For I := 0 To High(Numbers) Do
  180. Begin
  181. Repeat
  182. Writeln('Введите ', (I+1), ' элемент: ');
  183. IsCorrect := True;
  184. Try
  185. Readln(Numbers[I]);
  186. Except
  187. IsCorrect := False;
  188. End;
  189. If (Not IsCorrect) Or (Numbers[I] < 1) Then
  190. Begin
  191. IsCorrect := False;
  192. Writeln('Ошибка ввода! Повторите попытку.');
  193. End;
  194. Until IsCorrect;
  195. End;
  196. End;
  197.  
  198. Procedure InputFromConsole(var Numbers : TArray);
  199. Var
  200. Size : Integer;
  201. Begin
  202. Size := InputSizeFromConsole();
  203. SetLength(Numbers, Size);
  204. FillNumbersFromConsole(Numbers);
  205. End;
  206.  
  207. Procedure InputFromFile(var Numbers : TArray);
  208. Var
  209. Size : Integer;
  210. Path : String;
  211. Begin
  212. Writeln('При вводе из файла учтите, что в текстовом файле на 1 строке должно быть записано количество чисел, а на второй - сами числа через пробел.');
  213.  
  214. Path := ChoosePath();
  215. Size := InputSizeFromFile(Path);
  216. SetLength(Numbers, Size);
  217. FillNumbersFromFile(Numbers, Path);
  218.  
  219. End;
  220.  
  221. Function InputNumbers(IsFromFile : Boolean) : TArray;
  222. Var
  223. Numbers : TArray;
  224. Begin
  225. If IsFromFile Then
  226. InputFromFile(Numbers)
  227. Else
  228. InputFromConsole(Numbers);
  229.  
  230. InputNumbers := Numbers;
  231. End;
  232.  
  233. Function FindNoD(Numbers : TArray) : Integer;
  234. Var
  235. Min : Integer;
  236. I, J : Integer;
  237. Divider : Integer;
  238. IsCorrect : Boolean;
  239. Begin
  240. Min := Numbers[0];
  241. For I := 0 To High(Numbers) Do
  242. Begin
  243. If Numbers[I] < Min Then
  244. Min := Numbers[I];
  245. End;
  246.  
  247. For I := 1 To Min Do
  248. Begin
  249. IsCorrect := True;
  250. For J := 0 To High(Numbers) Do
  251. Begin
  252. If Not(Numbers[J] mod I = 0) then
  253. IsCorrect := False;
  254.  
  255. End;
  256. If IsCorrect Then
  257. Divider := I;
  258. End;
  259.  
  260. FindNoD := Divider;
  261. End;
  262.  
  263. Function ChoosePathForOutput() : String;
  264. Var
  265. Path : String;
  266. IsCorrect : Boolean;
  267. OutputFile : TextFile;
  268. Begin
  269. Begin
  270. Repeat
  271. Writeln('Введите путь к файлу для вывода информации: ');
  272. IsCorrect := True;
  273. Readln(Path);
  274. Try
  275. AssignFile(OutputFile, Path);
  276. Reset(OutputFile);
  277. Except
  278. IsCorrect := False;
  279. End;
  280. If (Not IsCorrect) Or (Length(Path) < 5) Then
  281. Begin
  282. IsCorrect := False;
  283. Writeln('Ошибка ввода! Повторите попытку.');
  284. End
  285. Else
  286. Begin
  287. If ((Path[High(Path)] <> 't') And (Path[High(Path) - 1] <> 'x') And (Path[High(Path) - 2] <> 't') And (Path[High(Path) - 3] <> '.')) Then
  288. Begin
  289. IsCorrect := False;
  290. Writeln('Ошибка ввода! Повторите попытку.');
  291. End;
  292. End;
  293. Until IsCorrect;
  294. End;
  295.  
  296. CloseFile(OutputFile);
  297.  
  298. ChoosePathForOutput := Path;
  299. End;
  300.  
  301. Procedure OutputAnswerInFile(NoD : Integer);
  302. Var
  303. Path : String;
  304. OutputFile : TextFile;
  305. Begin
  306. Path := ChoosePathForOutput();
  307. AssignFile(OutputFile, Path);
  308. Rewrite(OutputFile);
  309.  
  310. Writeln(OutputFile, 'Максимальный общий делитель среди заданных чисел: ', NoD);
  311. Writeln('Ответ успешно записан!');
  312. CloseFIle(OutputFile);
  313. End;
  314.  
  315. Procedure OutputAnswer(NoD : Integer);
  316. Begin
  317. Writeln('Максимальный общий делитель среди заданных чисел: ', NoD);
  318. OutputAnswerInFile(NoD);
  319. End;
  320.  
  321. Var
  322. IsFromFile : Boolean;
  323. Numbers : TArray;
  324. NoD : Integer;
  325. Begin
  326.  
  327. OutputTask();
  328. IsFromFile := ChooseInput();
  329. Numbers := InputNumbers(IsFromFile);
  330. NoD := FindNoD(Numbers);
  331. OutputAnswer(NoD);
  332. Readln;
  333.  
  334. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement