Advertisement
ksyshshot

Lab_3.2

Nov 15th, 2022 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.68 KB | Source Code | 0 0
  1. Program Lab_3_2;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. Uses
  7.     System.SysUtils;
  8.  
  9. Type
  10.     TSet = Set Of Char;
  11.  
  12. Var
  13.     Choice: Integer;
  14.     Answer: TSet;
  15.     Sequence: AnsiString;
  16.  
  17. Procedure WriteTask();
  18. Begin
  19.     Writeln('Данная программа строит и печатает множество, элементами которого являются встречающиеся в последовательности скобки: () [] {} и цифры');
  20. End;
  21.  
  22. Function TakeCharacterSequenceFromConsole(): AnsiString;
  23. Const
  24.     MIN_LENGTH = 1;
  25.     MAX_LENGTH = 255;
  26. Var
  27.     Sequence: AnsiString;
  28.     I: Integer;
  29.     IsCorrect: Boolean;
  30. Begin
  31.     Repeat
  32.         IsCorrect := True;
  33.         Write('Введите непустую последовательность: ');
  34.         Try
  35.             Readln(Sequence);
  36.         Except
  37.             IsCorrect := False;
  38.             Writeln('Произошла ошибка ввода. Повторите попытку...');
  39.         End;
  40.     Until (IsCorrect);
  41.     TakeCharacterSequenceFromConsole := Sequence;
  42. End;
  43.  
  44. Function TakePathToFile(): String;
  45. Var
  46.     Path: String;
  47.     IsCorrect: Boolean;
  48.     F: TextFile;
  49. Begin
  50.     Repeat
  51.         IsCorrect := True;
  52.         Write('Введите путь к файлу: ');
  53.         Readln(Path);
  54.         AssignFile(F, Path);
  55.         If (Not(FileExists(Path))) Then
  56.         Begin
  57.             IsCorrect := False;
  58.             Writeln('Не удалось найти файл по заданному пути. Повторите попытку...');
  59.         End;
  60.     Until (IsCorrect);
  61.     TakePathToFile := Path;
  62. End;
  63.  
  64. Function TakeCharacterSequenceFromFile(): AnsiString;
  65. Const
  66.     MIN_LENGTH = 1;
  67.     MAX_LENGTH = 255;
  68. Var
  69.     Sequence: AnsiString;
  70.     Path: String;
  71.     IsCorrect: Boolean;
  72.     F: TextFile;
  73. Begin
  74.     Writeln('Требуется файл для чтения строки.');
  75.     Path := TakePathToFile();
  76.     Repeat
  77.         IsCorrect := True;
  78.         AssignFile(F, Path);
  79.         Try
  80.             Reset(F);
  81.             Try
  82.                 Readln(F, Sequence);
  83.             Except
  84.                 IsCorrect := False;
  85.                 Write('Произошла ошибка доступа к файлу. ');
  86.             End;
  87.         Except
  88.             CloseFile(F);
  89.             IsCorrect := False;
  90.             Write('Произошла ошибка доступа к файлу. ');
  91.         End;
  92.         If Not(IsCorrect) Then
  93.         Begin
  94.             Writeln('Повторите попытку. Заново введите путь к файлу: ');
  95.             Path := TakePathToFile();
  96.         End;
  97.     Until (IsCorrect);
  98.     Writeln('Полученная строка: ', Sequence);
  99.     TakeCharacterSequenceFromFile := Sequence;
  100. End;
  101.  
  102. Function GetSearchСharactersSet(Sequence: AnsiString): TSet;
  103. Const
  104.     SearchCharacters = [#40, #41, #91, #93, #123, #125, #48..#57];
  105. Var
  106.     SearchSet: TSet;
  107.     I: Integer;
  108. Begin
  109.     SearchSet := [];
  110.     For I := 1 To Length(Sequence) Do
  111.         If Sequence[I] In SearchCharacters Then
  112.             Include(SearchSet, Sequence[I]);
  113.     GetSearchСharactersSet := SearchSet;
  114. End;
  115.  
  116. Procedure OutputSetInConsole(CharactersSet: TSet);
  117. Var
  118.     I: Integer;
  119. Begin
  120.     If CharactersSet <> [] Then
  121.     Begin
  122.         For I := 0 To 255 Do
  123.             If Chr(I) In CharactersSet Then
  124.                 Write(Chr(I), ' ');
  125.         Writeln;
  126.     End
  127.     Else
  128.         Writeln('В строке не было найдено скобок и цифр.');
  129. End;
  130.  
  131. Procedure OutputSetInFile(CharactersSet: TSet);
  132. Var
  133.     I: Integer;
  134.     F: TextFile;
  135.     Path: String;
  136.     IsCorrect: Boolean;
  137. Begin
  138.     Writeln('Требуется файл для записи искомого множества.');
  139.     Path := TakePathToFile();
  140.     Repeat
  141.         IsCorrect := True;
  142.         AssignFile(F, Path);
  143.         Try
  144.             Rewrite(F);
  145.             If CharactersSet <> [] Then
  146.             Begin
  147.                 I := 0;
  148.                 While (IsCorrect) And (I In [0..255]) Do
  149.                 Begin
  150.                     If Chr(I) In CharactersSet Then
  151.                         Try
  152.                             Write(F, Chr(I));
  153.                         Except
  154.                             IsCorrect := False;
  155.                             Write('Не удалось произвести запись в файл. ');
  156.                         End;
  157.                     Inc(I);
  158.                 End;
  159.             End
  160.             Else
  161.                 Writeln(F, 'В строке не было найдено скобок и цифр.');
  162.         Except
  163.             CloseFile(F);
  164.             IsCorrect := False;
  165.             Write('Произошла ошибка доступа к файлу. ');
  166.         End;
  167.         If Not(IsCorrect) Then
  168.         Begin
  169.             Writeln('Повторите попытку. Заново введите путь к файлу: ');
  170.             Path := TakePathToFile();
  171.         End;
  172.     Until (IsCorrect);
  173.     Writeln('Множество записано в файл!');
  174. End;
  175.  
  176. Function ChooseInputOutputMethod(): Integer;
  177. Var
  178.     IsCorrect: Boolean;
  179.     Choice: Integer;
  180. Begin
  181.     Repeat
  182.         IsCorrect := True;
  183.         Try
  184.             Readln(Choice);
  185.         Except
  186.             Writeln ('Число введено некорректно. Повторите попытку...');
  187.             IsCorrect := False;
  188.         End;
  189.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  190.         Begin
  191.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  192.             IsCorrect := False;
  193.         End;
  194.     Until (IsCorrect);
  195.     ChooseInputOutputMethod := Choice;
  196. End;
  197.  
  198. Function GetCharacterSequence(Choice: Integer): AnsiString;
  199. Var
  200.     Sequence: AnsiString;
  201. Begin
  202.     If (Choice = 1) Then
  203.         Sequence := TakeCharacterSequenceFromConsole()
  204.     Else
  205.         Sequence := TakeCharacterSequenceFromFile();
  206.     GetCharacterSequence := Sequence;
  207. End;
  208.  
  209. Procedure OutputResult(Choice: Integer; Answer: TSet);
  210. Begin
  211.     If  (Choice = 1) Then
  212.         OutputSetInConsole(Answer)
  213.     Else
  214.         OutputSetInFile(Answer);
  215. End;
  216.  
  217. Begin
  218.     WriteTask();
  219.     Write('Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ');
  220.     Choice := ChooseInputOutputMethod();
  221.     Sequence := GetCharacterSequence(Choice);
  222.     Answer := GetSearchСharactersSet(Sequence);
  223.     Write('Выберите способ вывода данных (1 - через консоль, 2 - с помощью файлов): ');
  224.     Choice := ChooseInputOutputMethod();
  225.     OutputResult(Choice, Answer);
  226.     Readln;
  227. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement