Advertisement
ksyshshot

Lab.3.2

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