Advertisement
ksyshshot

Lab_2.4

Nov 5th, 2022 (edited)
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.77 KB | Source Code | 0 0
  1. Program Lab_2_4;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. Uses
  7.     System.SysUtils;
  8.  
  9. Type
  10.     TMatrix = Array Of Array Of Integer;
  11.     TArr = Array Of Integer;
  12.  
  13. Procedure WriteTask();
  14. Begin
  15.     Writeln('Данная программа находит седловую точку квадратной матрицы');
  16. End;
  17.  
  18. Function FileInputPath(IsFileForRead: Boolean): String;
  19. Var
  20.     Path: String;
  21.     IsCorrect: Boolean;
  22.     F: TextFile;
  23. Begin
  24.     If (IsFileForRead) Then
  25.         Write ('Введите путь к файлу для чтения: ')
  26.     Else
  27.         Write ('Введите путь к файлу для записи: ');
  28.     Repeat
  29.         IsCorrect := True;
  30.         Readln(Path);
  31.         AssignFile(F, Path);
  32.         If Not(FileExists(Path)) Then
  33.         Begin
  34.             IsCorrect := False;
  35.             Writeln ('Файл не найден. Повторите попытку...');
  36.         End;
  37.     Until (IsCorrect);
  38.     FileInputPath := Path;
  39. End;
  40.  
  41. Function FileInputMatrixOrder(Path: String): Integer;
  42. Const
  43.     MAX_ORDER = 10;
  44.     MIN_ORDER = 2;
  45. Var
  46.     MatrixOrder: Integer;
  47.     F: TextFile;
  48.     IsCorrect, IsFileForRead: Boolean;
  49. Begin
  50.     IsFileForRead := True;
  51.     Repeat
  52.         IsCorrect := True;
  53.         AssignFile(F, Path);
  54.         Try
  55.             Reset(F);
  56.         Except
  57.             Write ('Не удалось открыть файл. ');
  58.             IsCorrect := False;
  59.         End;
  60.         If (IsCorrect) Then
  61.             Try
  62.                 Readln (F, MatrixOrder);
  63.             Except
  64.                 Write ('Некорректно введённый порядок матрицы. ');
  65.                 IsCorrect := False;
  66.             End;
  67.         If (IsCorrect) And ((MatrixOrder < MIN_ORDER) Or (MatrixOrder > MAX_ORDER)) Then
  68.         Begin
  69.             Write ('Порядок матрицы неверного диапазона! ');
  70.             IsCorrect := False;
  71.         End;
  72.         If Not(IsCorrect) Then
  73.         Begin
  74.             Writeln('Повторите попытку...');
  75.             Path := FileInputPath(IsFileForRead);
  76.         End;
  77.     Until (IsCorrect);
  78.     CloseFile(F);
  79.     FileInputMatrixOrder := MatrixOrder;
  80. End;
  81.  
  82. Function FileMatrixInput(Path: String; Order: Integer): TMatrix;
  83. Var
  84.     Matrix: TMatrix;
  85.     I, J: Integer;
  86.     F: TextFile;
  87.     IsCorrect, IsFileForRead: Boolean;
  88. Begin
  89.     IsFileForRead := True;
  90.     SetLength(Matrix, Order, Order);
  91.     Repeat
  92.         IsCorrect := True;
  93.         AssignFile(F, Path);
  94.         Reset(F);
  95.         Readln(F);
  96.         I := 0;
  97.         While (IsCorrect) And (I < Order) Do
  98.         Begin
  99.             J := 0;
  100.             While (IsCorrect) And (J < Order) Do
  101.             Begin
  102.                 Try
  103.                     Read(F, Matrix[I][J]);
  104.                 Except
  105.                     Writeln('Ошибка! Найдено некорректное значение элемента матрицы');
  106.                     IsCorrect := False;
  107.                     Dec(I);
  108.                 End;
  109.                 Inc(J);
  110.             End;
  111.             Inc(I);
  112.         End;
  113.         If Not(IsCorrect) Then
  114.         Begin
  115.             Writeln('Проверьте правильность введённых данных и повторите попытку...');
  116.             Path := FileInputPath(IsFileForRead);
  117.             AssignFile(F, Path);
  118.         End;
  119.     Until (IsCorrect);
  120.     CloseFile(F);
  121.     FileMatrixInput := Matrix;
  122. End;
  123.  
  124. Function ConsoleInputMatrixOrder(): Integer;
  125. Const
  126.     MIN_ORDER = 2;
  127.     MAX_ORDER = 10;
  128. Var
  129.     Order: Integer;
  130.     IsCorrect: Boolean;
  131. Begin
  132.     Repeat
  133.         Writeln ('Введите порядок квадратной матрицы');
  134.         IsCorrect := True;
  135.         Try
  136.             Readln (Order);
  137.         Except
  138.             Writeln ('Ошибка ввода! Повторите попытку...');
  139.             IsCorrect := False;
  140.         End;
  141.         If ((IsCorrect) And ((Order < MIN_ORDER) Or (Order > MAX_ORDER))) Then
  142.         Begin
  143.             Writeln ('Ошибка ввода! Проверьте, входит ли введённое значение в допустимый диапазон и повторите попытку...');
  144.             IsCorrect := False;
  145.         End;
  146.     Until (IsCorrect);
  147.     ConsoleInputMatrixOrder := Order;
  148. End;
  149.  
  150. Function ConsoleMatrixCreation(Order: Integer): TMatrix;
  151. Const
  152.     MIN_ELEMENT = -2147483648;
  153.     MAX_ELEMENT = 2147483648;
  154. Var
  155.     I, J: Integer;
  156.     IsCorrect: Boolean;
  157.     Matrix: TMatrix;
  158. Begin
  159.     SetLength (Matrix, Order, Order);
  160.     For I := 0 To High(Matrix) Do
  161.         For J := 0 To High(Matrix) Do
  162.             Repeat
  163.                 Writeln ('Введите ', (J + 1), ' элемент ', (I + 1), ' строки');
  164.                 IsCorrect := True;
  165.                 Try
  166.                     Readln (Matrix[I][J]);
  167.                 Except
  168.                     Writeln ('Ошибка ввода! Повторите попытку...');
  169.                     IsCorrect := False;
  170.                 End;
  171.                 If ((IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT))) Then
  172.                 Begin
  173.                     Writeln ('Ошибка ввода! Введено число неверного диапазона');
  174.                     IsCorrect := False;
  175.                 End;
  176.             Until (IsCorrect);
  177.     ConsoleMatrixCreation := Matrix;
  178. End;
  179.  
  180. Procedure ConsolMatrixOutput(Matrix: TMatrix);
  181. Var
  182.     I, J: Integer;
  183. Begin
  184.     Writeln ('Исходная матрица:');
  185.     For I := 0 To High(Matrix) Do
  186.     Begin
  187.         For J := 0 To High(Matrix) Do
  188.             Write (Matrix[I][J], ' ');
  189.         Writeln;
  190.     End;
  191. End;
  192.  
  193. Function SmallestElementsInLine(Matrix: TMatrix; Order: Integer): TArr;
  194. Var
  195.     I, J, Min: Integer;
  196.     MinIndexes: TArr;
  197. Begin
  198.     SetLength (MinIndexes, Order);
  199.     For I := 0 To High(Matrix) Do
  200.     Begin
  201.         Min := Matrix[I][0];
  202.         MinIndexes[I] := 0;
  203.         For J := 1 To High(Matrix) Do
  204.             If (Matrix[I][J] <= Min) Then
  205.             Begin
  206.                 Min := Matrix[I][J];
  207.                 MinIndexes[I] := J;
  208.             End;
  209.     End;
  210.     SmallestElementsInLine := MinIndexes;
  211. End;
  212.  
  213. Function LargestElementsInColumn(Matrix: TMatrix; Order: Integer): TArr;
  214. Var
  215.     I, J, Max: Integer;
  216.     MaxIndexes: TArr;
  217. Begin
  218.     SetLength (MaxIndexes, Order);
  219.     For J := 0 To High(Matrix) Do
  220.     Begin
  221.         Max := Matrix[0][J];
  222.         MaxIndexes[J] := 0;
  223.         For I := 1 To High(Matrix) Do
  224.             If (Matrix[I][J] >= Max) Then
  225.             Begin
  226.                 Max := Matrix[I][J];
  227.                 MaxIndexes[J] := I;
  228.             End;
  229.     End;
  230.     LargestElementsInColumn := MaxIndexes;
  231. End;
  232.  
  233. Procedure FindingMatrixSaddlePoints(Matrix: TMatrix; IsConsoleAnswer: Boolean);
  234. Var
  235.     MaxElemIndexes, MinElemIndexes: TArr;
  236.     I, J, Order, SaddlePoint: Integer;
  237.     IsSaddlePoint, PathForRead, IsCorrect: Boolean;
  238.     Path: String;
  239.     F: TextFile;
  240. Begin
  241.     Order := High(Matrix) + 1;
  242.     MinElemIndexes := SmallestElementsInLine(Matrix, Order);
  243.     MaxElemIndexes := LargestElementsInColumn(Matrix, Order);
  244.     For I := 0 To High(Matrix) Do
  245.         For J := 0 To High(Matrix) Do
  246.             If (MinElemIndexes[I] = J) And (MaxElemIndexes[J] = I) Then
  247.             Begin
  248.                 SaddlePoint := Matrix[I][J];
  249.                 IsSaddlePoint := True;
  250.             End;
  251.     If (IsConsoleAnswer) Then
  252.     Begin
  253.         If (IsSaddlePoint) Then
  254.             Write ('Седловая точка матрицы: ', SaddlePoint)
  255.         Else
  256.             Write ('Седловой точки нет');
  257.     End
  258.     Else
  259.     Begin
  260.         PathForRead := False;
  261.         Repeat
  262.             IsCorrect := True;
  263.             Path := FileInputPath(PathForRead);
  264.             AssignFile(F, Path);
  265.             Try
  266.                 ReWrite(F);
  267.             Except
  268.                 Writeln ('Не удалось открыть файл. Повторите попытку...');
  269.                 IsCorrect := False;
  270.             End;
  271.         Until (IsCorrect);
  272.         If (IsSaddlePoint) Then
  273.             Write (F, 'Седловая точка матрицы: ', SaddlePoint)
  274.         Else
  275.             Write (F, 'Седловой точки нет');
  276.         CloseFile(F);
  277.         Writeln ('Седловая точка матрицы записана в файл');
  278.     End;
  279. End;
  280.  
  281. Function FileChoice(): TMatrix;
  282. Var
  283.     Path: String;
  284.     Matrix: TMatrix;
  285.     Order: Integer;
  286.     IsPathForRead: Boolean;
  287. Begin
  288.     IsPathForRead := True;
  289.     Path := FileInputPath(IsPathForRead);
  290.     Order := FileInputMatrixOrder(Path);
  291.     SetLength(Matrix, Order, Order);
  292.     Matrix := FileMatrixInput(Path, Order);
  293.     FileChoice := Matrix;
  294. End;
  295.  
  296. Function ConsoleChoice(): TMatrix;
  297. Var
  298.     Order, SaddlePoint: Integer;
  299.     Matrix: TMatrix;
  300. Begin
  301.     Order := ConsoleInputMatrixOrder();
  302.     Matrix := ConsoleMatrixCreation(Order);
  303.     ConsolMatrixOutput(Matrix);
  304.     ConsoleChoice := Matrix;
  305. End;
  306.  
  307. Function ChooseOutputMethod(): Integer;
  308. Var
  309.     IsCorrect: Boolean;
  310.     Choice: Integer;
  311. Begin
  312.     Repeat
  313.         IsCorrect := True;
  314.         Try
  315.             Readln(Choice);
  316.         Except
  317.             Writeln ('Число введено некорректно. Повторите попытку...');
  318.             IsCorrect := False;
  319.         End;
  320.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  321.         Begin
  322.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  323.             IsCorrect := False;
  324.         End;
  325.     Until (IsCorrect);
  326.     ChooseOutputMethod := Choice;
  327. End;
  328.  
  329. Procedure Solution();
  330. Var
  331.     Path: String;
  332.     Matrix: TMatrix;
  333.     Choice: Integer;
  334.     IsCorrect, IsConsoleAnswer, PathForRead: Boolean;
  335. Begin
  336.     IsConsoleAnswer := False;
  337.     Writeln ('Введите число, чтобы выбрать способ решения задания: 1 - через консоль, 2 - через файл');
  338.     Choice := ChooseOutputMethod();
  339.     If (Choice = 1) Then
  340.     Begin
  341.         IsConsoleAnswer := True;
  342.         Matrix := ConsoleChoice();
  343.         FindingMatrixSaddlePoints(Matrix, IsConsoleAnswer);
  344.     End
  345.     Else
  346.     Begin
  347.         Matrix := FileChoice();
  348.         Writeln ('Введите число, чтобы выбрать способ вывода решения задания: 1 - через консоль, 2 - через файл');
  349.         Choice := ChooseOutputMethod();
  350.         If (Choice = 1) Then
  351.         Begin
  352.             IsConsoleAnswer := True;
  353.             FindingMatrixSaddlePoints(Matrix, IsConsoleAnswer);
  354.         End
  355.         Else
  356.             FindingMatrixSaddlePoints(Matrix, IsConsoleAnswer);
  357.     End;
  358. End;
  359.  
  360. Begin
  361.     WriteTask();
  362.     Solution();
  363.     Readln;
  364. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement