Advertisement
ksyshshot

Lab.3.2**

Nov 15th, 2022
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.43 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.             Finally
  84.                 CloseFile(F);
  85.             End
  86.         Except
  87.             IsCorrect := False;
  88.             Write('Произошла ошибка доступа к файлу. ');
  89.             Writeln('Повторите попытку. Заново введите путь к файлу: ');
  90.             Path := TakePathToFile();
  91.         End;
  92.     Until (IsCorrect);
  93.     Writeln('Полученная строка: ', Sequence);
  94.     TakeCharacterSequenceFromFile := Sequence;
  95. End;
  96.  
  97. Function GetSearchСharactersSet(Sequence: AnsiString): TSet;
  98. Const
  99.     SearchCharacters = [#40, #41, #91, #93, #123, #125, #48..#57];
  100. Var
  101.     SearchSet: TSet;
  102.     I: Integer;
  103. Begin
  104.     SearchSet := [];
  105.     For I := 1 To Length(Sequence) Do
  106.         If Sequence[I] In SearchCharacters Then
  107.             Include(SearchSet, Sequence[I]);
  108.     GetSearchСharactersSet := SearchSet;
  109. End;
  110.  
  111. Procedure OutputSetInConsole(CharactersSet: TSet);
  112. Var
  113.     I: Integer;
  114. Begin
  115.     If CharactersSet <> [] Then
  116.     Begin
  117.         For I := 0 To 255 Do
  118.             If Chr(I) In CharactersSet Then
  119.                 Write(Chr(I), ' ');
  120.         Writeln;
  121.     End
  122.     Else
  123.         Writeln('В строке не было найдено скобок и цифр.');
  124. End;
  125.  
  126. Procedure OutputSetInFile(CharactersSet: TSet);
  127. Var
  128.     I: Integer;
  129.     F: TextFile;
  130.     Path: String;
  131.     IsCorrect: Boolean;
  132. Begin
  133.     Writeln('Требуется файл для записи искомого множества.');
  134.     Path := TakePathToFile();
  135.     Repeat
  136.         IsCorrect := True;
  137.         AssignFile(F, Path);
  138.         Try
  139.             Rewrite(F);
  140.             Try
  141.                 If (CharactersSet <> []) Then
  142.                 Begin
  143.                     I := 0;
  144.                     While (IsCorrect) And (I In [0..255]) Do
  145.                     Begin
  146.                         If Chr(I) In CharactersSet Then
  147.                         Begin
  148.                             Write(F, Chr(I));
  149.                             Write(F, ' ');
  150.                         End;
  151.                         Inc(I);
  152.                     End;
  153.                 End
  154.                 Else
  155.                     Write(F, 'В последовательности не были найдены искомые символы.');
  156.             Finally
  157.                 CloseFile(F);
  158.             End;
  159.         Except
  160.             IsCorrect := False;
  161.             Write('Произошла ошибка доступа к файлу. ');
  162.             Writeln('Повторите попытку. Заново введите путь к файлу: ');
  163.             Path := TakePathToFile();
  164.         End;
  165.     Until (IsCorrect);
  166.     Writeln('Множество записано в файл!');
  167. End;
  168.  
  169. Function ChooseInputOutputMethod(): Integer;
  170. Var
  171.     IsCorrect: Boolean;
  172.     Choice: Integer;
  173. Begin
  174.     Repeat
  175.         IsCorrect := True;
  176.         Try
  177.             Readln(Choice);
  178.         Except
  179.             Writeln ('Число введено некорректно. Повторите попытку...');
  180.             IsCorrect := False;
  181.         End;
  182.         If (IsCorrect) And (Choice <> 1) And (Choice <> 2) Then
  183.         Begin
  184.             Writeln ('Введите либо 1, либо 2. Ваш выбор: ');
  185.             IsCorrect := False;
  186.         End;
  187.     Until (IsCorrect);
  188.     ChooseInputOutputMethod := Choice;
  189. End;
  190.  
  191. Function GetCharacterSequence(Choice: Integer): AnsiString;
  192. Var
  193.     Sequence: AnsiString;
  194. Begin
  195.     If (Choice = 1) Then
  196.         Sequence := TakeCharacterSequenceFromConsole()
  197.     Else
  198.         Sequence := TakeCharacterSequenceFromFile();
  199.     GetCharacterSequence := Sequence;
  200. End;
  201.  
  202. Procedure OutputResult(Choice: Integer; Answer: TSet);
  203. Begin
  204.     If  (Choice = 1) Then
  205.         OutputSetInConsole(Answer)
  206.     Else
  207.         OutputSetInFile(Answer);
  208. End;
  209.  
  210. Begin
  211.     WriteTask();
  212.     Write('Выберите способ ввода данных (1 - через консоль, 2 - с помощью файлов): ');
  213.     Choice := ChooseInputOutputMethod();
  214.     Sequence := GetCharacterSequence(Choice);
  215.     Answer := GetSearchСharactersSet(Sequence);
  216.     Write('Выберите способ вывода данных (1 - через консоль, 2 - с помощью файлов): ');
  217.     Choice := ChooseInputOutputMethod();
  218.     OutputResult(Choice, Answer);
  219.     Readln;
  220. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement