Slava_Krasava

Lab2_4

Nov 3rd, 2024 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.07 KB | None | 0 0
  1. Program Lab2_4;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMass = Array Of Array Of Double;
  8.     TErrorCode = (CORRECT,
  9.         INCORRECT_CHOICE,
  10.         NON_NUMERIC,
  11.         OUT_OF_RANGE,
  12.         FILE_NOT_TXT,
  13.         FILE_NOT_EXIST,
  14.         FILE_NOT_READABLE,
  15.         FILE_NOT_WRITABLE,
  16.         FILE_IS_EMPTY,
  17.         READING_GO_WRONG,
  18.         FILE_NOT_FULL,
  19.         TOO_MANY);
  20.  
  21. Const
  22.     MIN_ARR = 2;
  23.     MAX_ARR = 20;
  24.     MAX_OPTION = 2;
  25.     MIN_COUNT = -999.999;
  26.     MAX_COUNT = 999.999;
  27.     Err: Array [TErrorCode] Of String = ('',
  28.         'Error. Incorrect choice. Please try again.',
  29.         'Error. Non-numeric value. Please try again. ',
  30.         'Error. Out of Range. Please try again. ',
  31.         'Error. File not .txt. Please try again',
  32.         'Error. File not Exist. Please try again.',
  33.         'Error. File not readable. Please try again.',
  34.         'Error. File not writable. Please try again.',
  35.         'Error. File is empty. Please try again.',
  36.         'Error. Reading go wrong. Please try again.',
  37.         'Error. The file lacks sufficient information.',
  38.         'Error. Too much information in the file. Please try again. ');
  39.  
  40. Procedure ProgramTask();
  41. Begin
  42.     Writeln('The real square matrix of order 2n is given.');
  43.     Writeln('Sub-matrices of order n are indicated by numbers:');
  44.     Writeln('|1|2|');
  45.     Writeln('|3|4|');
  46.     Writeln('Get new matrix');
  47.     Writeln('|3|4|');
  48.     Writeln('|2|1|');
  49. End;
  50.  
  51. Function GetExtension(Var Str: String; PosStart, PosEnd: Integer): String;
  52. Var
  53.     I: Integer;
  54.     PartStr: String;
  55. Begin
  56.     PartStr := '';
  57.     For I := PosStart To PosEnd Do
  58.         PartStr := PartStr + Str[I];
  59.     GetExtension := PartStr;
  60. End;
  61.  
  62. Function IsFileTxt(PathToFile: String): TErrorCode;
  63. Var
  64.     Error: TErrorCode;
  65.     Size: Integer;
  66. Begin
  67.     Error := CORRECT;
  68.     Size := Length(PathToFile);
  69.     If (Size < 5) Or (GetExtension(PathToFile, Size - 3, Size) <> '.txt') Then
  70.         Error := FILE_NOT_TXT;
  71.     IsFileTxt := Error;
  72. End;
  73.  
  74. Function IsFileExist(PathToFile: String): TErrorCode;
  75. Var
  76.     Error: TErrorCode;
  77. Begin
  78.     Error := CORRECT;
  79.     If Not FileExists(PathToFile) Then
  80.         Error := FILE_NOT_EXIST;
  81.     IsFileExist := Error;
  82. End;
  83.  
  84. Function IsFileReadble(Var FileName: TextFile): TErrorCode;
  85. Var
  86.     Error: TErrorCode;
  87. Begin
  88.     Error := CORRECT;
  89.     Try
  90.         Reset(FileName);
  91.     Except
  92.         Error := FILE_NOT_EXIST
  93.     End;
  94.     IsFileReadble := Error;
  95. End;
  96.  
  97. Function IsFileWritable(Var FileName: TextFile): TErrorCode;
  98. Var
  99.     Error: TErrorCode;
  100. Begin
  101.     Error := CORRECT;
  102.     Try
  103.         Append(FileName);
  104.     Except
  105.         Error := FILE_NOT_WRITABLE;
  106.     End;
  107.     IsFileWritable := Error;
  108. End;
  109.  
  110. Procedure GetFileNormalReading(Var FileName: TextFile);
  111. Var
  112.     Error: TErrorCode;
  113.     PathToFile: String;
  114. Begin
  115.     Repeat
  116.         Readln(PathToFile);
  117.         Error := IsFileTxt(PathToFile);
  118.         If Error = CORRECT Then
  119.         Begin
  120.             Error := IsFileExist(PathToFile);
  121.             AssignFile(FileName, PathToFile);
  122.         End;
  123.         If Error = CORRECT Then
  124.             Error := IsFileReadble(FileName);
  125.         If (Error = CORRECT) And (EOF(FileName)) Then
  126.             Error := FILE_IS_EMPTY;
  127.         If Error <> CORRECT Then
  128.             Writeln(ERR[Error]);
  129.     Until Error = CORRECT;
  130. End;
  131.  
  132. Procedure GetFileNormalWriting(Var FileName: TextFile);
  133. Var
  134.     Error: TErrorCode;
  135.     PathToFile: String;
  136. Begin
  137.     Repeat
  138.         Readln(PathToFile);
  139.         Error := IsFileTxt(PathToFile);
  140.         If Error = CORRECT Then
  141.         Begin
  142.             Error := IsFileExist(PathToFile);
  143.             AssignFile(FileName, PathToFile);
  144.         End;
  145.         If Error = CORRECT Then
  146.             Error := IsFileWritable(FileName);
  147.         If Error <> CORRECT Then
  148.             Writeln(ERR[Error]);
  149.     Until Error = CORRECT;
  150. End;
  151.  
  152. Function MatrixSetingFile(Var FileName: TextFile; Var Matrix: TMass): TErrorCode;
  153. Var
  154.     Error: TErrorCode;
  155.     Setting: Integer;
  156. Begin
  157.     Setting := 0;
  158.     Writeln('Reading setings of matrix...');
  159.     Error := CORRECT;
  160.     Try
  161.         Read(FileName, Setting);
  162.     Except
  163.         Error := READING_GO_WRONG;
  164.     End;
  165.     If EOF(FileName) Then
  166.         Error := FILE_NOT_FULL;
  167.     If (Error = CORRECT) And ((Setting < MIN_ARR) Or (Setting > MAX_ARR) Or ((Setting Mod 2) > 0)) Then
  168.         Error := OUT_OF_RANGE;
  169.     If Error = CORRECT Then
  170.         SetLength(Matrix, Setting, Setting);
  171.  
  172.     MatrixSetingFile := Error;
  173. End;
  174.  
  175. Procedure MatrixSetingConsole(Var Matrix: TMass; Var Setting: Integer);
  176. Var
  177.     Error: TErrorCode;
  178. Begin
  179.     Repeat
  180.         Error := CORRECT;
  181.         Writeln('Please write size of matrix in the range ', MIN_ARR, ' .. ', MAX_ARR);
  182.         Try
  183.             Readln(Setting);
  184.         Except
  185.             Error := NON_NUMERIC;
  186.         End;
  187.         If (Error = CORRECT) And ((Setting < MIN_ARR) Or (Setting > MAX_ARR) Or ((Setting Mod 2) > 0)) Then
  188.             Error := OUT_OF_RANGE;
  189.         If Error <> CORRECT Then
  190.             Write(ERR[Error]);
  191.     Until Error = CORRECT;
  192.     SetLength(Matrix, Setting, Setting);
  193. End;
  194.  
  195. Procedure ReadErrorNumConsole(Var Matrix: TMass; Var Error: TErrorCode; Const I, J: Integer);
  196. Begin
  197.     Writeln(ERR[Error]);
  198.     Repeat
  199.         Writeln('Please write the num[', I, ',', J, ']');
  200.         Error := CORRECT;
  201.         Try
  202.             Readln(Matrix[I][J]);
  203.         Except
  204.             Error := NON_NUMERIC;
  205.         End;
  206.         If (Error = CORRECT) And ((Matrix[I][J] < MIN_COUNT) Or (Matrix[I][J] > MAX_COUNT)) Then
  207.             Error := OUT_OF_RANGE;
  208.         Write(ERR[Error]);
  209.     Until Error = CORRECT;
  210. End;
  211.  
  212. Procedure ReadMatrixFromFile(Var Matrix: TMass);
  213.  
  214. Var
  215.     FileName: TextFile;
  216.     Error: TErrorCode;
  217.     I, J: Integer;
  218. Begin
  219.     Repeat
  220.         WriteLn('Enter the path to the file with extension ".txt" with matrix length and High from ', MIN_ARR, ' .. ', MAX_ARR);
  221.         GetFileNormalReading(FileName);
  222.         Error := MatrixSetingFile(FileName, Matrix);
  223.         If Error = CORRECT Then
  224.             For I := 0 To High(Matrix) Do
  225.                 For J := 0 To High(Matrix[I]) Do
  226.                     If Not EOF(FileName) Then
  227.                     Begin
  228.                         Try
  229.                             Read(FileName, Matrix[I][J]);
  230.                         Except
  231.                             Error := READING_GO_WRONG;
  232.                             ReadErrorNumConsole(Matrix, Error, I, J);
  233.                         End;
  234.                     End
  235.                     Else
  236.                     Begin
  237.                         Error := FILE_NOT_FULL;
  238.                         ReadErrorNumConsole(Matrix, Error, I, J);
  239.                     End;
  240.         If Error <> CORRECT Then
  241.             WriteLn(ERR[Error]);
  242.         CloseFile(FileName);
  243.     Until Error = CORRECT;
  244.  
  245. End;
  246.  
  247. Procedure ReadColsFromConsole(Var Matrix: TMass; Const I: Integer);
  248. Var
  249.     Error: TErrorCode;
  250.     J: Integer;
  251.     Num: Double;
  252. Begin
  253.     WriteLn('Please enter the col ', I, ' through the space in the range ', MIN_COUNT:7:2, ' .. ', MAX_COUNT:7:2);
  254.     Num := 0;
  255.     For J := 0 To High(Matrix[I]) Do
  256.         Repeat
  257.             Error := CORRECT;
  258.             Try
  259.                 Read(Num);
  260.             Except
  261.                 Error := NON_NUMERIC;
  262.             End;
  263.             If (Error = CORRECT) And ((Num < MIN_COUNT) Or (Num > MAX_COUNT)) Then
  264.                 Error := OUT_OF_RANGE;
  265.             If Error = CORRECT Then
  266.                 Matrix[I][J] := Num
  267.             Else
  268.                 WriteLn(ERR[Error]);
  269.         Until Error = CORRECT;
  270. End;
  271.  
  272. Procedure ReadMatrixFromConsole(Var Matrix: TMass);
  273. Var
  274.     I, Setting: Integer;
  275. Begin
  276.     Setting := 0;
  277.     MatrixSetingConsole(Matrix, Setting);
  278.     Writeln('Matrix size [', Setting, ',', Setting, ']');
  279.     For I := 0 To High(Matrix) Do
  280.         ReadColsFromConsole(Matrix, I);
  281. End;
  282.  
  283. Function OptionRead(): Integer;
  284. Var
  285.     Error: TErrorCode;
  286.     Option: Integer;
  287. Begin
  288.     Option := 0;
  289.     Repeat
  290.         Error := CORRECT;
  291.         Try
  292.             Readln(Option);
  293.         Except
  294.             Error := NON_NUMERIC;
  295.         End;
  296.         If (Error = CORRECT) And ((Option < 1) Or (Option > MAX_OPTION)) Then
  297.             Error := INCORRECT_CHOICE;
  298.         If Error <> CORRECT Then
  299.             Write(ERR[Error]);
  300.     Until Error = CORRECT;
  301.     OptionRead := Option;
  302. End;
  303.  
  304. Procedure OptionHowToRead(Var Matrix: TMass);
  305. Var
  306.     Option: Integer;
  307. Begin
  308.     Writeln('If you want to read from console enter: 1');
  309.     Writeln('If you want to read from File enter:    2');
  310.     Option := OptionRead();
  311.     If Option = 2 Then
  312.         ReadMatrixFromFile(Matrix)
  313.     Else
  314.         ReadMatrixFromConsole(Matrix);
  315. End;
  316.  
  317. Procedure Swap(Var Matrix: TMass; Const I, J, K, R: Integer);
  318. Begin
  319.     Matrix[I][J] := Matrix[I][J] + Matrix[K][R];
  320.     Matrix[K][R] := Matrix[I][J] - Matrix[K][R];
  321.     Matrix[I][J] := Matrix[I][J] - Matrix[K][R];
  322. End;
  323.  
  324. Procedure Swap1_4(Var Matrix: TMass; Const N, Part: Integer);
  325. Var
  326.     I, J: Integer;
  327. Begin
  328.     For I := N DownTo Low(Matrix) Do
  329.         For J := N DownTo Low(Matrix) Do
  330.             Swap(Matrix, I, J, I + Part, J + Part)
  331. End;
  332.  
  333. Procedure Swap2_3(Var Matrix: TMass; Const N, Part: Integer);
  334. Var
  335.     I, J: Integer;
  336. Begin
  337.     For I := High(Matrix) DownTo Part Do
  338.         For J := N DownTo Low(Matrix) Do
  339.             Swap(Matrix, I, J, I - Part, J + Part)
  340. End;
  341.  
  342. Procedure Swap4_3(Var Matrix: TMass; Const N, Part: Integer);
  343. Var
  344.     I, J: Integer;
  345. Begin
  346.     For I := N DownTo Low(Matrix) Do
  347.         For J := N DownTo Low(Matrix) Do
  348.             Swap(Matrix, I, J, I, J + Part)
  349. End;
  350.  
  351. Procedure ChangeMatrix(Var Matrix: TMass);
  352. Var
  353.     N, Part: Integer;
  354. Begin
  355.     N := High(Matrix) Div 2;
  356.     Part := Length(Matrix) Div 2;
  357.     Swap1_4(Matrix, N, Part);
  358.     Swap2_3(Matrix, N, Part);
  359.     Swap4_3(Matrix, N, Part);
  360. End;
  361.  
  362. Procedure PrintConsole(Const Matrix: TMass);
  363. Var
  364.     I, J: Integer;
  365. Begin
  366.     For I := Low(Matrix) To High(Matrix) Do
  367.     Begin
  368.         For J := Low(Matrix[0]) To High(Matrix[0]) Do
  369.             Write(Matrix[I][J]:3:2, ' ');
  370.         Writeln(' ');
  371.     End;
  372. End;
  373.  
  374. Procedure PrintFile(Const Matrix: TMass);
  375. Var
  376.     I, J: Integer;
  377.     FileName: TextFile;
  378. Begin
  379.     WriteLn('Enter the path to the file with extension ".txt" to get answer: ');
  380.     GetFileNormalWriting(FileName);
  381.     Writeln(FileName);
  382.     For I := Low(Matrix) To High(Matrix) Do
  383.     Begin
  384.         For J := Low(Matrix[0]) To High(Matrix[0]) Do
  385.             Write(FileName, Matrix[I][J]:3:2, ' ');
  386.         Writeln(FileName);
  387.     End;
  388.     CloseFile(FileName);
  389. End;
  390.  
  391. Procedure PrintAnswer(Const Matrix: TMass);
  392. Var
  393.     Option: Integer;
  394. Begin
  395.     Writeln('If you want to print answer in console enter: 1');
  396.     Writeln('If you want to print answer in File enter:    2');
  397.     Option := OptionRead();
  398.     If Option = 2 Then
  399.         PrintFile(Matrix)
  400.     Else
  401.         PrintConsole(Matrix);
  402. End;
  403.  
  404. Var
  405.     Matrix: TMass;
  406.  
  407. Begin
  408.     ProgramTask();
  409.     OptionHowToRead(Matrix);
  410.     ChangeMatrix(Matrix);
  411.     PrintAnswer(Matrix);
  412.     Writeln('Press Enter to exit');
  413.     Readln;
  414.  
  415. End.
Advertisement
Add Comment
Please, Sign In to add comment