Advertisement
Old_But_Gold

Untitled

Oct 26th, 2024
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.73 KB | None | 0 0
  1. Program Laba_33;
  2.  
  3. Uses
  4. SysUtils;
  5.  
  6. Const
  7. MIN: Integer = 2;
  8. MAX: Integer = 100;
  9. MIN_ELEMENT: Real = -100;
  10. MAX_ELEMENT: Real = 100;
  11.  
  12. Type
  13. TA = Array Of Array Of Real;
  14. TB = Array Of Real;
  15. TC = Array Of Real;
  16.  
  17. Function InputAndCheckChoiceOne(IsCorrect: Boolean): Integer;
  18. Var
  19. ChoiceOne: Integer;
  20. Begin
  21. ChoiceOne := 0;
  22. Repeat
  23. IsCorrect := True;
  24. Try
  25. Readln(ChoiceOne);
  26. Except
  27. IsCorrect := False;
  28. Writeln('Введите 1 или 2.');
  29. End;
  30. If IsCorrect And ((ChoiceOne <> 1) And (ChoiceOne <> 2)) Then
  31. Begin
  32. Writeln('Введите 1 или 2.');
  33. IsCorrect := False;
  34. End;
  35. Until IsCorrect;
  36. InputAndCheckChoiceOne := ChoiceOne;
  37. End;
  38.  
  39. Function InputAndCheckChoiceTwo(IsCorrect: Boolean): Integer;
  40. Var
  41. ChoiceTwo: Integer;
  42. Begin
  43. ChoiceTwo := 0;
  44. Repeat
  45. IsCorrect := True;
  46. Try
  47. Readln(ChoiceTwo);
  48. Except
  49. IsCorrect := False;
  50. Writeln('Введите 1 или 2.');
  51. End;
  52. If IsCorrect And ((ChoiceTwo <> 1) And (ChoiceTwo <> 2)) Then
  53. Begin
  54. Writeln('Введите 1 или 2.');
  55. IsCorrect := False;
  56. End;
  57. Until IsCorrect;
  58. InputAndCheckChoiceTwo := ChoiceTwo;
  59. End;
  60.  
  61. Function InputAndCheckN(IsCorrect: Boolean): Integer;
  62. Var
  63. N: Integer;
  64. Begin
  65. N := 0;
  66. Repeat
  67. IsCorrect := True;
  68. Writeln('Введите порядок матрицы: ');
  69. Try
  70. Readln(N);
  71. Except
  72. IsCorrect := False;
  73. Writeln('Введите число.');
  74. End;
  75. If IsCorrect And ((N < MIN) And (N > MAX)) Then
  76. Begin
  77. Writeln('Введите число от ', MIN, ' до ', MAX);
  78. IsCorrect := False;
  79. End;
  80. Until IsCorrect;
  81. InputAndCheckN := N;
  82. End;
  83.  
  84. Function IsFileExists(Const Path: String): Boolean;
  85. Begin
  86. IsFileExists := FileExists(Path);
  87. If Not FileExists(Path) Then
  88. Writeln('Файл не существует.');
  89. End;
  90.  
  91. Function IsFileTxt(Const Path: String): Boolean;
  92. Var
  93. FileType: String;
  94. Begin
  95. If (Length(Path) > 4) Then
  96. Begin
  97. FileType := Path.Substring(Path.Length - 4);
  98. If (FileType = '.txt') Then
  99. IsFileTxt := True
  100. Else
  101. Begin
  102. WriteLn('Файл не является текстовым. ');
  103. IsFileTxt := False;
  104. End;
  105. End
  106. Else
  107. Begin
  108. WriteLn('Введите корректное имя файла. ');
  109. IsFileTxt := False;
  110. End;
  111. End;
  112.  
  113. Function IsFileNotEmpty(Var MyFile: TextFile): Boolean;
  114. Var
  115. IsNotEmpty: Boolean;
  116. Begin
  117. Try
  118. Try
  119. Reset(MyFile);
  120. IsNotEmpty := Not Eof(MyFile);
  121. If (Not IsNotEmpty) Then
  122. Writeln('Этот файл пустой.');
  123. Except
  124. Writeln('Непредвиденная ошибка.');
  125. IsNotEmpty := False;
  126. End;
  127. Finally
  128. CloseFile(MyFile);
  129. End;
  130. IsFileNotEmpty := IsNotEmpty;
  131. End;
  132.  
  133. Function IsFileWritable(Var MyFile: TextFile): Boolean;
  134. Begin
  135. IsFileWritable := True;
  136. Try
  137. Rewrite(MyFile);
  138. Close(MyFile);
  139. Except
  140. IsFileWritable := False;
  141. Writeln('Этот файл невозможно открыть для записи.');
  142. End;
  143. End;
  144.  
  145. Function IsFileReadble(Var MyFile: TextFile): Boolean;
  146. Begin
  147. IsFileReadble := True;
  148. Try
  149. Reset(MyFile);
  150. Close(MyFile);
  151. Except
  152. IsFileReadble := False;
  153. Writeln('Этот файл невозможно открыть для чтения.');
  154. End;
  155. End;
  156.  
  157. Function RequestPathForWriting(Var MyFile: TextFile): String;
  158. Var
  159. Path: String;
  160. IsCorrect: Boolean;
  161. Begin
  162. Repeat
  163. Writeln('Введите имя файла с путём: ');
  164. Readln(Path);
  165. AssignFile(MyFile, Path);
  166. IsCorrect := IsFileExists(Path) And IsFileTxt(Path) And IsFileWritable(MyFile);
  167. Until IsCorrect;
  168. RequestPathForWriting := Path;
  169. End;
  170.  
  171. Function RequestPathForReading(): String;
  172. Var
  173. Path: String;
  174. IsCorrect: Boolean;
  175. MyFile: TextFile;
  176. Begin
  177. Repeat
  178. Writeln('Введите имя файла с путём: ');
  179. Readln(Path);
  180. AssignFile(MyFile, Path);
  181. IsCorrect := IsFileExists(Path) And IsFileTxt(Path) And IsFileReadble(MyFile) And IsFileNotEmpty(MyFile);
  182. Until IsCorrect;
  183. RequestPathForReading := Path;
  184. End;
  185.  
  186. Procedure CreateMatrix(N: Integer; Var A: TA; IsCorrect: Boolean);
  187. Var
  188. I, J: Integer;
  189. Begin
  190. SetLength(A, N, N);
  191. For I := 0 To High(A) Do
  192. For J := 0 To High(A) Do
  193. Begin
  194. Repeat
  195. IsCorrect := True;
  196. Writeln('Введите элементы матрицы: ');
  197. Try
  198. Readln(A[I][J]);
  199. Except
  200. IsCorrect := False;
  201. Writeln('Введите число.');
  202. End;
  203. If IsCorrect And ((A[I][J] < MIN_ELEMENT) And (A[I][J] > MAX_ELEMENT)) Then
  204. Begin
  205. Writeln('Введите число от ', MIN_ELEMENT, ' до ', MAX_ELEMENT);
  206. IsCorrect := False;
  207. End;
  208. Until IsCorrect;
  209. End;
  210. End;
  211.  
  212. Procedure CreateRowVector(N: Integer; Var B: TB; IsCorrect: Boolean);
  213. Var
  214. J: Integer;
  215. Begin
  216. SetLength(B, N);
  217. For J := 0 To High(B) Do
  218. Begin
  219. Repeat
  220. IsCorrect := True;
  221. Writeln('Введите элементы вектора-строки: ');
  222. Try
  223. Readln(B[J]);
  224. Except
  225. IsCorrect := False;
  226. Writeln('Введите число.');
  227. End;
  228. If IsCorrect And ((B[J] < MIN_ELEMENT) And (B[J] > MAX_ELEMENT)) Then
  229. Begin
  230. Writeln('Введите число от ', MIN_ELEMENT, ' до ', MAX_ELEMENT);
  231. IsCorrect := False;
  232. End;
  233. Until IsCorrect;
  234. End;
  235. End;
  236.  
  237. Procedure MultiplyVectorAndMatrix(N: Integer; Var C: TC; Const A: TA; Const B: TB);
  238. Var
  239. I, J: Integer;
  240. Begin
  241. SetLength(C, N);
  242. For J := 0 To High(C) Do
  243. C[J] := 0;
  244. For J := 0 To High(C) Do
  245. For I := 0 To High(B) Do
  246. C[J] := C[J] + A[I][J] * B[I];
  247. End;
  248.  
  249. Procedure PrintResultToConsole(Const C: TC; Const N: Integer);
  250. Var
  251. J: Integer;
  252. Begin
  253. For J := 0 To High(C) Do
  254. Write(C[J]:8:6, ' ');
  255. Writeln;
  256. End;
  257.  
  258.  
  259. Function InputSizeFromFile(Var Size: Integer; Var MyFile: TextFile): Boolean;
  260. Var
  261. IsCorrect: Boolean;
  262. Begin
  263. IsCorrect := True;
  264. Try
  265. Readln(MyFile, Size);
  266. Except
  267. Writeln('Ошибка в первой строке — неправильный размер матрицы');
  268. IsCorrect := False;
  269. End;
  270.  
  271. If IsCorrect Then
  272. Begin
  273. IsCorrect := (Size > MIN) And (Size < MAX);
  274. If Not IsCorrect Then
  275. Begin
  276. Writeln('Размер не входит в диапазон от ', MIN, ' до ', MAX);
  277. End;
  278. End;
  279.  
  280. InputSizeFromFile := IsCorrect;
  281. End;
  282.  
  283. Function ReadMatrix(Var MyFile: TextFile; Var A: TA; Const Size: Integer): Boolean;
  284. Var
  285. I, J: Integer;
  286. IsCorrect: Boolean;
  287. Begin
  288. SetLength(A, Size, Size);
  289. IsCorrect := True;
  290. Try
  291. For I := 0 To High(A) Do
  292. For J := 0 To High(A[I]) Do
  293. Read(MyFile, A[I][J]);
  294. Except
  295. Writeln('Неправильный элемент в [', I,'][',J,']');
  296. IsCorrect := False;
  297. End;
  298. ReadMatrix := IsCorrect;
  299. End;
  300.  
  301. Function ReadRowVector(Var MyFile: TextFile; Var B: TB; Const Size: Integer): Boolean;
  302. Var
  303. I, J: Integer;
  304. IsCorrect: Boolean;
  305. Begin
  306. SetLength(B, Size);
  307. IsCorrect := True;
  308. Try
  309. For J := 0 To High(B) Do
  310. Read(MyFile, B[J]);
  311. Except
  312. Writeln('Непредвиденная ошибка при чтении вектора в [', J, ']');
  313. IsCorrect := False;
  314. End;
  315. ReadRowVector := IsCorrect;
  316. End;
  317.  
  318. Procedure MultiplyVectorAndMartixFromFile(Var C: TC; Const A: TA; Const B: TB; Const Size: Integer);
  319. Var
  320. I, J: Integer;
  321. Begin
  322. SetLength(C, Size);
  323. For J := 0 To High(C) Do
  324. Begin
  325. C[J] := 0;
  326. For I := 0 To High(C) Do
  327. Begin
  328. C[J] := C[J] + A[I][J] * B[I];
  329. End;
  330. End;
  331. End;
  332.  
  333. Procedure PrintResultFromFileToConsole(Const C: TC; Const Size: Integer);
  334. Var
  335. J: Integer;
  336. Begin
  337. For J := 0 To High(C) Do
  338. Writeln(C[J]:8:6);
  339. End;
  340.  
  341. Function PrintResultFromFileToFile(Const C: TC; Const Size: Integer; Var MyFile: TextFile; IsCorrect: Boolean): Boolean;
  342. Var
  343. J: Integer;
  344. Begin
  345. IsCorrect := True;
  346. Try
  347. Try
  348. Rewrite(MyFile);
  349. For J := 0 To High(C) Do
  350. Begin
  351. Writeln(MyFile, C[J]:8:6);
  352. End;
  353. Except
  354. WriteLn('Непредвиденная ошибка.');
  355. IsCorrect := False;
  356. End;
  357. Finally
  358. CloseFile(MyFile);
  359. End;
  360. PrintResultFromFileToFile := IsCorrect;
  361. End;
  362.  
  363. Function PrintResultToFile(Const C: TC; Var MyFile: TextFile; Const N: Integer; IsCorrect: Boolean): Boolean;
  364. Var
  365. J: Integer;
  366. Begin
  367. IsCorrect := True;
  368. Try
  369. Try
  370. Rewrite(MyFile);
  371. For J := 0 To High(C) Do
  372. Begin
  373. Writeln(MyFile, C[J]:8:6);
  374. End;
  375. Except
  376. WriteLn('Непредвиденная ошибка.');
  377. IsCorrect := False;
  378. End;
  379. Finally
  380. CloseFile(MyFile);
  381. End;
  382. PrintResultToFile := IsCorrect;
  383. End;
  384.  
  385. Function InputArgumentsFromFile(Const Path: String; Var N: Integer; Var A: TA; Var B: TB; Var C: TC): Boolean;
  386. Var
  387. IsCorrect: Boolean;
  388. MyFile: TextFile;
  389. Begin
  390. IsCorrect := True;
  391. Try
  392. AssignFile(MyFile, Path);
  393. Reset(MyFile);
  394. Except
  395. IsCorrect := False;
  396. End;
  397.  
  398. If IsCorrect Then
  399. Begin
  400. IsCorrect := InputSizeFromFile(N, MyFile);
  401. If IsCorrect Then
  402. Begin
  403. IsCorrect := ReadMatrix(MyFile, A, N);
  404. If IsCorrect Then
  405. Begin
  406. IsCorrect := ReadRowVector(MyFile, B, N);
  407. If IsCorrect Then
  408. Begin
  409. MultiplyVectorAndMartixFromFile(C, A, B, N);
  410. End;
  411. End;
  412. End;
  413. End;
  414. CloseFile(MyFile);
  415.  
  416. InputArgumentsFromFile := IsCorrect;
  417. End;
  418.  
  419. Var
  420. N: Integer;
  421. IsCorrect: Boolean;
  422. ChoiceOne: Integer;
  423. ChoiceTwo: Integer;
  424. A: TA;
  425. B: TB;
  426. C: TC;
  427. MyFile: TextFile;
  428. Path: String;
  429.  
  430. Begin
  431. N := 0;
  432. IsCorrect := False;
  433. Writeln('Данная программа перемножает строку порядка n на матрицу n * n.', #13#10, 'Откуда Вы хотите выводить данные?', #13#10,
  434. '1 - с консоли, 2 - из файла.');
  435. ChoiceOne := InputAndCheckChoiceOne(IsCorrect);
  436. Writeln('Куда Вы хотите записать результат?', #13#10, '1 - в консоль, 2 - в файл.');
  437. ChoiceTwo := InputAndCheckChoiceTwo(IsCorrect);
  438. If (ChoiceOne = 1) Then
  439. Begin
  440. N := InputAndCheckN(IsCorrect);
  441. CreateMatrix(N, A, IsCorrect);
  442. CreateRowVector(N, B, IsCorrect);
  443. MultiplyVectorAndMatrix(N, C, A, B);
  444.  
  445. If (ChoiceTwo = 1) Then
  446. Begin
  447. PrintResultToConsole(C, N);
  448. End
  449. Else
  450. Begin
  451. IsCorrect := False;
  452. Repeat
  453. Path := RequestPathForWriting(MyFile);
  454. PrintResultToFile(C, MyFile, N, IsCorrect);
  455. Until IsCorrect;
  456. End;
  457. End
  458. Else
  459. Begin
  460. IsCorrect := False;
  461. Repeat
  462. Path := RequestPathForReading();
  463.  
  464. IsCorrect := InputArgumentsFromFile(Path, N, A, B, C);
  465.  
  466. If IsCorrect Then
  467. Begin
  468. If (ChoiceTwo = 1) Then
  469. Begin
  470. PrintResultFromFileToConsole(C, N);
  471. End
  472. Else
  473. Begin
  474. IsCorrect := False;
  475. Repeat
  476. PrintResultFromFileToFile(C, N, MyFile, IsCorrect);
  477. Until IsCorrect;
  478. End;
  479. End;
  480. Until IsCorrect;
  481. End;
  482. Readln;
  483. Readln;
  484.  
  485. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement