Advertisement
ksyshshot

Lab_2.4

Nov 1st, 2022 (edited)
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.46 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.     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. Function FindingMatrixSaddlePoints(Matrix: TMatrix; Order: Integer): TBool;
  212. Var
  213.     MaxElemIndexes, MinElemIndexes: TArr;
  214.     SaddlePoints: TBool;
  215.     I, J: Integer;
  216. Begin
  217.     SetLength (SaddlePoints, Order, Order);
  218.     MinElemIndexes := SmallestElementsInLine(Matrix, Order);
  219.     MaxElemIndexes := LargestElementsInColumn(Matrix, Order);
  220.     For I := 0 To High(Matrix) Do
  221.     Begin
  222.         For J := 0 To High(Matrix) Do
  223.         Begin
  224.             If (MinElemIndexes[I] = J) And (MaxElemIndexes[J] = I) Then
  225.                 SaddlePoints[I][J] := True;
  226.         End;
  227.     End;
  228.     FindingMatrixSaddlePoints := SaddlePoints;
  229. End;
  230.  
  231. Procedure FileSaddlePointsOutput(Matrix: TMatrix; Order: Integer);
  232. Var
  233.     Path: String;
  234.     IsFileForRead: Boolean;
  235.     IsSaddlePoint: TBool;
  236.     I, J, CountNotSaddle: Integer;
  237.     F: TextFile;
  238. Begin
  239.     IsFileForRead := False;
  240.     Path := FileInputPath(IsFileForRead);
  241.     IsSaddlePoint := FindingMatrixSaddlePoints(Matrix, Order);
  242.     AssignFile(F, Path);
  243.     ReWrite(F);
  244.     Write (F, 'Седловая точка матрицы: ');
  245.     For I := 0 To High(Matrix) Do
  246.         For J := 0 To High(Matrix) Do
  247.             If (IsSaddlePoint[I][J]) Then
  248.                 Writeln (F, Matrix[I][J])
  249.             Else
  250.                 Inc(CountNotSaddle);
  251.     If  (CountNotSaddle = (Order + 1) * (Order + 1)) Then
  252.         Writeln (F, 'Такой нет');
  253.     CloseFile(F);
  254.     Writeln ('Седловая точка матрицы записана в файл');
  255. End;
  256.  
  257. Procedure ConsoleSaddlePointsOutput(Matrix: TMatrix; Order: Integer);
  258. Var
  259.     I, J, CountNotSaddle: Integer;
  260.     SaddleElements: TBool;
  261. Begin
  262.     SaddleElements := FindingMatrixSaddlePoints(Matrix, Order);
  263.     Writeln ('Седловая точка матрицы:');
  264.     For I := 0 To High(Matrix) Do
  265.         For J := 0 To High(Matrix) Do
  266.             If (SaddleElements[I][J]) Then
  267.                 Writeln (Matrix[I][J])
  268.             Else
  269.                 Inc(CountNotSaddle);
  270.     If (CountNotSaddle = (Order) * (Order)) Then
  271.         Writeln ('Такой нет');
  272. End;
  273.  
  274. Procedure ConsoleChoice();
  275. Var
  276.     Order: Integer;
  277.     Matrix: TMatrix;
  278.     Saddles: TBool;
  279. Begin
  280.     Order := ConsoleInputMatrixOrder();
  281.     Matrix := ConsoleMatrixCreation(Order);
  282.     ConsolMatrixOutput(Matrix, Order);
  283.     Saddles := FindingMatrixSaddlePoints(Matrix, Order);
  284.     ConsoleSaddlePointsOutput(Matrix, Order);
  285. End;
  286.  
  287. Procedure FileChoice();
  288. Var
  289.     Matrix: TMatrix;
  290.     Path: String;
  291.     Order, Choice: Integer;
  292.     PathForRead, IsCorrect: Boolean;
  293.     Saddles: TBool;
  294. Begin
  295.     PathForRead := True;
  296.     Path := FileInputPath(PathForRead);
  297.     Order := FileInputMatrixOrder(Path);
  298.     SetLength(Matrix, Order, Order);
  299.     FileMatrixInput(Matrix, Path, Order);
  300.     Saddles := FindingMatrixSaddlePoints(Matrix, Order);
  301.     Writeln ('Введите число, чтобы выбрать способ вывода решения задания: 1 - через консоль, 2 - через файл');
  302.     Repeat
  303.         IsCorrect := True;
  304.         Try
  305.             Readln(Choice);
  306.         Except
  307.             Writeln ('Число введено некорректно. Повторите попытку...');
  308.             IsCorrect := False;
  309.         End;
  310.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  311.         Begin
  312.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  313.             IsCorrect := False;
  314.         End;
  315.     Until (IsCorrect);
  316.     If (Choice = 1) Then
  317.         ConsoleSaddlePointsOutput(Matrix, Order)
  318.     Else
  319.         FileSaddlePointsOutput(Matrix, Order);
  320. End;
  321.  
  322. Procedure Solution();
  323. Var
  324.     Choice: Integer;
  325.     IsCorrect: Boolean;
  326. Begin
  327.     Writeln ('Введите число, чтобы выбрать способ решения задания: 1 - через консоль, 2 - через файл');
  328.     Repeat
  329.         IsCorrect := True;
  330.         Try
  331.             Readln(Choice);
  332.         Except
  333.             Writeln ('Число введено некорректно. Повторите попытку...');
  334.             IsCorrect := False;
  335.         End;
  336.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  337.         Begin
  338.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  339.             IsCorrect := False;
  340.         End;
  341.     Until (IsCorrect);
  342.     If (Choice = 1) Then
  343.         ConsoleChoice()
  344.     Else
  345.         FileChoice();
  346. End;
  347.  
  348. Begin
  349.     WriteTask();
  350.     Solution();
  351.     Readln;
  352. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement