Advertisement
anticlown

laba.2.3.Gay_ss(Delphi)

Nov 3rd, 2022 (edited)
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.73 KB | None | 0 0
  1. Program Laba_2_3;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. Uses
  6.   System.SysUtils;
  7. Const
  8.   MIN_SIZE = 2;
  9.   MAX_SIZE = 10;
  10.   MIN_VALUE = -1000;
  11.   MAX_VALUE = 1000;
  12. Type
  13.   TMatrix = Array Of Array Of Double;
  14.   TArr = Array Of Double;
  15.   TSet = Set Of Char;
  16.  
  17. Procedure OutputTaskInfo();
  18. Begin
  19.   Writeln('Данная программа выполняет «прямой ход» в решении СЛАУ методом Гаусса.');
  20.   Writeln('Диапазон ввода значений количества уравнений в системе: ', MIN_SIZE, '...', MAX_SIZE, '.');
  21.   Writeln('Диапазон ввода значений коэффициентов при переменных: ', MIN_VALUE, '...', MAX_VALUE, '.');
  22. End;
  23.  
  24. Function InputPathToFile(): String;
  25. Var
  26.   Path: String;
  27.   IsCorrect: Boolean;
  28. Begin
  29.   Write('Укажите путь к файлу: ');
  30.  
  31.   Repeat
  32.     IsCorrect := True;
  33.     Readln(Path);
  34.  
  35.     If Not FileExists(Path) Then
  36.     Begin
  37.       Write('По указанному пути файл не найден! Укажите правильный путь: ');
  38.       IsCorrect := False;
  39.     End
  40.     Else If ExtractFileExt(Path) <> '.txt' Then
  41.     Begin
  42.       Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
  43.       IsCorrect := False;
  44.     End;
  45.   Until IsCorrect;
  46.  
  47.   InputPathToFile := Path;
  48. End;
  49.  
  50. Function GetVerificationOfChoice(): Integer;
  51. Var
  52.   Choice: Integer;
  53.   IsCorrect: Boolean;
  54. Begin
  55.   Repeat
  56.     IsCorrect := True;
  57.     Try
  58.       Readln(Choice);
  59.     Except
  60.       Writeln('Проверьте корректность ввода данных!');
  61.       IsCorrect := False;
  62.     End;
  63.  
  64.     If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
  65.     Begin
  66.       Writeln('Для выбора введите 0 или 1!');
  67.       IsCorrect := False;
  68.     End;
  69.  
  70.   Until IsCorrect;
  71.  
  72.   GetVerificationOfChoice := Choice;
  73. End;
  74.  
  75. Function InputSizeFromConsole(): Integer;
  76. Var
  77.   Size: Integer;
  78.   IsCorrect: Boolean;
  79. Begin
  80.   Write('Введите значение количества уравнений системы: ');
  81.  
  82.   Repeat
  83.     IsCorrect := True;
  84.     Try
  85.       Readln(Size);
  86.     Except
  87.       Writeln('Проверьте корректность ввода данных!');
  88.       IsCorrect := False;
  89.     End;
  90.  
  91.     If (IsCorrect And ((Size < MIN_SIZE) Or (Size > MAX_SIZE))) Then
  92.     Begin
  93.       Writeln('Введите значение от ', MIN_SIZE, ' до ', MAX_SIZE, '!');
  94.       IsCorrect := False;
  95.     End;
  96.  
  97.   Until IsCorrect;
  98.  
  99.   InputSizeFromConsole := Size;
  100. End;
  101.  
  102. Function InputSizeFromFile(Const Path: String): Integer;
  103. Var
  104.   Size: Integer;
  105.   IsCorrect: Boolean;
  106.   InputFile: TextFile;
  107. Begin
  108.   AssignFile (InputFile, Path);
  109.   Reset(InputFile);
  110.  
  111.   IsCorrect := True;
  112.  
  113.   Writeln('Происходит чтение количества уравнений системы...');
  114.  
  115.   Try
  116.     Readln(InputFile, Size);
  117.   Except
  118.     IsCorrect := False;
  119.     Writeln('Ошибка при чтении данных! Введите количество уравнений с консоли!');
  120.     Size := InputSizeFromConsole();
  121.   End;
  122.  
  123.   If (IsCorrect And(((Size < MIN_SIZE) Or (Size > MAX_SIZE)))) Then
  124.   Begin
  125.     Writeln('В файле введено некорректное количество уравнений! Введите размер с консоли!');
  126.     Size := InputSizeFromConsole();
  127.   End;
  128.  
  129.   InputSizeFromFile := Size;
  130.   CloseFile (InputFile);
  131. End;
  132.  
  133. Procedure OutputSize(Const Choice, Size: Integer; Path: String);
  134. Var
  135.   OutputFile: TextFile;
  136.   IsCorrect: Boolean;
  137. Begin
  138.   If Choice = 0 Then
  139.     Writeln('Количество уравнений в системе равно: ', Size);
  140.  
  141.   If Choice = 1 Then
  142.   Begin
  143.     Writeln('Вывод количества уравнений в файл...');
  144.  
  145.     Repeat
  146.       IsCorrect := True;
  147.       AssignFile(OutputFile, Path);
  148.  
  149.       Try
  150.         Rewrite(OutputFile);
  151.       Except
  152.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  153.         IsCorrect := False;
  154.         Path := InputPathToFile();
  155.       End;
  156.  
  157.     Until IsCorrect;
  158.  
  159.     Write(OutputFile, Size);
  160.     Write(OutputFile, #13);
  161.  
  162.     Close(OutputFile);
  163.     Writeln('Данные успешно записаны в файл!');
  164.   End;
  165. End;
  166.  
  167. Function FillMatrixFromConsole(Const Size: Integer): TMatrix;
  168. Var
  169.   Matrix: TMatrix;
  170.   IsCorrect: Boolean;
  171.   I, J, Columns: Integer;
  172. Begin
  173.   SetLength(Matrix, Size, Size + 1);
  174.  
  175.   For I := Low(Matrix) To High(Matrix) Do
  176.     For J := Low(Matrix[0]) To High(Matrix[0]) Do
  177.     Begin
  178.       Write('Введите значение коэфф-та в ', I + 1, '-ом уравнении при ', J + 1, '-ой позиции: ');
  179.  
  180.       Repeat
  181.         IsCorrect := True;
  182.  
  183.         Try
  184.           Read(Matrix[I, J]);
  185.         Except
  186.           Writeln('Проверьте корректность ввода данных!');
  187.           IsCorrect := False;
  188.         End;
  189.  
  190.         If (IsCorrect And ((Matrix[I, J] < MIN_VALUE) Or (Matrix[I, J] > MAX_VALUE))) Then
  191.           Begin
  192.             Writeln('Введите число от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
  193.             IsCorrect := False;
  194.           End;
  195.  
  196.       Until IsCorrect;
  197.     End;
  198.  
  199.   FillMatrixFromConsole := Matrix;
  200. End;
  201.  
  202. Function FillMatrixFromFile(Const Size: Integer; Const Path: String): TMatrix;
  203. Var
  204.   Matrix: TMatrix;
  205.   IsCorrect: Boolean;
  206.   InputFile: TextFile;
  207.   I, J, Count, Columns: Integer;
  208.   Symbol: AnsiChar;
  209. Begin
  210.   AssignFile(InputFile, Path);
  211.   Reset(InputFile);
  212.   Readln(InputFile);
  213.  
  214.   SetLength(Matrix, Size, Size + 1);
  215.   Count := 0;
  216.  
  217.   Writeln('Происходит чтение системы уравнений...');
  218.  
  219.   While Not Eof(InputFile) Do
  220.   Begin
  221.     Read(InputFile, Symbol);
  222.  
  223.     If Symbol = ' ' Then
  224.       Inc(Count);
  225.   End;
  226.  
  227.   Close(InputFile);
  228.  
  229.   If Count > Size * (Size + 1) Then
  230.   Begin
  231.     Writeln('Ошибка при чтении системы! Введите систему с консоли!');
  232.     Matrix := FillMatrixFromConsole(Size);
  233.   End
  234.   Else
  235.   Begin
  236.     AssignFile(InputFile, Path);
  237.     Reset(InputFile);
  238.     Readln(InputFile);
  239.  
  240.     For I := Low(Matrix) To High(Matrix) Do
  241.     Begin
  242.       For J := Low(Matrix[0]) To High(Matrix[0]) Do
  243.       Begin
  244.         Repeat
  245.           IsCorrect := True;
  246.  
  247.           Try
  248.             Read(InputFile, Matrix[I, J]);
  249.           Except
  250.             Writeln('Ошибка при чтении системы! Введите систему с консоли!');
  251.             IsCorrect := False;
  252.             Matrix := FillMatrixFromConsole(Size);
  253.           End;
  254.  
  255.           If (IsCorrect And ((Matrix[I, J] < MIN_VALUE) Or (Matrix[I, J] > MAX_VALUE))) Then
  256.           Begin
  257.             Writeln('Ошибка при чтении системы! Введите систему с консоли!');
  258.             IsCorrect := False;
  259.             Matrix := FillMatrixFromConsole(Size);
  260.           End;
  261.         Until IsCorrect;
  262.       End;
  263.     End;
  264.  
  265.     Close(InputFile);
  266.   End;
  267.  
  268.   FillMatrixFromFile := Matrix;
  269. End;
  270.  
  271. Procedure OutputMatrix(Const Choice: Integer; Const Matrix: TMatrix; Path: String);
  272. Var
  273.   OutputFile: TextFile;
  274.   IsCorrect: Boolean;
  275.   I, J: Integer;
  276. Begin
  277.   If Choice = 0 Then
  278.   Begin
  279.     Writeln('Вывод начальной системы уравнений: ');
  280.  
  281.     For I := Low(Matrix) To High(Matrix) Do
  282.     Begin
  283.       Write('|');
  284.       For J := Low(Matrix) To High(Matrix) Do
  285.         Write(' ', Matrix[I, J]:5:0, ' ');
  286.       Write('| ', Matrix[I, High(Matrix) + 1]:5:0, ';');
  287.       Writeln('');
  288.     End;
  289.   End;
  290.  
  291.   If Choice = 1 Then
  292.   Begin
  293.     Writeln('Вывод начальной системы уравнений в файл...');
  294.  
  295.     Repeat
  296.       IsCorrect := True;
  297.       AssignFile(OutputFile, Path);
  298.  
  299.       Try
  300.         Append(OutputFile);
  301.       Except
  302.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  303.         IsCorrect := False;
  304.         Path := InputPathToFile();
  305.       End;
  306.  
  307.     Until IsCorrect;
  308.  
  309.     For I := Low(Matrix) To High(Matrix) Do
  310.     Begin
  311.       Write(OutputFile, '|');
  312.       For J := Low(Matrix) To High(Matrix) Do
  313.         Write(OutputFile, ' ', Matrix[I, J]:5:0, ' ');
  314.       Write(OutputFile, '| ', Matrix[I, High(Matrix) + 1]:5:0, ';');
  315.       Writeln(OutputFile, '');
  316.     End;
  317.     Write(OutputFile, #13);
  318.  
  319.     Close(OutputFile);
  320.     Writeln('Данные успешно записаны в файл!');
  321.   End;
  322. End;
  323.  
  324. Function CreateTriangleMatrix(const Matrix: TMatrix): TMatrix;
  325. Var
  326.   I, J, K, StartPosJ, FinalPosJ: Integer;
  327.   Temp: Real;
  328.   TriangleMatrix: TMatrix;
  329. Begin
  330.   SetLength(TriangleMatrix, Length(Matrix), Length(Matrix[0]));
  331.  
  332.   For I := Low(Matrix) To High(Matrix) Do
  333.     For J := Low(Matrix[0]) To High(Matrix[0]) Do
  334.       TriangleMatrix[I, J] := Matrix[I, J];
  335.  
  336.   For I := 0 To High(TriangleMatrix) Do
  337.      Begin
  338.        StartPosJ := I + 1;
  339.  
  340.        For J := StartPosJ To High(TriangleMatrix) Do
  341.           Begin
  342.             Temp := TriangleMatrix[J ,I] / TriangleMatrix[I, I];
  343.  
  344.             For K := I To High(TriangleMatrix) Do
  345.               TriangleMatrix[J, K] := TriangleMatrix[J, K] - Temp * TriangleMatrix[I, K];
  346.  
  347.               TriangleMatrix[J, High(TriangleMatrix[0])] := TriangleMatrix[J, High(TriangleMatrix[0])] - Temp * TriangleMatrix[I, High(TriangleMatrix[0])];
  348.           end;
  349.      end;
  350.  
  351.      CreateTriangleMatrix := TriangleMatrix;
  352. End;
  353.  
  354. Procedure OutputTriangleMatrix(Const Choice: Integer; Const Matrix: TMatrix; Path: String);
  355. Var
  356.   OutputFile: TextFile;
  357.   IsCorrect: Boolean;
  358.   I, J: Integer;
  359. Begin
  360.   If Choice = 0 Then
  361.   Begin
  362.     Writeln('Вывод преобразованной системы: ');
  363.  
  364.     For I := Low(Matrix) To High(Matrix) Do
  365.     Begin
  366.       Write('|');
  367.       For J := Low(Matrix) To High(Matrix) Do
  368.         Write(' ', Matrix[I, J]:5:2, ' ');
  369.       Write('| ', Matrix[I, High(Matrix) + 1]:5:2, ';');
  370.       Writeln('');
  371.     End;
  372.   End;
  373.  
  374.   If Choice = 1 Then
  375.   Begin
  376.     Writeln('Вывод преобразованной системы в файл...');
  377.  
  378.     Repeat
  379.       IsCorrect := True;
  380.       AssignFile(OutputFile, Path);
  381.  
  382.       Try
  383.         Append(OutputFile);
  384.       Except
  385.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  386.         IsCorrect := False;
  387.         Path := InputPathToFile();
  388.       End;
  389.  
  390.     Until IsCorrect;
  391.  
  392.     For I := Low(Matrix) To High(Matrix) Do
  393.     Begin
  394.       Write(OutputFile, '|');
  395.       For J := Low(Matrix) To High(Matrix) Do
  396.         Write(OutputFile, ' ', Matrix[I, J]:5:2, ' ');
  397.       Write(OutputFile, '| ', Matrix[I, High(Matrix) + 1]:5:2, ';');
  398.       Writeln(OutputFile, '');
  399.     End;
  400.     Write(OutputFile, #13);
  401.  
  402.     Close(OutputFile);
  403.     Writeln('Данные успешно записаны в файл!');
  404.   End;
  405. End;
  406.  
  407. Procedure InitializeArrWithZeros(Var Arr: TArr);
  408. Var
  409.   I: Integer;
  410. Begin
  411.   For I := 0 To High(Arr) Do
  412.     Arr[I] := 0;
  413. End;
  414.  
  415. Function FindRoots(Const TriangleMatrix: TMatrix): TArr;
  416. Var
  417.   I, J, K, Pos, FinalPosJ: Integer;
  418.   AnsArr: TArr;
  419.   Temp, Dividend: Real;
  420. Begin
  421.   SetLength(AnsArr, Length(TriangleMatrix));
  422.   InitializeArrWithZeros(AnsArr);
  423.   Pos := High(TriangleMatrix);
  424.   K := 1;
  425.   Dividend := 0;
  426.  
  427.   For I := 0 To High(AnsArr) Do
  428.   Begin
  429.     If (TriangleMatrix[Pos, Pos] <> 0) Then
  430.     Begin
  431.       Dividend := TriangleMatrix[Pos, Pos + K];
  432.       FinalPosJ := I - 1;
  433.  
  434.       For J := 0 To FinalPosJ Do
  435.         Dividend :=  Dividend - TriangleMatrix[Pos, Pos + I - J] * AnsArr[J];
  436.  
  437.       Temp := Dividend / TriangleMatrix[Pos, Pos];
  438.     End
  439.     Else
  440.       Temp := 0;
  441.  
  442.     AnsArr[I] := Temp;
  443.     Dec(Pos);
  444.     Inc(K);
  445.   End;
  446.  
  447.   FindRoots := AnsArr;
  448. End;
  449.  
  450. Procedure OutputAnsArr (Const Choice: Integer; Const AnsArr: TArr; Path: String);
  451. Var
  452.   OutputFile: TextFile;
  453.   IsCorrect: Boolean;
  454.   I: Integer;
  455. Begin
  456.   If Choice = 0 Then
  457.   Begin
  458.     Writeln('Вывод полученных корней: ');
  459.  
  460.     For I := Low(AnsArr) To High(AnsArr) Do
  461.     Begin
  462.       Writeln('Значение ', I + 1, '-ой переменной равно: ', AnsArr[I]:5:2, '.');
  463.     End;
  464.   End;
  465.  
  466.   If Choice = 1 Then
  467.   Begin
  468.     Writeln('Вывод полученных корней в файл...');
  469.  
  470.     Repeat
  471.       IsCorrect := True;
  472.       AssignFile(OutputFile, Path);
  473.  
  474.       Try
  475.         Append(OutputFile);
  476.       Except
  477.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  478.         IsCorrect := False;
  479.         Path := InputPathToFile();
  480.       End;
  481.  
  482.     Until IsCorrect;
  483.  
  484.     For I := Low(AnsArr) To High(AnsArr) Do
  485.     Begin
  486.       Writeln(OutputFile, 'Значение ', I + 1, '-ой переменной равно: ', AnsArr[I]:5:2, '.');
  487.     End;
  488.     Write(OutputFile, #13);
  489.  
  490.     Close(OutputFile);
  491.     Writeln('Данные успешно записаны в файл!');
  492.   End;
  493. End;
  494.  
  495. Function ProcessUserInput(Var SSet: TSet): TMatrix;
  496. Var
  497.   PathToIn: String;
  498.   ChoiceForInput, Size: Integer;
  499.   Matrix: TMatrix;
  500. Begin
  501.   Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
  502.   ChoiceForInput := GetVerificationOfChoice();
  503.  
  504.   If ChoiceForInput = 0 Then
  505.   Begin
  506.       Size := InputSizeFromConsole();
  507.       Matrix := FillMatrixFromConsole(Size);
  508.   End;
  509.  
  510.   If ChoiceForInput = 1 Then
  511.   Begin
  512.     PathToIn := InputPathToFile();
  513.     Size := InputSizeFromFile(PathToIn);
  514.     Matrix := FillMatrixFromFile(Size, PathToIn);
  515.   End;
  516.  
  517.   ProcessUserInput := Matrix;
  518. End;
  519.  
  520. Procedure ProcessUserOutput(Const Size: Integer; Const Matrix, TriangleMatrix: TMatrix; Const AnsArr: TArr);
  521. Var
  522.   PathToOut: String;
  523.   ChoiceForOutput: Integer;
  524. Begin
  525.   Writeln('Вы желаете получить данные в консоль(0) или в файл(1)?');
  526.   ChoiceForOutput := GetVerificationOfChoice();
  527.   If ChoiceForOutput = 1 Then
  528.     PathToOut := InputPathToFile();
  529.  
  530.   OutputSize(ChoiceForOutput, Size, PathToOut);
  531.   OutputMatrix(ChoiceForOutput, Matrix, PathToOut);
  532.   OutputTriangleMatrix(ChoiceForOutput, TriangleMatrix, PathToOut);
  533.   OutputAnsArr(ChoiceForOutput, AnsArr, PathToOut);
  534. End;
  535.  
  536. Procedure Main();
  537. Var
  538.   Size: Integer;
  539.   SSet: TSet;
  540.   AnsArr: TArr;
  541.   Matrix, TriangleMatrix: TMatrix;
  542. Begin
  543.   OutputTaskInfo();
  544.   Matrix := ProcessUserInput(SSet);
  545.   TriangleMatrix := CreateTriangleMatrix(Matrix);
  546.   AnsArr := FindRoots(TriangleMatrix);
  547.   ProcessUserOutput(Length(Matrix), Matrix, TriangleMatrix, AnsArr);
  548. End;
  549.  
  550. Begin
  551.   Main();
  552.   Readln;
  553.   Readln;
  554. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement