Advertisement
ksyshshot

Lab_2.4

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