d1bs

Lab3_2

Dec 9th, 2024
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.73 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 AnsiChar;
  10.     TErrorCode = (CORRECT, INCORRECT_CHOICE, NON_NUMERIC, OUT_OF_RANGE, FILE_NOT_TXT, FILE_NOT_EXIST, FILE_NOT_READABLE, FILE_NOT_WRITABLE,
  11.         FILE_NOT_CLOSE, FILE_IS_EMPTY, READING_GO_WRONG, FILE_NOT_FULL, STRING_OUT_OF_RANGE, TOO_MUCH);
  12.  
  13. Const
  14.     MIN_NUM = 0;
  15.     MAX_NUM = 255;
  16.     MIN_EXT = 5;
  17.     MIN_LEN = 1;
  18.     MAX_LEN = 32;
  19.     MIN_OPTION = 1;
  20.     MAX_OPTION = 2;
  21.     Err: Array [TErrorCode] Of String = ('', 'Error. Incorrect choice. Please try again.', 'Error. Non-numeric value. Please try again. ',
  22.         'Error. Out of Range. Please try again. ', 'Error. File not .txt. Please try again', 'Error. File not Exist. Please try again.',
  23.         'Error. File not readable. Please try again.', 'Error. File not writable. Please try again.',
  24.         'Error. File not closeable. Please try again.', 'Error. File is empty. Please try again.',
  25.         'Error. Reading went wrong. Please try again.', 'Error. The file lacks sufficient information.',
  26.         'Error. String out of Range. Please try again. ', 'Error. Too much information in the file.  Please try again.');
  27.  
  28. Procedure ProgramTask();
  29. Begin
  30.     Writeln('This program extracts unique characters from a string and forms a set of digits and punctuation marks.');
  31. End;
  32.  
  33. Function ExtractSubstring(Const Str: String; Const PosStart, PosEnd: Integer): String;
  34. Var
  35.     I: Integer;
  36.     PartStr: String;
  37. Begin
  38.     PartStr := '';
  39.     For I := PosStart To PosEnd Do
  40.         PartStr := PartStr + Str[I];
  41.     ExtractSubstring := PartStr;
  42. End;
  43.  
  44. Function IsFileTxt(Const PathToFile: String): TErrorCode;
  45. Var
  46.     ErrorCode: TErrorCode;
  47.     Len: Integer;
  48. Begin
  49.     ErrorCode := CORRECT;
  50.     Len := Length(PathToFile);
  51.     If (Len < MIN_EXT) Or (ExtractSubstring(PathToFile, Len - 3, Len) <> '.txt') Then
  52.         ErrorCode := FILE_NOT_TXT;
  53.     IsFileTxt := ErrorCode;
  54. End;
  55.  
  56. Function IsFileExist(Const PathToFile: String): TErrorCode;
  57. Var
  58.     ErrorCode: TErrorCode;
  59. Begin
  60.     ErrorCode := CORRECT;
  61.     If Not FileExists(PathToFile) Then
  62.         ErrorCode := FILE_NOT_EXIST;
  63.     IsFileExist := ErrorCode;
  64. End;
  65.  
  66. Function IsFileReadable(Var FileName: TextFile): TErrorCode;
  67. Var
  68.     ErrorCode: TErrorCode;
  69. Begin
  70.     ErrorCode := CORRECT;
  71.     Try
  72.         Reset(FileName);
  73.     Except
  74.         ErrorCode := FILE_NOT_READABLE
  75.     End;
  76.     IsFileReadable := ErrorCode;
  77. End;
  78.  
  79. Function IsFileWritable(Var FileName: TextFile): TErrorCode;
  80. Var
  81.     ErrorCode: TErrorCode;
  82. Begin
  83.     ErrorCode := CORRECT;
  84.     Try
  85.         Append(FileName);
  86.     Except
  87.         ErrorCode := FILE_NOT_WRITABLE;
  88.     End;
  89.     IsFileWritable := ErrorCode;
  90. End;
  91.  
  92. Function IsFileCloseable(Var FileName: TextFile): TErrorCode;
  93. Var
  94.     ErrorCode: TErrorCode;
  95. Begin
  96.     ErrorCode := CORRECT;
  97.     Try
  98.         CloseFile(FileName);
  99.     Except
  100.         ErrorCode := FILE_NOT_CLOSE
  101.     End;
  102.     IsFileCloseable := ErrorCode;
  103. End;
  104.  
  105. Procedure GetInputFilePath(Var FileName: TextFile);
  106. Var
  107.     Error: TErrorCode;
  108.     PathToFile: String;
  109. Begin
  110.     Repeat
  111.         Readln(PathToFile);
  112.         Error := IsFileTxt(PathToFile);
  113.         If Error = CORRECT Then
  114.         Begin
  115.             Error := IsFileTxt(PathToFile);
  116.             AssignFile(FileName, PathToFile);
  117.         End;
  118.         If Error = CORRECT Then
  119.             Error := IsFileReadable(FileName);
  120.         If (Error = CORRECT) And (EOF(FileName)) Then
  121.             Error := FILE_IS_EMPTY;
  122.         If Error <> CORRECT Then
  123.             Writeln(ERR[Error]);
  124.     Until Error = CORRECT;
  125. End;
  126.  
  127. Procedure GetOutputFilePath(Var FileName: TextFile);
  128. Var
  129.     Error: TErrorCode;
  130.     PathToFile: String;
  131. Begin
  132.     Repeat
  133.         Readln(PathToFile);
  134.         Error := IsFileTxt(PathToFile);
  135.         If Error = CORRECT Then
  136.         Begin
  137.             Error := IsFileTxt(PathToFile);
  138.             AssignFile(FileName, PathToFile);
  139.         End;
  140.         If Error = CORRECT Then
  141.             Error := IsFileWritable(FileName);
  142.         If Error <> CORRECT Then
  143.             Writeln(ERR[Error]);
  144.     Until Error = CORRECT;
  145. End;
  146.  
  147. Function ReadStringFromConsole(Const MIN_COUNT, MAX_COUNT: Integer): AnsiString;
  148. Var
  149.     Str: AnsiString;
  150.     Error: TErrorCode;
  151. Begin
  152.     Repeat
  153.         Writeln('Please write a sequence of characters (1 to 32 symbols).');
  154.         Error := CORRECT;
  155.         Readln(Str);
  156.         If (Length(Str) < MIN_COUNT) Or (Length(Str) > MAX_COUNT) Then
  157.             Error := STRING_OUT_OF_RANGE;
  158.         If Error <> CORRECT Then
  159.             Write(ERR[Error]);
  160.     Until Error = CORRECT;
  161.     ReadStringFromConsole := Str;
  162. End;
  163.  
  164. Function FindFileStringNumber(Var FileName: TextFile): Integer;
  165. Var
  166.     Counter: Integer;
  167. Begin
  168.     Counter := 0;
  169.     While Not EOF(FileName) Do
  170.     Begin
  171.         Readln(FileName);
  172.         Inc(Counter);
  173.     End;
  174.     FindFileStringNumber := Counter;
  175. End;
  176.  
  177. Function ReadStringFromFile(Const MIN_COUNT, MAX_COUNT: Integer): AnsiString;
  178. Var
  179.     Counter: Integer;
  180.     Str: AnsiString;
  181.     FileName: TextFile;
  182.     Error: TErrorCode;
  183. Begin
  184.     Repeat
  185.         WriteLn('Enter the path to the file with extension ".txt"');
  186.         Error := CORRECT;
  187.         GetInputFilePath(FileName);
  188.         Counter := FindFileStringNumber(FileName);
  189.         If Counter < 1 Then
  190.             Error := FILE_NOT_FULL;
  191.         If Counter > 1 Then
  192.         Begin
  193.             Error := TOO_MUCH;
  194.             Writeln(ERR[Error]);
  195.             Str := ReadStringFromConsole(MIN_COUNT, MAX_COUNT);
  196.             Error := CORRECT;
  197.         End
  198.         Else
  199.         Begin
  200.             Reset(FileName);
  201.             ReadLn(FileName, Str);
  202.             If (Length(Str) < MIN_COUNT) Or (Length(Str) > MAX_COUNT) Then
  203.                 Error := STRING_OUT_OF_RANGE;
  204.             If Error <> CORRECT Then
  205.             Begin
  206.                 Write(ERR[Error]);
  207.                 Writeln('Please write string');
  208.                 Str := ReadStringFromConsole(MIN_COUNT, MAX_COUNT);
  209.             End;
  210.         End;
  211.         Error := IsFileCloseable(FileName);
  212.         If Error <> CORRECT Then
  213.             Writeln(ERR[Error]);
  214.     Until Error = CORRECT;
  215.     ReadStringFromFile := Str;
  216. End;
  217.  
  218. Function GetUserOption(): Integer;
  219. Var
  220.     Error: TErrorCode;
  221.     Option: Integer;
  222. Begin
  223.     Option := 0;
  224.     Repeat
  225.         Error := CORRECT;
  226.         Try
  227.             Readln(Option);
  228.         Except
  229.             Error := NON_NUMERIC;
  230.         End;
  231.         If (Error = CORRECT) And ((Option < MIN_OPTION) Or (Option > MAX_OPTION)) Then
  232.             Error := INCORRECT_CHOICE;
  233.         If Error <> CORRECT Then
  234.             Write(ERR[Error]);
  235.     Until Error = CORRECT;
  236.     GetUserOption := Option;
  237. End;
  238.  
  239. Procedure ChooseInputMethod(Var Str: AnsiString);
  240. Var
  241.     Option: Integer;
  242. Begin
  243.     Writeln('If you want to read from console enter: 1');
  244.     Writeln('If you want to read from File enter: 2');
  245.     Option := GetUserOption();
  246.     If Option = MAX_OPTION Then
  247.         Str := ReadStringFromFile(MIN_LEN, MAX_LEN)
  248.     Else
  249.         Str := ReadStringFromConsole(MIN_LEN, MAX_LEN);
  250. End;
  251.  
  252. Function CreateSetOfUniqueChars(Const Str: AnsiString): TSet1;
  253. Var
  254.     UniqueChars: TSet1;
  255.     Ch: AnsiChar;
  256.     I: Integer;
  257. Begin
  258.     UniqueChars := [];
  259.     For I := 1 To Length(Str) Do
  260.     Begin
  261.         Ch := Str[I];
  262.         Include(UniqueChars, Ch);
  263.     End;
  264.     CreateSetOfUniqueChars := UniqueChars;
  265. End;
  266.  
  267. Function CreateSetOfDigitsAndPunctuation(Const UniqueChars: TSet1): TSet2;
  268. Var
  269.     DigitsAndPunctuation: TSet2;
  270.     Ch: AnsiChar;
  271. Begin
  272.     DigitsAndPunctuation := [];
  273.     For Ch In UniqueChars Do
  274.     Begin
  275.         If Ch In ['0' .. '9', '.', ',', ';', ':', '!', '?', '-', '(', ')', '"', ''''] Then
  276.             Include(DigitsAndPunctuation, Ch);
  277.     End;
  278.     CreateSetOfDigitsAndPunctuation := DigitsAndPunctuation;
  279. End;
  280.  
  281. Function CreateStringFromSet(Const CharSet: TSet1): AnsiString;
  282. Var
  283.     Str: AnsiString;
  284.     Ch: AnsiChar;
  285. Begin
  286.     Str := '';
  287.     For Ch In CharSet Do
  288.         Str := Str + Ch + ' ';
  289.     CreateStringFromSet := Str;
  290. End;
  291.  
  292. Procedure PrintFile(Const Str1, Str2: AnsiString);
  293. Var
  294.     FileName: TextFile;
  295.     ErrorCode: TErrorCode;
  296. Begin
  297.     Repeat
  298.         Writeln('Enter the name of the output file with extension ".txt":');
  299.         GetOutputFilePath(FileName);
  300.         ErrorCode := CORRECT;
  301.         Rewrite(FileName);
  302.         Writeln(FileName, 'Unique characters:');
  303.         Writeln(FileName, Str1);
  304.         Writeln(FileName, 'Digits and punctuation:');
  305.         Writeln(FileName, Str2);
  306.         ErrorCode := IsFileCloseable(FileName);
  307.         If ErrorCode <> CORRECT Then
  308.             Writeln(ERR[ErrorCode]);
  309.     Until ErrorCode = CORRECT;
  310.     Writeln('Results saved to file.');
  311. End;
  312.  
  313. Procedure PrintConsole(Const Str1, Str2: AnsiString);
  314. Begin
  315.     WriteLn('');
  316.     WriteLn('Unique characters:');
  317.     WriteLn(Str1);
  318.     WriteLn('Digits and punctuation:');
  319.     WriteLn(Str2);
  320. End;
  321.  
  322. Procedure PrintAnswer(Const Str1, Str2: AnsiString);
  323. Var
  324.     Option: Integer;
  325. Begin
  326.     Writeln('Print to console (1) or file (2)?');
  327.     Option := GetUserOption();
  328.     If Option = MAX_OPTION Then
  329.         PrintFile(Str1, Str2)
  330.     Else
  331.         PrintConsole(Str1, Str2);
  332. End;
  333.  
  334. Var
  335.     Str, UniqueCharsStr, DigitsAndPunctuationStr: AnsiString;
  336.     UniqueChars: TSet1;
  337.     DigitsAndPunctuation: TSet2;
  338.  
  339. Begin
  340.     ProgramTask();
  341.     ChooseInputMethod(Str);
  342.     UniqueChars := CreateSetOfUniqueChars(Str);
  343.     DigitsAndPunctuation := CreateSetOfDigitsAndPunctuation(UniqueChars);
  344.     UniqueCharsStr := CreateStringFromSet(UniqueChars);
  345.     DigitsAndPunctuationStr := CreateStringFromSet(DigitsAndPunctuation);
  346.     PrintAnswer(UniqueCharsStr, DigitsAndPunctuationStr);
  347.     Writeln('Press Enter to exit.');
  348.     Readln;
  349. End.
Advertisement
Add Comment
Please, Sign In to add comment