d1bs

Lab2_3

Oct 26th, 2024 (edited)
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.74 KB | None | 0 0
  1. Program Lab2_3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMass = Array Of Array Of Double;
  8.     TVector = Array Of Double;
  9.     TErrorCode = (CORRECT, UNCORRECT_CHOISE, NON_NUMERIC, OUT_OF_RANGE, FILE_NOT_TXT, FILE_NOT_EXIST, FILE_NOT_READBLE, FILE_NOT_WRITEBLE,
  10.         FILE_IS_EMPTY, READING_GO_WRONG, FILE_NOT_FULL);
  11.  
  12. Const
  13.     MIN_ARR = 2;
  14.     MAX_ARR = 20;
  15.     MAX_OPTION = 2;
  16.     MIN_COUNT = -999.999;
  17.     MAX_COUNT = 999.999;
  18.     Err: Array [TErrorCode] Of String = ('', 'Error. Uncorrect choise. Please try again. ', 'Error. Non-numeric value. Please try again. ',
  19.         'Error. Out of Range. Please try again. ', 'Error. File not .txt. Please try again', 'Error. File not Exist. Please try again.',
  20.         'Error. File not readeble. Please try again.', 'Error. File not writeble. Please try again.',
  21.         'Error. File is empty. Please try again.', 'Error. Reading go wrong. Please try again.',
  22.         'Error. The file lacks sufficient information . Please try again. ');
  23.  
  24. Procedure ProgramTask();
  25. Begin
  26.     Writeln('This program solves a system of linear equations using Gaussian elimination with back substitution.');
  27. End;
  28.  
  29. Function GetLastPartStr(Var Str: String; PosStart, PosEnd: Integer): String;
  30. Var
  31.     I: Integer;
  32.     PartStr: String;
  33. Begin
  34.     PartStr := '';
  35.     For I := PosStart To PosEnd Do
  36.         PartStr := PartStr + Str[I];
  37.     GetLastPartStr := PartStr;
  38. End;
  39.  
  40. Function IsFileTxt(PathToFile: String): TErrorCode;
  41. Var
  42.     Error: TErrorCode;
  43. Begin
  44.     Error := CORRECT;
  45.     If (Length(PathToFile) < 5) Or (GetLastPartStr(PathToFile, Length(PathToFile) - 3, Length(PathToFile)) <> '.txt') Then
  46.         Error := FILE_NOT_TXT;
  47.     IsFileTxt := Error;
  48. End;
  49.  
  50. Function IsFileExist(PathToFile: String): TErrorCode;
  51. Var
  52.     Error: TErrorCode;
  53. Begin
  54.     Error := CORRECT;
  55.     If Not FileExists(PathToFile) Then
  56.         Error := FILE_NOT_EXIST;
  57.     IsFileExist := Error;
  58. End;
  59.  
  60. Function IsFileReadble(Var FileName: TextFile): TErrorCode;
  61. Var
  62.     Error: TErrorCode;
  63. Begin
  64.     Error := CORRECT;
  65.     Try
  66.         Reset(FileName);
  67.     Except
  68.         Error := FILE_NOT_EXIST
  69.     End;
  70.     IsFileReadble := Error;
  71. End;
  72.  
  73. Function IsFileWriteble(Var FileName: TextFile): TErrorCode;
  74. Var
  75.     Error: TErrorCode;
  76. Begin
  77.     Error := CORRECT;
  78.     Try
  79.         Try
  80.             Append(FileName);
  81.         Except
  82.             Error := FILE_NOT_READBLE;
  83.         End;
  84.     Finally
  85.         Close(FileName);
  86.     End;
  87.     IsFileWriteble := Error;
  88. End;
  89.  
  90. Procedure GetFileNormalReading(Var FileName: TextFile);
  91. Var
  92.     Error: TErrorCode;
  93.     PathToFile: String;
  94. Begin
  95.     Repeat
  96.         Readln(PathToFile);
  97.         Error := IsFileTxt(PathToFile);
  98.         If Error = CORRECT Then
  99.             Error := IsFileExist(PathToFile);
  100.         If Error = CORRECT Then
  101.             AssignFile(FileName, PathToFile);
  102.         If Error = CORRECT Then
  103.             Error := IsFileReadble(FileName);
  104.         If (Error = CORRECT) And (EOF(FileName)) Then
  105.             Error := FILE_IS_EMPTY;
  106.         If Error <> CORRECT Then
  107.             Writeln(ERR[Error]);
  108.     Until Error = CORRECT;
  109. End;
  110.  
  111. Procedure GetFileNormalWriting(Var FileName: TextFile);
  112. Var
  113.     Error: TErrorCode;
  114.     PathToFile: String;
  115. Begin
  116.     Repeat
  117.         Readln(PathToFile);
  118.         Error := IsFileTxt(PathToFile);
  119.         If Error = CORRECT Then
  120.             Error := IsFileExist(PathToFile);
  121.         If Error = CORRECT Then
  122.             AssignFile(FileName, PathToFile);
  123.         If Error = CORRECT Then
  124.             Error := IsFileWriteble(FileName);
  125.         If Error <> CORRECT Then
  126.             Writeln(ERR[Error]);
  127.     Until Error = CORRECT;
  128. End;
  129.  
  130. Function MatrixSetingFile(Var FileName: TextFile; Var Matrix: TMass; Var FreeVector: TVector): TErrorCode;
  131. Var
  132.     Error: TErrorCode;
  133.     Rows, Cols: Integer;
  134. Begin
  135.     Error := CORRECT;
  136.     Rows := 0;
  137.     Cols := 0;
  138.     Writeln('Чтение настроек матрицы...');
  139.     Try
  140.         Read(FileName, Rows);
  141.         Read(FileName, Cols);
  142.     Except
  143.         Error := READING_GO_WRONG;
  144.     End;
  145.     If EOF(FileName) Then
  146.         Error := FILE_NOT_FULL;
  147.     If (Error = CORRECT) And (Rows < MIN_ARR) Or (Rows > MAX_ARR) Or (Cols < MIN_ARR) Or (Cols > MAX_ARR) Then
  148.         Error := OUT_OF_RANGE;
  149.     If Error = CORRECT Then
  150.     Begin
  151.         SetLength(Matrix, Rows, Cols);
  152.         SetLength(FreeVector, Rows);
  153.     End;
  154.  
  155.     MatrixSetingFile := Error;
  156. End;
  157.  
  158. Procedure MatrixSetingConsole(Var Matrix: TMass; Var Rows, Cols: Integer);
  159. Var
  160.     Error: TErrorCode;
  161. Begin
  162.  
  163.     Repeat
  164.         Error := CORRECT;
  165.         Writeln('Please write size of matrix through the space in the range ', MIN_ARR, ' .. ', MAX_ARR);
  166.         Try
  167.             Readln(Rows, Cols);
  168.         Except
  169.             Error := NON_NUMERIC;
  170.         End;
  171.         If (Error = CORRECT) And ((Rows < MIN_ARR) Or (Rows > MAX_ARR) Or (Cols < MIN_ARR) Or (Cols > MAX_ARR)) Then
  172.             Error := OUT_OF_RANGE;
  173.         If Error <> CORRECT Then
  174.             Write(ERR[Error]);
  175.     Until Error = CORRECT;
  176.     SetLength(Matrix, Rows, Cols);
  177. End;
  178.  
  179. Procedure ReadMatrix(Var FileName: TextFile; Var Matrix: TMass);
  180. Var
  181.     I, J: Integer;
  182.     Error: TErrorCode;
  183. Begin
  184.     Error := CORRECT;
  185.     For I := 0 To High(Matrix) Do
  186.     Begin
  187.         For J := 0 To High(Matrix[I]) Do
  188.         Begin
  189.             If Not EOF(FileName) Then
  190.             Begin
  191.                 Try
  192.                     Read(FileName, Matrix[I][J]);
  193.                 Except
  194.                     Error := READING_GO_WRONG;
  195.                 End;
  196.             End
  197.             Else
  198.                 Error := FILE_NOT_FULL;
  199.         End;
  200.     End;
  201.     If Error <> CORRECT Then
  202.         WriteLn(ERR[Error]);
  203. End;
  204.  
  205. Procedure ReadFreeVector(Var FileName: TextFile; Var FreeVector: TVector);
  206. Var
  207.     I: Integer;
  208.     Error: TErrorCode;
  209. Begin
  210.     Error := CORRECT;
  211.     For I := 0 To High(FreeVector) Do
  212.     Begin
  213.         If Not EOF(FileName) Then
  214.         Begin
  215.             Try
  216.                 Read(FileName, FreeVector[I]);
  217.             Except
  218.                 Error := READING_GO_WRONG;
  219.             End;
  220.         End
  221.         Else
  222.         Begin
  223.             Error := FILE_NOT_FULL;
  224.         End;
  225.     End;
  226.  
  227.     If Error <> CORRECT Then
  228.         WriteLn(ERR[Error]);
  229. End;
  230.  
  231. Procedure ReadMatrixFromFile(Var Matrix: TMass; Var FreeVector: TVector);
  232. Var
  233.     FileName: TextFile;
  234.     Error: TErrorCode;
  235. Begin
  236.     WriteLn('Enter the path to the file with extension ".txt" with matrix dimensions and free terms from ', MIN_ARR, ' .. ', MAX_ARR);
  237.     GetFileNormalReading(FileName);
  238.     Error := MatrixSetingFile(FileName, Matrix, FreeVector);
  239.    
  240.     If Error = CORRECT Then
  241.     Begin
  242.         ReadMatrix(FileName, Matrix);
  243.         ReadFreeVector(FileName, FreeVector);
  244.     End;
  245.  
  246.     CloseFile(FileName);
  247.     If Error <> CORRECT Then
  248.         WriteLn(ERR[Error]);
  249. End;
  250.  
  251.  
  252. Procedure ReadColsFromConsole(Var Matrix: TMass; Const I: Integer);
  253. Var
  254.     Error: TErrorCode;
  255.     J: Integer;
  256.     Num: Double;
  257. Begin
  258.     WriteLn('Please enter the col ', I, ' in the range ', MIN_COUNT:7:2, ' .. ', MAX_COUNT:7:2);
  259.     Num := 0;
  260.  
  261.     For J := 0 To High(Matrix[I]) Do
  262.     Begin
  263.         Repeat
  264.             Error := CORRECT;
  265.             Try
  266.                 Read(Num);
  267.             Except
  268.                 Error := NON_NUMERIC;
  269.             End;
  270.             If (Error = CORRECT) And ((Num < MIN_COUNT) Or (Num > MAX_COUNT)) Then
  271.                 Error := OUT_OF_RANGE;
  272.             If Error = CORRECT Then
  273.                 Matrix[I][J] := Num
  274.             Else
  275.                 WriteLn(ERR[Error]);
  276.         Until Error = CORRECT;
  277.     End;
  278. End;
  279.  
  280. Procedure ReadMatrixFromConsole(Var Matrix: TMass);
  281. Var
  282.     I, J, Rows, Cols: Integer;
  283.     Error: TErrorCode;
  284. Begin
  285.     Rows := 0;
  286.     Cols := 0;
  287.     MatrixSetingConsole(Matrix, Rows, Cols);      
  288.     Writeln('Matrix size [', Rows, ',', Cols, ']');
  289.  
  290.     For I := 0 To High(Matrix) Do
  291.     Begin
  292.         WriteLn('Please enter the elements for row ', I, ' (diagonal and above) through the space in the range ', MIN_COUNT:7:2, ' .. ',
  293.             MAX_COUNT:7:2);
  294.         For J := 0 To High(Matrix[I]) Do
  295.         Begin
  296.             If J < I Then
  297.             Begin
  298.                 Matrix[I][J] := 0;
  299.             End
  300.             Else
  301.             Begin
  302.                 Repeat
  303.                     Error := CORRECT;
  304.                     Try
  305.                         Read(Matrix[I][J]);
  306.                     Except
  307.                         Error := NON_NUMERIC;
  308.                     End;
  309.                     If (Error = CORRECT) And ((Matrix[I][J] < MIN_COUNT) Or (Matrix[I][J] > MAX_COUNT)) Then
  310.                         Error := OUT_OF_RANGE;
  311.                     If Error <> CORRECT Then
  312.                         WriteLn(ERR[Error]);
  313.                 Until Error = CORRECT;
  314.             End;
  315.         End;
  316.         ReadLn;
  317.     End;
  318. End;
  319.  
  320. Procedure ReadFreeVectorFromConsole(Var FreeVector: TVector; Var Matrix: TMass);
  321. Var
  322.     I: Integer;
  323.     Error: TErrorCode;
  324. Begin
  325.     SetLength(FreeVector, Length(Matrix));
  326.     Writeln('Enter the free terms:');
  327.     For I := 0 To High(FreeVector) Do
  328.     Begin
  329.         Repeat
  330.             Error := CORRECT;
  331.             Try
  332.                 Read(FreeVector[I]);
  333.             Except
  334.                 Error := NON_NUMERIC;
  335.             End;
  336.             If (Error = CORRECT) And ((FreeVector[I] < MIN_COUNT) Or (FreeVector[I] > MAX_COUNT)) Then
  337.                 Error := OUT_OF_RANGE;
  338.             If Error <> CORRECT Then
  339.                 WriteLn(ERR[Error]);
  340.         Until Error = CORRECT;
  341.     End;
  342. End;
  343.  
  344.  
  345. Function OptionRead(Const MAX_OPTION: Integer): Integer;
  346. Var
  347.     Error: TErrorCode;
  348.     Option: Integer;
  349. Begin
  350.     Option := 0;
  351.     Repeat
  352.         Error := CORRECT;
  353.         Try
  354.             Readln(Option);
  355.         Except
  356.             Error := NON_NUMERIC;
  357.         End;
  358.         If (Error = CORRECT) And ((Option < 1) Or (Option > MAX_OPTION)) Then
  359.             Error := UNCORRECT_CHOISE;
  360.         If Error <> CORRECT Then
  361.             Write(ERR[Error]);
  362.     Until Error = CORRECT;
  363.     OptionRead := Option;
  364. End;
  365.  
  366. Procedure OptionHowToRead(Var Matrix: TMass; Var FreeVector: TVector);
  367. Var
  368.     Option: Integer;
  369. Begin
  370.     Writeln('If you want to read from console enter: 1');
  371.     Writeln('If you want to read from File enter: 2');
  372.     Option := OptionRead(MAX_OPTION);
  373.     If Option = 2 Then
  374.         ReadMatrixFromFile(Matrix, FreeVector)
  375.     Else
  376.     Begin
  377.         ReadMatrixFromConsole(Matrix);
  378.         ReadFreeVectorFromConsole(FreeVector, Matrix);
  379.     End;
  380. End;
  381.  
  382. Procedure BackSubstitution(Var Matrix: TMass; Var FreeVector: TVector; Var Solutions: TVector);
  383. Var
  384.     I, J: Integer;
  385.     Sum: Double;
  386.     DivisionByZero: Boolean;
  387. Begin
  388.     SetLength(Solutions, Length(FreeVector));
  389.     DivisionByZero := False;
  390.     I := High(Matrix);
  391.     While I >= 0 Do
  392.     Begin
  393.         Sum := FreeVector[I];
  394.         For J := I + 1 To High(Matrix) Do
  395.             Sum := Sum - Matrix[I][J] * Solutions[J];
  396.         If Matrix[I][I] = 0 Then
  397.         Begin
  398.             Writeln('Error: Division by zero for row ', I);
  399.             DivisionByZero := True;
  400.         End
  401.         Else
  402.         Begin
  403.             Solutions[I] := Sum / Matrix[I][I];
  404.         End;
  405.         Dec(I);
  406.     End;
  407.     If DivisionByZero Then
  408.         Writeln('Back substitution terminated due to division by zero.');
  409. End;
  410.  
  411. Procedure PrintConsole(Solutions: TVector);
  412. Var
  413.     I: Integer;
  414. Begin
  415.     WriteLn('The solutions are:');
  416.     For I := 0 To High(Solutions) Do
  417.         WriteLn('x[', I, '] = ', Solutions[I]:0:4);
  418. End;
  419.  
  420. Procedure PrintFile(Solutions: TVector);
  421. Var
  422.     FileName: TextFile;
  423.     Path: String;
  424.     I: Integer;
  425.     ErrorCode: TErrorCode;
  426. Begin
  427.     WriteLn('Enter the path to the file with the extension ".txt" to get the answer: ');
  428.     GetFileNormalWriting(FileName);
  429.     ErrorCode := IsFileWriteble(FileName);
  430.    
  431.     If ErrorCode = CORRECT Then
  432.     Begin
  433.         Rewrite(FileName);
  434.         WriteLn(FileName, 'Solutions:');
  435.         For I := 0 To High(Solutions) Do
  436.             WriteLn(FileName, 'x[', I, '] = ', Solutions[I]:0:4);
  437.         CloseFile(FileName);
  438.     End
  439.     Else
  440.         WriteLn(ERR[ErrorCode]);
  441. End;
  442.  
  443. Procedure PrintAnswer(Solutions: TVector);
  444. Var
  445.     Option, I: Integer;
  446. Begin
  447.     Writeln('If you want to print answer in console enter: 1');
  448.     Writeln('If you want to print answer in File enter: 2');
  449.     Option := OptionRead(MAX_OPTION);
  450.     If Option = 2 Then
  451.         PrintFile(Solutions)
  452.     Else
  453.         PrintConsole(Solutions);
  454. End;
  455.  
  456. Var
  457.     Matrix: TMass;
  458.     FreeVector: TVector;
  459.     Solutions: TVector;
  460.  
  461. Begin
  462.     ProgramTask();
  463.     OptionHowToRead(Matrix, FreeVector);
  464.     BackSubstitution(Matrix, FreeVector, Solutions);
  465.     PrintAnswer(Solutions);
  466.     Writeln('Press Enter to exit');
  467.     Readln;
  468. End.
Advertisement
Add Comment
Please, Sign In to add comment