Advertisement
ksyshshot

Lab.3.2*

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