Advertisement
Vladislav8653

laba_3_5_delphi

Dec 8th, 2022 (edited)
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.86 KB | None | 0 0
  1. Program Lab_2_3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMatrix = Array of Array of Real;
  8.     TArray = Array of Real;
  9.  
  10. Function InputData() : Integer;
  11. Var
  12.     IsCorrect : Boolean;
  13.     N : Integer;
  14. Begin
  15.     N := 0;
  16.     Repeat
  17.         IsCorrect := True;
  18.         Try
  19.             Readln(N)
  20.         Except
  21.             Writeln('Please, enter a integer number:');
  22.             IsCorrect := False;
  23.         End;
  24.     Until(IsCorrect);
  25.     InputData := N;
  26. End;
  27.  
  28. Function ReadCountRoots () : Integer;
  29. Var
  30.     Num : Integer;
  31.     IsCorrect : Boolean;
  32. Const
  33.     MIN_SIZE = 2;
  34. Begin
  35.     Repeat
  36.         IsCorrect := True;
  37.         Num := InputData();
  38.         If (Num < MIN_SIZE) Then
  39.         Begin
  40.             Writeln('Please, enter a number > 2:');
  41.             IsCorrect := False
  42.         End;
  43.     Until IsCorrect;
  44.     ReadCountRoots := Num;
  45. End;
  46.  
  47. Function Choose() : Boolean;
  48. Var
  49.     InputNumber : Integer;
  50.     IsCorrect : Boolean;
  51. Const
  52.     MIN_NUM = 0;
  53.     MAX_NUM = 1;
  54. Begin
  55.     Repeat
  56.         IsCorrect := True;
  57.         InputNumber := InputData();
  58.         If ((InputNumber < MIN_NUM) or (InputNumber > MAX_NUM)) then
  59.         Begin
  60.             Writeln('You are out of input range!');
  61.             IsCorrect := False;
  62.         End;
  63.  
  64.     Until IsCorrect;
  65.     If (InputNumber = 0) then
  66.         Choose := True
  67.     Else
  68.         Choose := False;
  69. End;
  70.  
  71. Function InputTriangularMatrixConsole(Num : Integer) : TMatrix;
  72. Var
  73.     I, J : Integer;
  74.     ArrOfMatrixElements : TMatrix;
  75. Begin
  76.       SetLength(ArrOfMatrixElements, Num, Num);
  77.       Dec(Num);
  78.     For I := 0 To Num Do
  79.             For J := 0 To Num Do
  80.             ArrOfMatrixElements[I,J] := 0;
  81.       For I := 0 To Num Do
  82.       Begin
  83.             For J := 0 To Num Do
  84.             Begin
  85.                   If (J - I > - 1) Then
  86.                   Begin
  87.                         Write('a[',(i + 1), ',', (j + 1), '] = ');
  88.                         ArrOfMatrixElements[I,J] := InputData();
  89.                   End;
  90.             End;
  91.       End;
  92.       InputTriangularMatrixConsole := ArrOfMatrixElements;
  93. End;
  94.  
  95. Function InputFreeMembersConsole(Num : Integer) : TArray;
  96. Var
  97.       I : Integer;
  98.       ArrOfFreeMembers : TArray;
  99. Begin
  100.       SetLength(ArrOfFreeMembers, Num);
  101.       Dec(Num);
  102.       For I := 0 To Num Do
  103.       Begin
  104.             Write ('b[',(i + 1), '] = ');
  105.             ArrOfFreeMembers[I] := InputData();
  106.       End;
  107.       InputFreeMembersConsole := ArrOfFreeMembers;
  108. End;
  109.  
  110. Function RandomizeOtherElements (Num : Integer; ArrOfMatrixElements : TMatrix) : TMatrix;
  111. Var
  112.     Diff, I, J, Q : Integer;
  113.     Max, Min : Real;
  114.     ArrOfMatrixElementsRandom : TMatrix;
  115. Begin
  116.     Setlength(ArrOfMatrixElementsRandom, Num, Num);
  117.     Max := ArrOfMatrixElements[0][0];
  118.     Min := ArrOfMatrixElements[0][0];
  119.     Dec(Num);
  120.     for I := 0 to Num do
  121.         for J := 0 to Num do
  122.         Begin
  123.             if ArrOfMatrixElements[I,J] > Max then
  124.                 Max := ArrOfMatrixElements[I,J];
  125.             if ArrOfMatrixElements[I,J] < Min then
  126.                 Min := ArrOfMatrixElements[I,J];
  127.         End;
  128.     Diff := Round(Max - Min);
  129.     for I := 0 to Num do
  130.         for J := 0 to Num do
  131.            ArrOfMatrixElementsRandom[I,J] := 0;
  132.     for I := 0 to Num do
  133.         for J := 0 to Num do
  134.             if J - I < 0 then
  135.             Begin
  136.                 Q := Round(Min) + Random(Diff);
  137.                 ArrOfMatrixElementsRandom[I,J] := Q;
  138.             End;
  139.     RandomizeOtherElements := ArrOfMatrixElementsRandom;
  140. End;
  141.  
  142. Function CreateMatrix ( ArrOfMatrixElements : TMatrix; Num : Integer; ArrOfMatrixElementsRandom: TMatrix; ArrOfFreeMembers : TArray) : TMatrix;
  143. Var
  144.     I, J : Integer;
  145.     Matrix : TMatrix;
  146. Begin
  147.     Setlength(Matrix, Num, Num + 1);
  148.     Dec(Num);
  149.     for I := 0 to Num do
  150.         for J := 0 to Num do
  151.         Begin
  152.             if J - I < 0 then
  153.                 Matrix[I,J] := ArrOfMatrixElementsRandom[I,J];
  154.             if J - I > -1 then
  155.                 Matrix[I,J] := ArrOfMatrixElements[I,J];
  156.         End;
  157.     for I := 0 to Num do
  158.         Matrix[I][Num + 1]:= ArrOfFreeMembers[I];
  159.     CreateMatrix := Matrix;
  160. End;
  161.  
  162. Procedure MoveStrings(Matrix : TMatrix; FirstRow : Integer; SecondRow : Integer; Num : Integer);
  163. Var
  164.     LastNum, J : Integer;
  165.     R : Real;
  166. Begin
  167.     LastNum := Num + 1;
  168.     If (FirstRow < Lastnum) and (SecondRow < LastNum) then
  169.     Begin
  170.         For J := 0 To Num Do
  171.         Begin
  172.             R := Matrix[SecondRow][J];
  173.             Matrix[SecondRow][J] := Matrix[FirstRow][J];
  174.             Matrix[FirstRow][J] := R;
  175.         End;
  176.     End;
  177. End;
  178.  
  179. Function NewMatrix (Matrix : TMatrix; Num : Integer): TMatrix;
  180. Var
  181.     TmpI, LastNum1, LastNum2, J, I, M: Integer;
  182.     K : Real;
  183. Begin
  184.     LastNum1 := Num - 1;
  185.     LastNum2 := Num + 1;
  186.     For J := 0 to Num - 1 do
  187.     Begin
  188.         If (Matrix[J,J] = 0) and (J < LastNum1) then
  189.         Begin
  190.             TmpI := J + 1;
  191.             Repeat
  192.                 If Matrix[TmpI,J] <> 0 then
  193.                     MoveStrings(Matrix, J, TmpI, Num);
  194.             Until (Matrix[J,J] = 0);
  195.         End;
  196.         for I := J + 1 to Num - 1 do
  197.         Begin
  198.             K := Matrix[i][j] / Matrix[j][j];
  199.             For M := J to LastNum2 - 1 do
  200.                matrix[i][m] := matrix[i][m] - k * matrix[j][m];
  201.         End;
  202.     End;
  203.     NewMatrix := Matrix;
  204. End;
  205.  
  206. Function FindRoots (Matrix : TMatrix; Num : Integer) : TArray;
  207. Var
  208.     Sum : Real;
  209.     TmpRoots : TArray;
  210.     I, j : Integer;
  211. Begin
  212.     Setlength(TmpRoots, Num);
  213.     For I := Num - 1 downto 0 do
  214.     Begin
  215.         Sum := 0;
  216.         for J := I + 1 to Num - 1 do
  217.             Sum := Sum + TmpRoots[j] * Matrix[i][j];
  218.         if (Matrix[i][i] = 0) then
  219.             TmpRoots[i] := 0
  220.         else
  221.             tmpRoots[i] := (matrix[i][num] - sum) / matrix[i][i];
  222.     End;
  223.     FindRoots := TmpRoots
  224. End;
  225.  
  226.  
  227. Procedure WriteMatrixInC(Matrix : TMatrix; Num : Integer);
  228. Var
  229.     I, J : Integer;
  230. Begin
  231.     Writeln('Your virgin matrix:');
  232.     for I := 0 to Num - 1 do
  233.     Begin
  234.         for J := 0 to Num do
  235.             Write(Matrix[I,J], ' ');
  236.         Writeln;
  237.     End;
  238. End;
  239.  
  240. Function GaussM(Matrix : TMatrix; Num : Integer) : TArray;
  241. Begin
  242.     WriteMatrixInC(matrix, Num);
  243.     NewMatrix(matrix, Num);
  244.     GaussM := FindRoots(Matrix, Num);
  245. End;
  246.  
  247. Procedure OutputSystemRoots(ArrOfSystemRoots : TArray; Num : Integer);
  248. Var
  249.     I : Integer;
  250. Begin
  251.     Dec(Num);
  252.     For I := 0 To Num Do
  253.         Writeln('x[', I + 1, '] = ', arrOfSystemRoots[I], ' ');
  254. End;
  255.  
  256. Function InputFilePath() : String;
  257. Var
  258.     IsCorrect : Boolean;
  259.     Path : String;
  260. Begin
  261.     Writeln('Input path to file: ');
  262.     Repeat
  263.         IsCorrect := True;
  264.         Readln(Path);
  265.         If(Not FileExists(Path)) Then
  266.         Begin
  267.             IsCorrect := False;
  268.             Writeln('Wrong way to file. Input correct path.');
  269.         End
  270.         Else If (ExtractFileExt(Path) <> '.txt') Then
  271.         Begin
  272.             Writeln('Must have .txt');
  273.             IsCorrect := False;
  274.         End;
  275.     Until IsCorrect;
  276.     InputFilePath := Path;
  277. End;
  278.  
  279. Function InputSizeOfMatrixFromFile(Path : String) : Integer;
  280. Var
  281.     Num : Integer;
  282.     IsCorrect : Boolean;
  283.     InputFile : TextFile;
  284. Const
  285.     MIN = 2;
  286. Begin
  287.     Num := 0;
  288.     AssignFile(InputFile, Path);
  289.     Reset(InputFile);
  290.     IsCorrect := True;
  291.     Try
  292.         Readln(InputFile, Num);
  293.     Except
  294.         IsCorrect := False;
  295.         Writeln('Mistake of reading size of array from file.');
  296.     End;
  297.     If (IsCorrect And (Num < MIN)) Then
  298.         Writeln('Mistake of array elements.');
  299.     CloseFile(InputFile);
  300.     InputSizeOfMatrixFromFile := Num;
  301. End;
  302.  
  303. Function InputTriangularMatrixFile(Path : String; Num : Integer) : TMatrix;
  304. Var
  305.     I, J : Integer;
  306.     ArrOfMatrixElements : TMatrix;
  307.     IsCorrect : Boolean;
  308.     InputFile : TextFile;
  309. Begin
  310.     SetLength(ArrOfMatrixElements, Num, Num);
  311.     Dec(Num);
  312.     AssignFile(InputFile, Path);
  313.     Reset(InputFile);
  314.     Readln(InputFile);
  315.     Repeat
  316.         IsCorrect := True;
  317.         For I := 0 To Num Do
  318.         Begin
  319.             For J := 0 To Num Do
  320.             Begin
  321.                 If (J - I > - 1) Then
  322.                 Begin
  323.                     Try
  324.                         Read(InputFile, ArrOfMatrixElements[I, J]);
  325.                     Except
  326.                         IsCorrect := False;
  327.                         Writeln('Mistake of reading from file.')
  328.                     End;
  329.                     If (IsCorrect And (ArrOfMatrixElements[I, J] < -100) Or (ArrOfMatrixElements[I, J] > 100)) Then
  330.                     Begin
  331.                         IsCorrect := False;
  332.                         Writeln('Wrong number in file.');
  333.                     End;
  334.                 End;
  335.             End;
  336.         End;
  337.  
  338.     Until IsCorrect;
  339.  
  340.     InputTriangularMatrixFile := ArrOfMatrixElements;
  341. End;
  342.  
  343. Function InputFreeMembersFile(Path : String; Num : Integer) : TArray;
  344. Var
  345.     I: Integer;
  346.     ArrOfFreeMembers : TArray;
  347.     IsCorrect : Boolean;
  348.     InputFile : TextFile;
  349. Begin
  350.     SetLength(ArrOfFreeMembers, Num);
  351.     Dec(Num);
  352.  
  353.     Repeat
  354.         IsCorrect := True;
  355.         For I := 0 To Num Do
  356.         Begin
  357.             Try
  358.                 Read(InputFile, ArrOfFreeMembers[I]);
  359.             Except
  360.                 IsCorrect := False;
  361.                 Writeln('Mistake of reading from file.')
  362.             End;
  363.             If (IsCorrect And (ArrOfFreeMembers[I] < -100) Or (ArrOfFreeMembers[I] > 100)) Then
  364.             Begin
  365.                 IsCorrect := False;
  366.                 Writeln('Wrong number in file.');
  367.             End;
  368.  
  369.         End;
  370.  
  371.     Until IsCorrect;
  372.  
  373.     InputFreeMembersFile := ArrOfFreeMembers;
  374. End;
  375.  
  376. Procedure FileOutput(Path : String; Arr : TArray);
  377. Var
  378.     IsCorrect : Boolean;
  379.     OutputFile : TextFile;
  380.     I: Integer;
  381. Begin
  382.     AssignFile(OutputFile, Path);
  383.     Repeat
  384.         IsCorrect := True;
  385.         Try
  386.             Rewrite(OutputFile);
  387.         Except
  388.             IsCorrect := False;
  389.             Writeln('Mistake with writing in file. Input another path.');
  390.             Path := InputFilePath();
  391.         End;
  392.     Until IsCorrect;
  393.     Writeln(OutputFile, 'Sorted array:');
  394.     For I := 0 To High(Arr) Do
  395.         Write(OutputFile, Arr[I], ' ');
  396.     CloseFile(OutputFile);
  397.     Write('Success!');
  398. End;
  399.  
  400. Var
  401.     Path : String;
  402.   Num : Integer;
  403.     ArrOfMatrixElements, ArrOfMatrixElementsRandom, Matrix: TMatrix;
  404.     ArrOfFreeMembers, Roots : TArray;
  405.   Choice : Boolean;
  406. Begin
  407.     Writeln('Gauss method. Input elements above main diagonal and free members.');
  408.     Writeln('Type 0 - console input, type 1 - file input.');
  409.     Choice := Choose();
  410.     If (Choice) Then
  411.     Begin
  412.         Writeln('Input number of unknown equations: ');
  413.         Num := readCountRoots();
  414.         Writeln('Input matrix elements: ');
  415.         ArrOfMatrixElements := InputTriangularMatrixConsole(Num);
  416.         Writeln('Input free members: ');
  417.         ArrOfFreeMembers := InputFreeMembersConsole(Num);
  418.     End
  419.     Else
  420.     Begin
  421.         Path := InputFilePath();
  422.         Num := InputSizeOfMatrixFromFile(Path);
  423.         ArrOfMatrixElements := InputTriangularMatrixFile(Path, Num);
  424.         ArrOfFreeMembers := InputFreeMembersFile(Path, Num);
  425.     End;
  426.  
  427.   ArrOfMatrixElementsRandom := RandomizeOtherElements(num, arrOfMatrixElements);
  428.   Matrix := CreateMatrix(arrOfMatrixElements, num, arrOfMatrixElementsRandom, arrOfFreeMembers);
  429.   Roots := GaussM(matrix, num);
  430.  
  431.     Writeln('Type 0 - console output, type 1 - file output.');
  432.     Choice := Choose();
  433.     If (Choice) Then
  434.       OutputSystemRoots(Roots, Num)
  435.     Else
  436.           FileOutput (Path, Roots);
  437.     Readln;
  438. End.
  439.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement