Advertisement
ksyshshot

Lab_2.4

Nov 1st, 2022 (edited)
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.64 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. Procedure FileMatrixInput(Matrix: TMatrix; Path: String; Order: Integer);
  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.     Dec(Order);
  139.     For I := 0 To Order Do
  140.         For J := 0 To Order Do
  141.             Repeat
  142.                 Writeln ('Введите ', (J + 1), ' элемент ', (I + 1), ' строки');
  143.                 IsCorrect := True;
  144.                 Try
  145.                     Readln (Matrix[I][J]);
  146.                 Except
  147.                     Writeln ('Ошибка ввода! Повторите попытку...');
  148.                     IsCorrect := False;
  149.                 End;
  150.                 If ((IsCorrect) And ((Matrix[I][J] < MIN_ELEMENT) Or (Matrix[I][J] > MAX_ELEMENT))) Then
  151.                 Begin
  152.                     Writeln ('Ошибка ввода! Введено число неверного диапазона');
  153.                     IsCorrect := False;
  154.                 End;
  155.             Until (IsCorrect);
  156.     ConsoleMatrixCreation := Matrix;
  157. End;
  158.  
  159. Procedure ConsolMatrixOutput(Matrix: TMatrix; Order: Integer);
  160. Var
  161.     I, J: Integer;
  162. Begin
  163.     Writeln ('Исходная матрица:');
  164.     I := 0;
  165.     J := 0;
  166.     While I < Order Do
  167.     Begin
  168.         While J < Order Do
  169.         Begin
  170.             Write (Matrix[I][J], ' ');
  171.             Inc (J);
  172.         End;
  173.         J := 0;
  174.         Writeln;
  175.         Inc(I);
  176.     End;
  177. End;
  178.  
  179. Function SmallestElementsInLine(Matrix: TMatrix; Order: Integer): TArr;
  180. Var
  181.     I, J, Min: Integer;
  182.     MinIndexes: TArr;
  183. Begin
  184.     SetLength (MinIndexes, Order);
  185.     Dec(Order);
  186.     For I := 0 To Order Do
  187.     Begin
  188.         Min := Matrix[I][0];
  189.         MinIndexes[I] := 0;
  190.         For J := 1 To Order Do
  191.             If (Matrix[I][J] <= Min) Then
  192.             Begin
  193.                 Min := Matrix[I][J];
  194.                 MinIndexes[I] := J;
  195.             End;
  196.     End;
  197.     SmallestElementsInLine := MinIndexes;
  198. End;
  199.  
  200. Function LargestElementsInColumn(Matrix: TMatrix; Order: Integer): TArr;
  201. Var
  202.     I, J, Max: Integer;
  203.     MaxIndexes: TArr;
  204. Begin
  205.     SetLength (MaxIndexes, Order);
  206.     Dec(Order);
  207.     For J := 0 To Order Do
  208.     Begin
  209.         Max := Matrix[0][J];
  210.         MaxIndexes[J] := 0;
  211.         For I := 1 To Order Do
  212.             If (Matrix[I][J] >= Max) Then
  213.             Begin
  214.                 Max := Matrix[I][J];
  215.                 MaxIndexes[J] := I;
  216.             End;
  217.     End;
  218.     LargestElementsInColumn := MaxIndexes;
  219. End;
  220.  
  221. Function FindingMatrixSaddlePoints(Matrix: TMatrix; Order: Integer): TBool;
  222. Var
  223.     MaxElemIndexes, MinElemIndexes: TArr;
  224.     SaddlePoints: TBool;
  225.     I, J: Integer;
  226. Begin
  227.     SetLength (SaddlePoints, Order, Order);
  228.     MinElemIndexes := SmallestElementsInLine(Matrix, Order);
  229.     MaxElemIndexes := LargestElementsInColumn(Matrix, Order);
  230.     Dec(Order);
  231.     For I := 0 To Order Do
  232.     Begin
  233.         For J := 0 To Order Do
  234.         Begin
  235.             If (MinElemIndexes[I] = J) And (MaxElemIndexes[J] = I) Then
  236.                 SaddlePoints[I][J] := True;
  237.         End;
  238.     End;
  239.     FindingMatrixSaddlePoints := SaddlePoints;
  240. End;
  241.  
  242. Procedure FileSaddlePointsOutput(Matrix: TMatrix; Order: Integer);
  243. Var
  244.     Path: String;
  245.     IsFileForRead: Boolean;
  246.     IsSaddlePoint: TBool;
  247.     I, J, CountNotSaddle: Integer;
  248.     F: TextFile;
  249. Begin
  250.     IsFileForRead := False;
  251.     Path := FileInputPath(IsFileForRead);
  252.     IsSaddlePoint := FindingMatrixSaddlePoints(Matrix, Order);
  253.     Dec(Order);
  254.     AssignFile(F, Path);
  255.     ReWrite(F);
  256.     Write (F, 'Седловая точка матрицы: ');
  257.     For I := 0 To Order Do
  258.         For J := 0 To Order Do
  259.             If (IsSaddlePoint[I][J]) Then
  260.                 Writeln (F, Matrix[I][J])
  261.             Else
  262.                 Inc(CountNotSaddle);
  263.     If  (CountNotSaddle = (Order + 1) * (Order + 1)) Then
  264.         Writeln (F, 'Такой нет');
  265.     CloseFile(F);
  266.     Writeln ('Седловая точка матрицы записана в файл');
  267. End;
  268.  
  269. Procedure ConsoleSaddlePointsOutput(Matrix: TMatrix; Order: Integer);
  270. Var
  271.     I, J, CountNotSaddle: Integer;
  272.     SaddleElements: TBool;
  273. Begin
  274.     SaddleElements := FindingMatrixSaddlePoints(Matrix, Order);
  275.     Dec(Order);
  276.     Writeln ('Седловая точка матрицы:');
  277.     For I := 0 To Order Do
  278.         For J := 0 To Order Do
  279.             If (SaddleElements[I][J]) Then
  280.                 Writeln (Matrix[I][J])
  281.             Else
  282.                 Inc(CountNotSaddle);
  283.     If (CountNotSaddle = (Order + 1) * (Order + 1)) Then
  284.         Writeln ('Такой нет');
  285. End;
  286.  
  287. Procedure ConsoleChoice();
  288. Var
  289.     Order: Integer;
  290.     Matrix: TMatrix;
  291.     Saddles: TBool;
  292. Begin
  293.     Order := ConsoleInputMatrixOrder();
  294.     Matrix := ConsoleMatrixCreation(Order);
  295.     ConsolMatrixOutput(Matrix, Order);
  296.     Saddles := FindingMatrixSaddlePoints(Matrix, Order);
  297.     ConsoleSaddlePointsOutput(Matrix, Order);
  298. End;
  299.  
  300. Procedure FileChoice();
  301. Var
  302.     Matrix: TMatrix;
  303.     Path: String;
  304.     Order, Choice: Integer;
  305.     PathForRead, IsCorrect: Boolean;
  306.     Saddles: TBool;
  307. Begin
  308.     PathForRead := True;
  309.     Path := FileInputPath(PathForRead);
  310.     Order := FileInputMatrixOrder(Path);
  311.     SetLength(Matrix, Order, Order);
  312.     FileMatrixInput(Matrix, Path, Order);
  313.     Saddles := FindingMatrixSaddlePoints(Matrix, Order);
  314.     Writeln ('Введите число, чтобы выбрать способ вывода решения задания: 1 - через консоль, 2 - через файл');
  315.     Repeat
  316.         IsCorrect := True;
  317.         Try
  318.             Readln(Choice);
  319.         Except
  320.             Writeln ('Число введено некорректно. Повторите попытку...');
  321.             IsCorrect := False;
  322.         End;
  323.         If (IsCorrect) And (Choice <> 1) Then
  324.             If (Choice <> 2) Then
  325.             Begin
  326.                 Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  327.                 IsCorrect := False;
  328.             End;
  329.     Until (IsCorrect);
  330.     If (Choice = 1) Then
  331.         ConsoleSaddlePointsOutput(Matrix, Order)
  332.     Else
  333.         FileSaddlePointsOutput(Matrix, Order);
  334. End;
  335.  
  336. Procedure Solution();
  337. Var
  338.     Choice: Integer;
  339.     IsCorrect: Boolean;
  340. Begin
  341.     Writeln ('Введите число, чтобы выбрать способ решения задания: 1 - через консоль, 2 - через файл');
  342.     Repeat
  343.         IsCorrect := True;
  344.         Try
  345.             Readln(Choice);
  346.         Except
  347.             Writeln ('Число введено некорректно. Повторите попытку...');
  348.             IsCorrect := False;
  349.         End;
  350.         If (IsCorrect) And (Choice <> 1) Then
  351.             If (Choice <> 2) Then
  352.             Begin
  353.                 Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  354.                 IsCorrect := False;
  355.             End;
  356.     Until (IsCorrect);
  357.     If (Choice = 1) Then
  358.         ConsoleChoice()
  359.     Else
  360.         FileChoice();
  361. End;
  362.  
  363. Begin
  364.     WriteTask();
  365.     Solution();
  366.     Readln;
  367. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement