Advertisement
Amorf

Untitled

Oct 16th, 2021
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.62 KB | None | 0 0
  1. Program lab2_4;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. Uses
  8.  
  9. System.SysUtils;
  10.  
  11. Type
  12.  
  13. TMatrix = Array of Array of Integer;
  14.  
  15. Function CheckConsOrFile() : Integer;
  16.  
  17. Const
  18.  
  19. MAX = 2;
  20.  
  21. MIN = 1;
  22.  
  23. Var
  24.  
  25. Choice : Integer;
  26.  
  27. IsCorrect : Boolean;
  28.  
  29. Begin
  30.  
  31. Repeat
  32.  
  33. Write('Введите 1, если хотите работать в консоли, и 2, если в файле:
  34.  
  35. ');
  36.  
  37. IsCorrect := True;
  38.  
  39. Try
  40.  
  41. Readln(Choice);
  42.  
  43. Except
  44.  
  45. Writeln('Ошибка ввода. Повторите ввод.');
  46.  
  47. IsCorrect := False;
  48.  
  49. End;
  50.  
  51. If ((IsCorrect) And ((Choice > MAX) Or (Choice < MIN))) then
  52.  
  53. Begin
  54.  
  55. Writeln('Число выходит за допустимые пределы. Повторите ввод.');
  56.  
  57. IsCorrect := False;
  58.  
  59. End;
  60.  
  61. Until(IsCorrect);
  62.  
  63. CheckConsOrFile := Choice;
  64.  
  65. End;
  66.  
  67. Function InputMatrixSizeCons() : Integer;
  68.  
  69. Const
  70.  
  71. MAX_LIMIT = 10;
  72.  
  73. MIN_LIMIT = 1;
  74.  
  75. Var
  76.  
  77. Size : Integer;
  78.  
  79. IsCorrect : Boolean;
  80.  
  81. Begin
  82.  
  83. Repeat
  84.  
  85. IsCorrect := True;
  86.  
  87. Write('Введите размерность матрицы nxn(1 <= size <= ',MAX_LIMIT,'): ');
  88.  
  89. Try
  90.  
  91. Readln(Size);
  92.  
  93. Except
  94.  
  95. Writeln('Ошибка ввода. Повторите ввод.');
  96.  
  97. IsCorrect := False;
  98.  
  99. End;
  100.  
  101. If ((IsCorrect) and ((Size > MAX_LIMIT) Or (Size < MIN_LIMIT))) Then
  102.  
  103. Begin
  104.  
  105. Writeln('Число выходит за допустимые пределы. Повторите ввод.');
  106.  
  107. IsCorrect := False;
  108.  
  109. End;
  110.  
  111. Until(IsCorrect);
  112.  
  113. Writeln('');
  114.  
  115. InputMatrixSizeCons := Size;
  116.  
  117. End;
  118.  
  119. Function InputFromCons(Matrix : TMatrix) : TMatrix;
  120.  
  121. Const
  122.  
  123. MAX_ELEM = 100;
  124.  
  125. MIN_ELEM = 0;
  126.  
  127. Var
  128.  
  129. IsCorrect : Boolean;
  130.  
  131. I, J : Integer;
  132.  
  133. Begin
  134.  
  135. For I := Low(Matrix) to High(Matrix) Do
  136.  
  137. Begin
  138.  
  139. For J := Low(Matrix) To High(Matrix) Do
  140.  
  141. Begin
  142.  
  143. Repeat
  144.  
  145. Write('Введите элемент ', I + 1,'-ой строки ', J + 1,'-ого
  146.  
  147. столбца матрицы(',MIN_ELEM,' <= elem <= ',MAX_ELEM,'): ');
  148.  
  149. IsCorrect := True;
  150.  
  151. Try
  152.  
  153. Readln(Matrix[I, J]);
  154.  
  155. Except
  156.  
  157. IsCorrect := False;
  158.  
  159. Writeln('Ошибка ввода. Повторите ввод.');
  160.  
  161. End;
  162.  
  163. If ((IsCorrect) And ((Matrix[I, J] > MAX_ELEM) Or (Matrix[I,
  164.  
  165. J] < MIN_ELEM))) Then
  166.  
  167. Begin
  168.  
  169. IsCorrect := False;
  170.  
  171. Writeln('Элемент не входит в диапазон ',MIN_ELEM, ' <=
  172.  
  173. elem <= ',MAX_ELEM);
  174.  
  175. End;
  176.  
  177. Until(IsCorrect);
  178.  
  179. End;
  180.  
  181. End;
  182.  
  183. Writeln('');
  184.  
  185. InputFromCons := Matrix;
  186.  
  187. End;
  188.  
  189. Procedure OutputToCons(MatrixC : TMatrix);
  190.  
  191. Var
  192.  
  193. LowI, HiI, LowJ, HiJ, I, J: Integer;
  194.  
  195. Begin
  196.  
  197. LowI := Low(MatrixC);
  198.  
  199. LowJ := Low(MatrixC);
  200.  
  201. HiI := High(MatrixC);
  202.  
  203. HiJ := High(MatrixC);
  204.  
  205. Writeln('Начальная матрица');
  206.  
  207. Writeln('');
  208.  
  209. For I := Low(MatrixC) To High(MatrixC) Do
  210.  
  211. Begin
  212.  
  213. For J := Low(MatrixC) To High(MatrixC) Do
  214.  
  215. Begin
  216.  
  217. Write(MatrixC[I, J], ' ');
  218.  
  219. End;
  220.  
  221. Writeln('') ;
  222.  
  223. End;
  224.  
  225. Writeln('');
  226.  
  227. Writeln('Результат');
  228.  
  229. Writeln('');
  230.  
  231. While (LowI <= HiI) Or (LowJ <= HiJ) Do
  232.  
  233. Begin
  234.  
  235. For J := LowJ to HiJ do
  236.  
  237. Write(MatrixC[LowI, J], ' ');
  238.  
  239. Inc(LowI);
  240.  
  241. For I := LowI To HiI Do
  242.  
  243. Write(MatrixC[I, HiJ], ' ');
  244.  
  245. Dec(HiJ);
  246.  
  247. For J := HiJ DownTo LowJ Do
  248.  
  249. Write(MatrixC[HiI, J], ' ');
  250.  
  251. Dec(HiI);
  252.  
  253. For I := HiI DownTo LowI Do
  254.  
  255. Write(MatrixC[I, LowJ], ' ');
  256.  
  257. Inc(LowJ);
  258.  
  259. End;
  260.  
  261. End;
  262.  
  263. Function InputPath() : String;
  264.  
  265. Var
  266.  
  267. IsCorrect : Boolean;
  268.  
  269. Path : String;
  270.  
  271. Begin
  272.  
  273. Repeat
  274.  
  275. Write('Введите ссылку на файл: ');
  276.  
  277. IsCorrect := True;
  278.  
  279. Readln(Path);
  280.  
  281. If Not FileExists(Path) then
  282.  
  283. Begin
  284.  
  285. Writeln('Файл не найден! Повторите ввод');
  286.  
  287. IsCorrect := False;
  288.  
  289. End;
  290.  
  291. Until(IsCorrect);
  292.  
  293. InputPath := Path;
  294.  
  295. End;
  296.  
  297. Function CheckSizeInFileStr(Path : String) : Integer;
  298.  
  299. Var
  300.  
  301. Count : Integer;
  302.  
  303. Temporary : String;
  304.  
  305. InputFile : TextFile;
  306.  
  307. Begin
  308.  
  309. Count := 0;
  310.  
  311. AssignFile(InputFile , Path);
  312.  
  313. Reset(InputFile);
  314.  
  315. Writeln('');
  316.  
  317. Writeln(' Читаем матрицу из файла');
  318.  
  319. Writeln('');
  320.  
  321. While Not Eof(InputFile) Do
  322.  
  323. Begin
  324.  
  325. Readln(InputFile, Temporary);
  326.  
  327. Inc(Count);
  328.  
  329. End;
  330.  
  331. Close(InputFile);
  332.  
  333. CheckSizeInFileStr := Count;
  334.  
  335. End;
  336.  
  337. Function CheckSizeInFileColumn(Path : String) : Integer;
  338.  
  339. Var
  340.  
  341. CountSpace : Integer;
  342.  
  343. Temporary : String;
  344.  
  345. InputFile : TextFile;
  346.  
  347. I : Integer;
  348.  
  349. Begin
  350.  
  351. CountSpace := 0;
  352.  
  353. AssignFile(InputFile , Path);
  354.  
  355. Reset(InputFile);
  356.  
  357. Readln(InputFile, Temporary);
  358.  
  359. For I := 1 To length(Temporary) Do
  360.  
  361. Begin
  362.  
  363. If Temporary[I] = ' ' Then
  364.  
  365. Inc(CountSpace);
  366.  
  367. End;
  368.  
  369. Close(InputFile);
  370.  
  371. CheckSizeInFileColumn := CountSpace + 1;
  372.  
  373. End;
  374.  
  375. Function CheckValidOfSize(Strings : Integer;Columns : Integer) : Boolean;
  376.  
  377. Const
  378.  
  379. MAX_LIMIT = 10;
  380.  
  381. MIN_LIMIT = 1;
  382.  
  383. Var
  384.  
  385. IsCorrect : Boolean;
  386.  
  387. Begin
  388.  
  389. IsCorrect := True;
  390.  
  391. If Strings <> Columns Then
  392.  
  393. Begin
  394.  
  395. Writeln('В файле была введена некорректная матрица, поэтому введите
  396.  
  397. её через консоль');
  398.  
  399. Writeln('');
  400.  
  401. IsCorrect := False;
  402.  
  403. CheckValidOfSize := False;
  404.  
  405. End
  406.  
  407. Else If ((IsCorrect) And ((Strings > MAX_LIMIT) Or (Strings <
  408.  
  409. MIN_LIMIT))) Then
  410.  
  411. Begin
  412.  
  413. Writeln('В файле была введена некорректная матрица, поэтому введите
  414.  
  415. её через консоль');
  416.  
  417. Writeln('');
  418.  
  419. CheckValidOfSize := False;
  420.  
  421. End
  422.  
  423. Else
  424.  
  425. CheckValidOfSize := True;
  426.  
  427. End;
  428.  
  429. Function ExceptMatr(I : Integer; J : Integer) : Integer;
  430.  
  431. Const
  432.  
  433. MAX_ELEM = 100;
  434.  
  435. MIN_ELEM = 0;
  436.  
  437. Var
  438.  
  439. IsCorrect : Boolean;
  440.  
  441. Num : Integer;
  442.  
  443. Begin
  444.  
  445. Repeat
  446.  
  447. IsCorrect := True;
  448.  
  449. Write('Элемент матрицы (',I + 1,', ',J + 1,') неверно записан,
  450.  
  451. введите его с клавиатуры: ');
  452.  
  453. Try
  454.  
  455. Readln(Num);
  456.  
  457. Except
  458.  
  459. Writeln('Ошибка ввода. Повторите ввод.');
  460.  
  461. IsCorrect := False;
  462.  
  463. End;
  464.  
  465. If ((IsCorrect) And ((Num > MAX_ELEM) Or (Num < MIN_ELEM))) Then
  466.  
  467. Begin
  468.  
  469. Writeln('Элемент не входит в диапазон(',MIN_ELEM,' <= elem <=
  470.  
  471. ',MAX_ELEM,')');
  472.  
  473. IsCorrect := False;
  474.  
  475. End;
  476.  
  477. Until(IsCorrect);
  478.  
  479. ExceptMatr:=Num;
  480.  
  481. End;
  482.  
  483. Function InputFromFile(Path : String;Matrix : TMatrix) : TMatrix;
  484.  
  485. Const
  486.  
  487. MAX_ELEM = 100;
  488.  
  489. MIN_ELEM = 0;
  490.  
  491. Var
  492.  
  493. InputFile : TextFile;
  494.  
  495. I, J : Integer;
  496.  
  497. IsCorrect : Boolean;
  498.  
  499. Begin
  500.  
  501. AssignFile(InputFile, Path);
  502.  
  503. Reset(InputFile);
  504.  
  505. IsCorrect := True;
  506.  
  507. For I := Low(Matrix) To High(Matrix) Do
  508.  
  509. Begin
  510.  
  511. For J := Low(Matrix) to High(Matrix) do
  512.  
  513. Begin
  514.  
  515. Try
  516.  
  517. Read(InputFile, Matrix[I, j]);
  518.  
  519. Except
  520.  
  521. IsCorrect := False;
  522.  
  523. Matrix[I, J] := ExceptMatr(I, J);
  524.  
  525. End;
  526.  
  527. If ((IsCorrect) And ((Matrix[I, J] > MAX_ELEM) Or (Matrix[I, J] < MIN_ELEM))) Then
  528.  
  529. Matrix[I, J] := ExceptMatr(I, J);
  530.  
  531. End;
  532.  
  533. End;
  534.  
  535. Close(InputFile);
  536.  
  537. InputFromFile := Matrix;
  538.  
  539. End;
  540.  
  541. Procedure OutputToFile(Path : String; MatrixC : TMatrix);
  542.  
  543. Var
  544.  
  545. OutputFile : TextFile;
  546.  
  547. I, J: Integer;
  548.  
  549. LowI, HiI, LowJ, HiJ: Integer;
  550.  
  551. Begin
  552.  
  553. AssignFile(OutputFile, Path);
  554.  
  555. Rewrite(OutputFile);
  556.  
  557. LowI := Low(MatrixC);
  558.  
  559. LowJ := Low(MatrixC);
  560.  
  561. HiI := High(MatrixC);
  562.  
  563. HiJ := High(MatrixC);
  564.  
  565. Writeln(OutputFile,'Начальная матрица');
  566.  
  567. Writeln(OutputFile);
  568.  
  569. For I := Low(MatrixC) To High(MatrixC) Do
  570.  
  571. Begin
  572.  
  573. For J := Low(MatrixC) To High(MatrixC) Do
  574.  
  575. Write(OutputFile, MatrixC[I, J], ' ');
  576.  
  577. Writeln(OutputFile) ;
  578.  
  579. End;
  580.  
  581. Writeln(OutputFile);
  582.  
  583. Writeln(OutputFile,'Результат');
  584.  
  585. Writeln(OutputFile);
  586.  
  587. While (LowI <= HiI) Or (LowJ <= HiJ) Do
  588.  
  589. Begin
  590.  
  591. For J := LowJ to HiJ do
  592.  
  593. Write(OutputFile,MatrixC[LowI, J], ' ');
  594.  
  595. Inc(LowI);
  596.  
  597. For I := LowI To HiI Do
  598.  
  599. Write(OutputFile,MatrixC[I, HiJ], ' ');
  600.  
  601. Dec(HiJ);
  602.  
  603. For J := HiJ DownTo LowJ Do
  604.  
  605. Write(OutputFile,MatrixC[HiI, J], ' ');
  606.  
  607. Dec(HiI);
  608.  
  609. For I := HiI DownTo LowI Do
  610.  
  611. Write(OutputFile,MatrixC[I, LowJ], ' ');
  612.  
  613. Inc(LowJ);
  614.  
  615. End;
  616.  
  617. Close(OutputFile);
  618.  
  619. Writeln('Данные успешно записаны в файл');
  620.  
  621. End;
  622.  
  623. Function CheckFile(Path : String;MatrixC : TMatrix) : Boolean;
  624.  
  625. Begin
  626.  
  627. Try
  628.  
  629. OutputToFile(Path, MatrixC);
  630.  
  631. CheckFile := True;
  632.  
  633. Except
  634.  
  635. Writeln('Отказано в доступе к файлу. Измените настройки файла');
  636.  
  637. CheckFile := False;
  638.  
  639. End;
  640.  
  641. End;
  642.  
  643. Procedure OutputProcess(MatrixA : TMatrix);
  644.  
  645. Const
  646.  
  647. CONSOLE = 1;
  648.  
  649. Var
  650.  
  651. Check : Boolean;
  652.  
  653. Begin
  654.  
  655. If CheckConsOrFile() = CONSOLE Then
  656.  
  657. OutputToCons(MatrixA)
  658.  
  659. Else
  660.  
  661. Begin
  662.  
  663. Repeat
  664.  
  665. Check := CheckFile(InputPath(), MatrixA);
  666.  
  667. Until(Check);
  668.  
  669. End;
  670.  
  671. End;
  672.  
  673. Procedure CheckFileData(Strings : Integer; Columns : Integer; Path : String);
  674.  
  675. Var
  676.  
  677. Size : Integer;
  678.  
  679. MatrixA : TMatrix;
  680.  
  681. Begin
  682.  
  683. If CheckValidOfSize(Strings, Columns) Then
  684.  
  685. Begin
  686.  
  687. SetLength(MatrixA, Strings, Strings);
  688.  
  689. MatrixA := InputFromFile(Path,MatrixA);
  690.  
  691. OutputProcess(MatrixA);
  692.  
  693. End
  694.  
  695. Else
  696.  
  697. Begin
  698.  
  699. Size := InputMatrixSizeCons();
  700.  
  701. SetLength(MatrixA, Size, Size);
  702.  
  703. MatrixA := InputFromCons(MatrixA);
  704.  
  705. OutputProcess(MatrixA);
  706.  
  707. End
  708.  
  709. End;
  710.  
  711. Var
  712.  
  713. Strings,Columns, Size : Integer;
  714.  
  715. MatrixA: TMatrix;
  716.  
  717. Path : String;
  718.  
  719. Const
  720.  
  721. CONSOLE = 1;
  722.  
  723. Begin
  724.  
  725. Writeln('Программа разворачивает матрицу в одномерную последовательность
  726.  
  727. по часовой стрелке, начиная из верхнего левого угла.');
  728.  
  729. Writeln('');
  730.  
  731. If CheckConsOrFile() = CONSOLE Then
  732.  
  733. Begin
  734.  
  735. Size := InputMatrixSizeCons();
  736.  
  737. SetLength(MatrixA, Size, Size);
  738.  
  739. MatrixA := InputFromCons(MatrixA);
  740.  
  741. OutputProcess(MatrixA);
  742.  
  743. End
  744.  
  745. Else
  746.  
  747. Begin
  748.  
  749. Path := InputPath();
  750.  
  751. Strings := CheckSizeInFileStr(Path);
  752.  
  753. Columns := CheckSizeInFileColumn(Path);
  754.  
  755. CheckFileData(Strings, Columns, Path);
  756.  
  757. End;
  758.  
  759. Readln;
  760.  
  761. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement