Slava_Krasava

Lab3_2

Nov 25th, 2024 (edited)
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.79 KB | None | 0 0
  1. Program Lab3_2;
  2.  
  3. uses
  4.   System.SysUtils,
  5.   Classes;
  6.  
  7. Type
  8.     TSet1 = Set of AnsiChar;
  9.     TSet2 = Set of 0..255;
  10.     TErrorCode = (CORRECT,
  11.                   INCORRECT_CHOICE,
  12.                   NON_NUMERIC,
  13.                   OUT_OF_RANGE,
  14.                   FILE_NOT_TXT,
  15.                   FILE_NOT_EXIST,
  16.                   FILE_NOT_READABLE,
  17.                   FILE_NOT_WRITABLE,
  18.                   FILE_NOT_CLOSE,
  19.                   FILE_IS_EMPTY,
  20.                   READING_GO_WRONG,
  21.                   FILE_NOT_FULL,
  22.                   STRING_OUT_OF_RANGE,
  23.                   TOO_MUCH);
  24.  
  25. Const
  26.     MIN_NUM = 0;
  27.     MAX_NUM = 255;
  28.     MIN_EXT = 5;
  29.     MIN_LEN = 1;
  30.     MAX_LEN = 32;
  31.     MIN_OPTION = 1;
  32.     MAX_OPTION = 2;
  33.     Err: Array [TErrorCode] Of String = ('',
  34.                                          'Error. Incorrect choice. Please try again.',
  35.                                          'Error. Non-numeric value. Please try again. ',
  36.                                          'Error. Out of Range. Please try again. ',
  37.                                          'Error. File not .txt. Please try again', 'Error. File not Exist. Please try again.',
  38.                                          'Error. File not readable. Please try again.',
  39.                                          'Error. File not writable. Please try again.',
  40.                                          'Error. File not closeble. Please try again.',
  41.                                          'Error. File is empty. Please try again.',
  42.                                          'Error. Reading go wrong. Please try again.',
  43.                                          'Error. The file lacks sufficient information.',
  44.                                          'Error. String out of Range. Please try again. ',
  45.                                          'Error. Too much information in the file.  Please try again. ');
  46.  
  47. Procedure ProgramTask();
  48. Begin
  49.     Writeln('This program searches for the signs of arithmetic operations and numbers.');
  50. End;
  51.  
  52. Function GetExtension(Const Str: String; Const PosStart, PosEnd: Integer): String;
  53. Var
  54.     I: Integer;
  55.     PartStr: String;
  56. Begin
  57.     PartStr := '';
  58.     For I := PosStart To PosEnd Do
  59.         PartStr := PartStr + Str[I];
  60.     GetExtension := PartStr;
  61. End;
  62.  
  63. Function IsFileTxt(Const PathToFile: String): TErrorCode;
  64. Var
  65.     Error: TErrorCode;
  66.     Len: Integer;
  67. Begin
  68.     Error := CORRECT;
  69.     Len := Length(PathToFile);
  70.     If (Len < MIN_EXT) Or (GetExtension(PathToFile, Len - 3, Len) <> '.txt') Then
  71.         Error := FILE_NOT_TXT;
  72.     IsFileTxt := Error;
  73. End;
  74.  
  75. Function DoesFileExist(Const PathToFile: String): TErrorCode;
  76. Var
  77.     Error: TErrorCode;
  78. Begin
  79.     Error := CORRECT;
  80.     If Not FileExists(PathToFile) Then
  81.         Error := FILE_NOT_EXIST;
  82.     DoesFileExist := Error;
  83. End;
  84.  
  85. Function DoesFileReadable(Var FileName: TextFile): TErrorCode;
  86. Var
  87.     Error: TErrorCode;
  88. Begin
  89.     Error := CORRECT;
  90.     Try
  91.         Reset(FileName);
  92.     Except
  93.         Error := FILE_NOT_READABLE
  94.     End;
  95.     DoesFileReadable := Error;
  96. End;
  97.  
  98. Function DoesFileWritable(Var FileName: TextFile): TErrorCode;
  99. Var
  100.     Error: TErrorCode;
  101. Begin
  102.     Error := CORRECT;
  103.     Try
  104.         Append(FileName);
  105.     Except
  106.         Error := FILE_NOT_WRITABLE;
  107.     End;
  108.     DoesFileWritable := Error;
  109. End;
  110.  
  111. Function DoesFileCloseable(Var FileName: TextFile): TErrorCode;
  112. Var
  113.     Error: TErrorCode;
  114. Begin
  115.     Error := CORRECT;
  116.     Try
  117.         CloseFile(FileName);
  118.     Except
  119.         Error := FILE_NOT_CLOSE
  120.     End;
  121.     DoesFileCloseable := Error;
  122. End;
  123.  
  124. Procedure GetFileNormalReading(Var FileName: TextFile);
  125. Var
  126.     Error: TErrorCode;
  127.     PathToFile: String;
  128. Begin
  129.     Repeat
  130.         Readln(PathToFile);
  131.         Error := IsFileTxt(PathToFile);
  132.         If Error = CORRECT Then
  133.         Begin
  134.             Error := DoesFileExist(PathToFile);
  135.             AssignFile(FileName, PathToFile);
  136.         End;
  137.         If Error = CORRECT Then
  138.             Error := DoesFileReadable(FileName);
  139.         If (Error = CORRECT) And (EOF(FileName)) Then
  140.             Error := FILE_IS_EMPTY;
  141.         If Error <> CORRECT Then
  142.             Writeln(ERR[Error]);
  143.     Until Error = CORRECT;
  144. End;
  145.  
  146. Procedure GetFileNormalWriting(Var FileName: TextFile);
  147. Var
  148.     Error: TErrorCode;
  149.     PathToFile: String;
  150. Begin
  151.     Repeat
  152.         Readln(PathToFile);
  153.         Error := IsFileTxt(PathToFile);
  154.         If Error = CORRECT Then
  155.         Begin
  156.             Error := DoesFileExist(PathToFile);
  157.             AssignFile(FileName, PathToFile);
  158.         End;
  159.         If Error = CORRECT Then
  160.             Error := DoesFileWritable(FileName);
  161.         If Error <> CORRECT Then
  162.             Writeln(ERR[Error]);
  163.     Until Error = CORRECT;
  164. End;
  165.  
  166. Function ReadStringFromConsole(Const MIN_COUNT, MAX_COUNT: Integer): AnsiString;
  167. Var
  168.     Str: AnsiString;
  169.     Error: TErrorCode;
  170. Begin
  171.     Repeat
  172.         Writeln('Please write not empty sequence of characters, but numbers in range [0..255]');
  173.         Error := CORRECT;
  174.         Readln(Str);
  175.         If (Length(Str) < MIN_COUNT) Or (Length(Str) > MAX_COUNT) Then
  176.             Error := STRING_OUT_OF_RANGE;
  177.         If Error <> CORRECT Then
  178.             Write(ERR[Error]);
  179.     Until Error = CORRECT;
  180.     ReadStringFromConsole := Str;
  181. End;
  182.  
  183. Function FindFileStringNumber(Var FileName: TextFile): Integer;
  184. Var
  185.     Counter: Integer;
  186. Begin
  187.     Counter := 0;
  188.     While Not EOF(FileName) Do
  189.     Begin
  190.         Readln(FileName);
  191.         Inc(Counter);
  192.     End;
  193.     FindFileStringNumber := Counter;
  194. End;
  195.  
  196. Function ReadStringFromFile(Const MIN_COUNT, MAX_COUNT: Integer): AnsiString;
  197. Var
  198.     Counter: Integer;
  199.     Str: AnsiString;
  200.     FileName: TextFile;
  201.     Error: TErrorCode;
  202. Begin
  203.     Repeat
  204.         WriteLn('Enter the path to the file with extension ".txt"');
  205.         Error := CORRECT;
  206.         GetFileNormalReading(FileName);
  207.         Counter := FindFileStringNumber(FileName);
  208.         If Counter < 1 Then
  209.             Error := FILE_NOT_FULL
  210.         Else
  211.             If Counter > 1 Then
  212.                 Error := TOO_MUCH;
  213.         If Error = CORRECT Then
  214.         Begin
  215.             Error := DoesFileReadable(FileName);
  216.             If Error = CORRECT Then
  217.                 Repeat
  218.                     Error := CORRECT;
  219.                     ReadLn(FileName, Str);
  220.                     If (Length(Str) < MIN_COUNT) Or (Length(Str) > MAX_COUNT) Then
  221.                         Error := STRING_OUT_OF_RANGE;
  222.                     If Error <> CORRECT Then
  223.                     Begin
  224.                         Write(ERR[Error]);
  225.                         Writeln('Please write string');
  226.                         Str := ReadStringFromConsole(MIN_COUNT, MAX_COUNT);
  227.                     End;
  228.                 Until Error = CORRECT;
  229.         End
  230.         Else
  231.             Writeln(ERR[Error]);
  232.         Error := DoesFileCloseable(FileName);
  233.         If Error <> CORRECT Then
  234.             Writeln(ERR[Error]);
  235.     Until Error = CORRECT;
  236.     ReadStringFromFile := Str;
  237. End;
  238.  
  239. Function CreateSetOfArithmetic(Const Str1: AnsiString): TSet1;
  240. Var
  241.     Signs: TSet1;
  242.     Ch: AnsiChar;
  243.     I: Integer;
  244. Begin
  245.     Signs := [];
  246.     For I := 1 To Length(Str1) Do
  247.     Begin
  248.         Ch := Str1[I];
  249.         If ((Ord(Ch) > 38) And (Ord(Ch) < 48)) Or ((Ord(Ch) > 59) And (Ord(Ch) < 63)) Then
  250.         Begin
  251.             Include(Signs, Ch);
  252.         End;
  253.     End;
  254.     CreateSetOfArithmetic := Signs;
  255.  
  256. End;
  257.  
  258. Function StringToNum(Const Str: AnsiString): Integer;
  259. Var
  260.     I, Num: Integer;
  261.  
  262. Begin
  263.     Num := 0;
  264.     For I := 1 To Length(Str) Do
  265.         Num := Num * 10 + (Ord(Str[I]) - Ord('0'));
  266.     StringToNum := Num;
  267. End;
  268.  
  269. Function NumToString(Var Num: Integer): AnsiString;
  270. Var
  271.     Str: AnsiString;
  272. Begin
  273.     Str := '';
  274.     Repeat
  275.         Str := AnsiString(Chr(Ord('0') + (Num Mod 10))) + Str;
  276.         Num := Num Div 10;
  277.     Until Num = 0;
  278.     NumToString := Str;
  279. End;
  280.  
  281. Function CreateSetOfNumbers(Const Str1: AnsiString): TSet2;
  282. Var
  283.     Nums: TSet2;
  284.     Temp: AnsiString;
  285.     Ch: Ansichar;
  286.     I, J, Len, Num: Integer;
  287.     IsNumber: Boolean;
  288. Begin
  289.     Nums := [];
  290.     Len := Length(Str1) + 1;
  291.     I := 1;
  292.     While I < Len Do
  293.     Begin
  294.         Temp := '';
  295.         IsNumber := False;
  296.         J := I;
  297.         Ch := Str1[I];
  298.         If (Ord(Ch) > 47) And (Ord(Ch) < 58) Then
  299.             IsNumber := True;
  300.         While IsNumber And (J < Len) Do
  301.         Begin
  302.             Ch := Str1[J];
  303.             If (Ord(Ch) > 47) And (Ord(Ch) < 58) Then
  304.             Begin
  305.                 Temp := Temp + Ch;
  306.                 Inc(J);
  307.             End
  308.             Else
  309.                 IsNumber := False;
  310.         End;
  311.         If Temp <> '' Then
  312.         Begin
  313.             Num := StringToNum(Temp);
  314.         If (Num > MIN_NUM) Or (Num < MAX_NUM) Then
  315.             Include(Nums, Num);
  316.         End;
  317.         I := J + 1;
  318.     End;
  319.     CreateSetOfNumbers := Nums;
  320. End;
  321.  
  322. Function CreateStringSigns(Const Signs: TSet1): AnsiString;
  323. Var
  324.     Str: AnsiString;
  325.     Sign: AnsiChar;
  326. Begin
  327.     Str := '';
  328.     For Sign In Signs Do
  329.         Str := Str + Sign + ' ';
  330.     CreateStringSigns := Str;
  331. End;
  332.  
  333. Function CreateStringNums(Const Nums: TSet2): AnsiString;
  334. Var
  335.     Num: Integer;
  336.     Str: AnsiString;
  337. Begin
  338.     Str := '';
  339.     For Num In Nums Do
  340.         Str := Str + NumToString(Num) + ' ';
  341.     CreateStringNums := Str;
  342. End;
  343.  
  344. Function OptionRead(): Integer;
  345. Var
  346.     Error: TErrorCode;
  347.     Option: Integer;
  348. Begin
  349.     Option := 0;
  350.     Repeat
  351.         Error := CORRECT;
  352.         Try
  353.             Readln(Option);
  354.         Except
  355.             Error := NON_NUMERIC;
  356.         End;
  357.         If (Error = CORRECT) And ((Option < MIN_OPTION) Or (Option > MAX_OPTION)) Then
  358.             Error := INCORRECT_CHOICE;
  359.         If Error <> CORRECT Then
  360.             Write(ERR[Error]);
  361.     Until Error = CORRECT;
  362.     OptionRead := Option;
  363. End;
  364.  
  365. Procedure OptionHowToRead(Var Str: AnsiString);
  366. Var
  367.     Option: Integer;
  368. Begin
  369.     Writeln('If you want to read from console enter: 1');
  370.     Writeln('If you want to read from File enter:    2');
  371.     Option := OptionRead();
  372.     If Option = MAX_OPTION Then
  373.         Str := ReadStringFromFile(MIN_LEN, MAX_LEN)
  374.     Else
  375.         Str := ReadStringFromConsole(MIN_LEN, MAX_LEN);
  376. End;
  377.  
  378. Procedure PrintConsole(Const Str1, Str2: AnsiString);
  379. Begin
  380.     WriteLn('');
  381.     WriteLn('Arithmetic signs');
  382.     WriteLn(Str1);
  383.     WriteLn('Numbers');
  384.     WriteLn(Str2);
  385. End;
  386.  
  387. Procedure PrintFile(Const Str1, Str2: AnsiString);
  388. Var
  389.     Str, Str0 : String;
  390.     FileName: TextFile;
  391.     Error: TErrorCode;
  392. Begin
  393.     Repeat
  394.         Str := String(Str1);
  395.         Str0 := String(Str2);
  396.         Error := CORRECT;
  397.         WriteLn('Enter the path to the file with extension ".txt" to get answer: ');
  398.         GetFileNormalWriting(FileName);
  399.         Writeln(FileName);
  400.         WriteLn(FileName, 'Arithmetic signs');
  401.         WriteLn(FileName, Str1);
  402.         WriteLn(FileName, 'Numbers');
  403.         WriteLn(FileName, Str2);
  404.         Error := DoesFileCloseable(FileName);
  405.         If Error <> CORRECT Then
  406.             Writeln(ERR[Error]);
  407.     Until Error = CORRECT;
  408. End;
  409.  
  410. Procedure PrintAnswer(Const Str1, Str2: AnsiString);
  411. Var
  412.     Option: Integer;
  413. Begin
  414.     Writeln('If you want to print answer in console enter: 1');
  415.     Writeln('If you want to print answer in File enter:    2');
  416.     Option := OptionRead();
  417.     If Option = MAX_OPTION Then
  418.         PrintFile(Str1, Str2)
  419.     Else
  420.         PrintConsole(Str1, Str2);
  421. End;
  422.  
  423. Var
  424.     Str, StrSigns, StrNumbers: AnsiString;
  425.     Signs: TSet1;
  426.     Numbers: TSet2;
  427.  
  428. Begin
  429.     ProgramTask();
  430.     OptionHowToRead(Str);
  431.     Signs := CreateSetOfArithmetic(Str);
  432.     Numbers := CreateSetOfNumbers(Str);
  433.     StrSigns := CreateStringSigns(Signs);
  434.     StrNumbers := CreateStringNums(Numbers);
  435.     PrintAnswer(StrSigns, StrNumbers);
  436.     Writeln('Press Enter to exit');
  437.     Readln;
  438.  
  439. End.
Advertisement
Add Comment
Please, Sign In to add comment