Slava_Krasava

Lab3_3

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