redmanexe

Lab3Challenge2Delphi

Nov 2nd, 2024 (edited)
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.48 KB | None | 0 0
  1. program Lab3Challenge2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. Uses
  8.     System.SysUtils;
  9.  
  10. Const
  11.     DEFAULT_INPUT_FILE = './input.txt';
  12.     DEFAULT_OUTPUT_FILE = './output.txt';
  13.  
  14.     PRINT_TYPE_MIN = 0;
  15.     PRINT_TYPE_MAX = 2;
  16.  
  17.     SCAN_TYPE_MIN = 0;
  18.     SCAN_TYPE_MAX = 1;
  19.  
  20. Function Calculate(Const Value: String): String;
  21. Var
  22.     I: Integer;
  23.     Res: String;
  24.     Symbols: Set Of AnsiChar;
  25. Begin
  26.     Symbols := ['+', '-', '*', '/', '.', ',', '=', '^', '%', '0', '2', '4', '6', '8'];
  27.     For I := 1 To Length(Value) Do
  28.     Begin
  29.         If (CharinSet(Value[I], Symbols)) Then
  30.             Res := Res + Value[I];
  31.     End;
  32.  
  33.     Calculate := Res;
  34. End;
  35.  
  36. Function IsTextFile(Const FilePath: String): Boolean;
  37. Var
  38.     IsTxt: Boolean;
  39.     Len: Integer;
  40. Begin
  41.     Len := Length(FilePath);
  42.     IsTxt := ((Len > 2) And (FilePath[Len - 3] = '.') And (FilePath[Len - 2] = 't') And (FilePath[Len - 1] = 'x') And
  43.         (FilePath[Len] = 't'));
  44.  
  45.     IsTextFile := IsTxt;
  46. End;
  47.  
  48. Function CheckFileAvailability(Const FilePath: String; Read: Boolean): Boolean;
  49. Var
  50.     IsAvailable: Boolean;
  51.     Checkable: TextFile;
  52. Begin
  53.     IsAvailable := True;
  54.     AssignFile(Checkable, FilePath);
  55.     Try
  56.         If (Read) Then
  57.             Reset(Checkable)
  58.         Else
  59.         Begin
  60.             If (FileExists(FilePath)) Then
  61.                 Append(Checkable)
  62.             Else
  63.                 Rewrite(Checkable);
  64.         End;
  65.         Close(Checkable);
  66.     Except
  67.         IsAvailable := False;
  68.     End;
  69.  
  70.     If (IsAvailable And Not IsTextFile(FilePath)) Then
  71.         IsAvailable := False;
  72.  
  73.     CheckFileAvailability := IsAvailable;
  74. End;
  75.  
  76. Function TakeIntValueFromConsole(Const Description: String): Integer;
  77. Var
  78.     Value: Integer;
  79.     IsCorrect: Boolean;
  80. Begin
  81.     IsCorrect := False;
  82.     Value := 0;
  83.     Repeat
  84.         Write(Description);
  85.         Try
  86.             Readln(Value);
  87.             IsCorrect := True;
  88.         Except
  89.             Writeln('Enter number, not string or anything else!');
  90.         End;
  91.     Until IsCorrect;
  92.  
  93.     TakeIntValueFromConsole := Value;
  94. End;
  95.  
  96. Function TakeIntValueInRangeFromConsole(Const Description: String; Min: Integer; Max: Integer): Integer;
  97. Var
  98.     Value: Integer;
  99.     IsCorrect: Boolean;
  100. Begin
  101.     Repeat
  102.         Value := TakeIntValueFromConsole(Description);
  103.         IsCorrect := True;
  104.         If ((Value < Min) Or (Value > Max)) Then
  105.         Begin
  106.             Writeln('Value must be in range from ', Min, ' to ', Max, '!');
  107.             IsCorrect := False;
  108.         End;
  109.     Until IsCorrect;
  110.  
  111.     TakeIntValueInRangeFromConsole := Value;
  112. End;
  113.  
  114. Procedure TakeCorrectFile(Var FileToAssign: TextFile; Input: Boolean);
  115. Var
  116.     FilePath: String;
  117.     IsCorrect: Boolean;
  118. Begin
  119.     Repeat
  120.         Var
  121.         DefaultFilePath := DEFAULT_OUTPUT_FILE;
  122.         If (Input) Then
  123.         Begin
  124.             Write('Enter path to input file (when empty - ', DEFAULT_INPUT_FILE, '): ');
  125.             DefaultFilePath := DEFAULT_INPUT_FILE;
  126.         End
  127.         Else
  128.             Write('Enter path to output file (when empty - ', DEFAULT_OUTPUT_FILE, '): ');
  129.  
  130.         ReadLn(FilePath);
  131.         If (FilePath = '') Then
  132.             FilePath := DefaultFilePath;
  133.         IsCorrect := True;
  134.  
  135.         If (Not CheckFileAvailability(FilePath, Input)) Then
  136.         Begin
  137.             IsCorrect := False;
  138.             WriteLn('This path contains wrong file or file, which cannot be accessed! Enter another path!');
  139.         End;
  140.     Until IsCorrect;
  141.  
  142.     AssignFile(FileToAssign, FilePath);
  143.     If (Input) Then
  144.         Reset(FileToAssign)
  145.     Else
  146.         Rewrite(FileToAssign);
  147. End;
  148.  
  149. Function ReadStringFromFile(): String;
  150. Var
  151.     Val: String;
  152.     FileToRead: TextFile;
  153.     IsCorrect: Boolean;
  154. Begin
  155.     Repeat
  156.         TakeCorrectFile(FileToRead, True);
  157.         ReadLn(FileToRead, Val);
  158.         IsCorrect := True;
  159.         If (Length(Val) = 0) Then
  160.         Begin
  161.             IsCorrect := False;
  162.             WriteLn('String cannot be empty!');
  163.         End;
  164.     Until IsCorrect;
  165.  
  166.     ReadStringFromFile := Val;
  167. End;
  168.  
  169. Function ReadStringFromConsole(): String;
  170. Var
  171.     Val: String;
  172.     IsCorrect: Boolean;
  173. Begin
  174.     Repeat
  175.         Write('Enter string to calculate: ');
  176.         ReadLn(Val);
  177.         IsCorrect := True;
  178.         If (Length(Val) = 0) Then
  179.         Begin
  180.             IsCorrect := False;
  181.             WriteLn('String cannot be empty!');
  182.         End;
  183.     Until IsCorrect;
  184.  
  185.     ReadStringFromConsole := Val;
  186. End;
  187.  
  188. Function ReadString(): String;
  189. Var
  190.     ReadType: Integer;
  191.     Val: String;
  192. Begin
  193.     WriteLn;
  194.     WriteLn('How to read values for calculations?');
  195.     WriteLn('0 - From keyboard (console)');
  196.     WriteLn('1 - From file');
  197.     ReadType := TakeIntValueInRangeFromConsole('Enter read type: ', SCAN_TYPE_MIN, SCAN_TYPE_MAX);
  198.     If (ReadType = 1) Then
  199.         Val := ReadStringFromFile()
  200.     Else
  201.         Val := ReadStringFromConsole();
  202.  
  203.     ReadString := Val;
  204. End;
  205.  
  206. Function SaveResultIntoFile(Const Val: String): Boolean;
  207. Var
  208.     Saved: Boolean;
  209.     FileToSave: TextFile;
  210.     I: Integer;
  211. Begin
  212.     Saved := True;
  213.     TakeCorrectFile(FileToSave, False);
  214.     Write(FileToSave, Val);
  215.     Close(FileToSave);
  216.  
  217.     SaveResultIntoFile := Saved;
  218. End;
  219. Procedure PrintResult(Const Val: String);
  220. Var
  221.     WriteType: Integer;
  222.     Saved: Boolean;
  223.  
  224. Begin
  225.     Saved := False;
  226.     WriteLn;
  227.     WriteLn('Where post result?');
  228.     WriteLn('0 - Only into console');
  229.     WriteLn('1 - Only into file');
  230.     WriteLn('2 - Into console and into file');
  231.     WriteType := TakeIntValueInRangeFromConsole('Enter write type: ', PRINT_TYPE_MIN, PRINT_TYPE_MAX);
  232.     Case WriteType Of
  233.         0:
  234.         Begin
  235.             WriteLn;
  236.             WriteLn('Set of arithmetic signs and even numbers: ', Val);
  237.         End;
  238.         1:
  239.         Begin
  240.             Saved := SaveResultIntoFile(Val);
  241.         End;
  242.         2:
  243.         Begin
  244.             Saved := SaveResultIntoFile(Val);
  245.             WriteLn;
  246.             WriteLn('Set of arithmetic signs and even numbers: ', Val);
  247.         End;
  248.     End;
  249.  
  250.     If (Saved) Then
  251.         WriteLn('Result saved into file!');
  252. End;
  253.  
  254. Begin
  255.     Var Input, Res: String;
  256.     WriteLn('2. Given a non-empty sequence of symbols, it is required to construct and print a set whose elements are the signs of arithmetic operations and even numbers found in the sequence.');
  257.     Input := ReadString();
  258.     Res := Calculate(Input);
  259.     PrintResult(Res);
  260.     WriteLn('Press [ENTER] to close program...');
  261.     ReadLn;
  262. End.
Advertisement
Add Comment
Please, Sign In to add comment