Advertisement
dxvmxnd

Untitled

Feb 29th, 2024
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.93 KB | None | 0 0
  1. Program Lab_matrix;
  2.  
  3. uses
  4. System.SysUtils;
  5.  
  6. Type
  7. TMatrix = Array Of Array Of Integer;
  8.  
  9. Procedure OutputTask();
  10. Begin
  11. Writeln('Данная программа рассчитывает наибольшее отрицательное число среди заданной квадратной матрицы.');
  12. End;
  13.  
  14. Function ChooseInput() : Boolean;
  15. Var
  16. IsCorrect : Boolean;
  17. Num : Integer;
  18. Begin
  19. Repeat
  20. Writeln('Выберите откуда вводить данные: 0, если из консоли, 1 если из файла:');
  21. IsCorrect := True;
  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. IsCorrect : Boolean;
  78. Size : Integer;
  79. Begin
  80. Repeat
  81. IsCorrect := True;
  82. Writeln('Введите размер матрицы(от 2 до 100):');
  83. Try
  84. Readln(Size);
  85. Except
  86. IsCorrect := False;
  87. End;
  88. If (Not IsCorrect) Or (Size < 2) Or (Size > 100) Then
  89. Begin
  90. IsCorrect := False;
  91. Writeln('Ошибка ввода! Повторите попытку.');
  92. End;
  93. Until IsCorrect;
  94.  
  95. InputSizeFromConsole := Size;
  96. End;
  97.  
  98. Function InputSizeFromFile(Path : String) : Integer;
  99. Var
  100. Size : Integer;
  101. IsCorrect : Boolean;
  102. InputFile : TextFile;
  103. Begin
  104. AssignFile(InputFile, Path);
  105. Reset(InputFile);
  106. IsCorrect := True;
  107. Writeln('Запись размера...');
  108. Try
  109. Readln(InputFile, Size)
  110. Except
  111. IsCorrect := False;
  112. End;
  113. If (Not IsCorrect) Or (Size < 2) Or (Size > 100) Then
  114. Begin
  115. IsCorrect := False;
  116. Writeln('Ошибка ввода! Введите размер с клавиатуры.');
  117. Size := InputSizeFromConsole();
  118. End;
  119. CloseFile(InputFile);
  120.  
  121. InputSizeFromFile := Size;
  122. End;
  123.  
  124. Function ExceptionRead(I, J : Integer) : Integer;
  125. Var
  126. IsCorrect : Boolean;
  127. Num : Integer;
  128. Begin
  129. Repeat
  130. Writeln('Введите [', I+1, ' , ', J+1, '] элемент матрицы:');
  131. IsCorrect := True;
  132. Try
  133. Readln(Num);
  134. Except
  135. IsCorrect := False;
  136. Writeln('Ошибка ввода! Повторите попытку.');
  137. End;
  138. Until IsCorrect;
  139.  
  140. ExceptionRead := Num;
  141. End;
  142.  
  143. Function FillMatrixFromFile(Path : String; Matrix : TMatrix) : TMatrix;
  144. Var
  145. I, J : Integer;
  146. InputFile : TextFile;
  147. Begin
  148. Writeln('Запись матрицы...');
  149. AssignFile(InputFile, Path);
  150. Reset(InputFile);
  151. Readln(InputFile);
  152. For I := 0 To High(Matrix) Do
  153. Begin
  154. For J := 0 To High(Matrix) Do
  155. Begin
  156. Try
  157. Read(InputFile, Matrix[I, J]);
  158. Except
  159. Writeln('Ошибка ввода! Введите [', I+1, ' , ', J+1, '] элемент матрицы с клавиатуры.');
  160. Matrix[I, J] := ExceptionRead(I, J);
  161. End;
  162. End;
  163. Readln(InputFile);
  164. End;
  165.  
  166. CloseFile(InputFile);
  167.  
  168. FillMatrixFromFIle := Matrix;
  169. End;
  170.  
  171. Function InputMatrixFromFile() : TMatrix;
  172. Var
  173. Path : String;
  174. Matrix : TMatrix;
  175. Size : Integer;
  176. Begin
  177. Writeln('При записи из файла учтите, что на 1 строке должен быть записан размер матрицы, а далее с новой строки сама матрица(через пробел');
  178. Path := ChoosePath();
  179. Size := InputSizeFromFile(Path);
  180. SetLength(Matrix, Size, Size);
  181. Matrix := FillMatrixFromFile(Path, Matrix);
  182.  
  183. InputMatrixFromFile := Matrix;
  184. End;
  185.  
  186. Function FillMatrixFromConsole(Matrix : TMatrix) : TMatrix;
  187. Var
  188. I, J : Integer;
  189. IsCorrect : Boolean;
  190. Begin
  191. For I := 0 To High(Matrix) Do
  192. Begin
  193. For J := 0 To High(Matrix) Do
  194. Begin
  195. Repeat
  196. Writeln('Введите [', I+1, ' , ', J+1, '] элемент матрицы:');
  197. IsCorrect := True;
  198. Try
  199. Readln(Matrix[I, J]);
  200. Except
  201. IsCorrect := False;
  202. Writeln('Ошибка ввода! Повторите попытку.');
  203. End;
  204. Until IsCorrect;
  205. End;
  206. End;
  207.  
  208. FillMatrixFromConsole := Matrix;
  209. End;
  210.  
  211. Function InputMatrixFromConsole() : TMatrix;
  212. Var
  213. Size : Integer;
  214. Matrix : TMatrix;
  215. Begin
  216. Size := InputSizeFromConsole();
  217. SetLength(Matrix, Size, Size);
  218. Matrix := FillMatrixFromConsole(Matrix);
  219.  
  220. InputMatrixFromConsole := Matrix;
  221. End;
  222.  
  223. Function InputMatrix(IsFromFile : Boolean) : TMatrix;
  224. Var
  225. Matrix : TMatrix;
  226. Begin
  227. If IsFromFile Then
  228. Matrix := InputMatrixFromFile()
  229. Else
  230. Matrix := InputMatrixFromConsole();
  231.  
  232. InputMatrix := Matrix;
  233. End;
  234.  
  235. Function FindLargestNegativeNumber(Matrix : TMatrix) : Integer;
  236. Var
  237. I, J, Num : Integer;
  238. IsThereNegative : Boolean;
  239. Begin
  240. IsThereNegative := False;
  241. For I := 0 To High(Matrix) Do
  242. Begin
  243. For J := 0 To High(Matrix) Do
  244. Begin
  245. If Matrix[I, J] < 0 Then
  246. Begin
  247. IsThereNegative := True;
  248. Num := Matrix[I, J];
  249. End;
  250. End;
  251. End;
  252.  
  253. If IsThereNegative Then
  254. Begin
  255. For I := 0 To High(Matrix) Do
  256. Begin
  257. For J := 0 To High(Matrix) Do
  258. Begin
  259. If ((Matrix[I, J] > Num) And (Matrix[I, J] < 0 )) Then
  260. Num := Matrix[I, J];
  261. End;
  262. End;
  263. End
  264. Else
  265. Begin
  266. Num := 0;
  267. End;
  268.  
  269. FindLargestNegativeNumber := Num;
  270. End;
  271.  
  272. Function ChoosePathForOutput() : String;
  273. Var
  274. Path : String;
  275. IsCorrect : Boolean;
  276. OutputFile : TextFile;
  277. Begin
  278. Begin
  279. Repeat
  280. Writeln('Введите путь к файлу для вывода информации: ');
  281. IsCorrect := True;
  282. Readln(Path);
  283. Try
  284. AssignFile(OutputFile, Path);
  285. Reset(OutputFile);
  286. Except
  287. IsCorrect := False;
  288. End;
  289. If (Not IsCorrect) Or (Length(Path) < 5) Then
  290. Begin
  291. IsCorrect := False;
  292. Writeln('Ошибка ввода! Повторите попытку.');
  293. End
  294. Else
  295. Begin
  296. If ((Path[High(Path)] <> 't') And (Path[High(Path) - 1] <> 'x') And (Path[High(Path) - 2] <> 't') And (Path[High(Path) - 3] <> '.')) Then
  297. Begin
  298. IsCorrect := False;
  299. Writeln('Ошибка ввода! Повторите попытку.');
  300. End;
  301. End;
  302. Until IsCorrect;
  303. End;
  304.  
  305. CloseFile(OutputFile);
  306.  
  307. ChoosePathForOutput := Path;
  308. End;
  309.  
  310. Procedure OutputInFile(Num : Integer);
  311. Var
  312. Path : String;
  313. OutputFile : TextFile;
  314. Begin
  315. Path := ChoosePathForOutput();
  316. AssignFile(OutputFile, Path);
  317. Append(OutputFile);
  318. If (Num = 0) Then
  319. Writeln(OutputFile, #13#10'Матрица не имеет отрицательные элементы.')
  320. Else
  321. Writeln(OutputFile, #13#10'Наибольший отрицательный элемент матрицы: ', Num);
  322.  
  323. Writeln('Данные успешно записаны в файл!');
  324. End;
  325.  
  326. Procedure OutputAnswer(Num : Integer);
  327. Begin
  328. If (Num = 0) Then
  329. Writeln('Матрица не имеет отрицательные элементы.')
  330. Else
  331. Writeln('Наибольший отрицательный элемент матрицы: ', Num);
  332.  
  333. OutputInFile(Num);
  334. End;
  335.  
  336. Procedure OutputMatrix(Matrix : TMatrix);
  337. Var
  338. I, J : Integer;
  339. Begin
  340. Writeln('Исходная матрица: ');
  341. For I := 0 To High(Matrix) Do
  342. Begin
  343. For J := 0 To High(Matrix) Do
  344. Begin
  345. Write(Matrix[I, J], ' ');
  346. End;
  347. Writeln;
  348. End;
  349.  
  350. End;
  351.  
  352. Var
  353. IsFromFile : Boolean;
  354. Size , LargestNegativeNumber : Integer;
  355. Matrix : TMatrix;
  356. Begin
  357. OutputTask();
  358. IsFromFile := ChooseInput();
  359. Matrix := InputMatrix(IsFromFile);
  360. OutputMatrix(Matrix);
  361. LargestNegativeNumber := FindLargestNegativeNumber(Matrix);
  362. OutputAnswer(LargestNegativeNumber);
  363.  
  364. Readln;
  365. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement