Проверить, содержит ли строка правильную скобочную запись - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Дана символьная строка, содержащая скобки четырех видов ( {}, [], () и <> ) и заканчивающаяся точкой. Напишите рекурсивную функцию, проверяющую, содержит ли эта строка правильную скобочную запись. Подскажите как делать, рекурсия никак не дается для осознания.

Решение задачи: «Проверить, содержит ли строка правильную скобочную запись»

textual
Листинг программы
  1. Function Check(s : String) : Boolean;
  2. Const  c = '{}[]()<>';
  3. Var k : Integer;
  4.     f : Boolean;
  5. Begin
  6.   If s[1]<>#0 then
  7.   Begin
  8.     If Pos('.',s)>0 then s:=Copy(s,1,Pos('.',s)); {укорачиваем до точки}
  9.     For k:=Length(s) downto 1 do
  10.       If Pos(s[k],c)=0 then Delete(s,k,1);
  11.     s:=#0+s;
  12.   end;
  13.   f:=False;
  14.   For k:=1 to Length(c) div 2 do
  15.     If Pos(Copy(c,k*2-1,2),s)>0 then
  16.     Begin
  17.       Delete(s,Pos(Copy(c,k*2-1,2),s),2);
  18.       f:=True;
  19.     end;
  20.   Check:=f and ((Length(s)=1) or Check(s));
  21. end;
  22.  
  23. Var St : String;
  24. Begin
  25.   // Readln(St);
  26.   // Writeln(Check(St));
  27.   Writeln(Check('0[0(0)0]0.[('));        {True}
  28.   Writeln(Check('0[0(0)0<0>0].)))[[[')); {True}
  29.   Writeln(Check('[(0)<0>]{.'));          {False}
  30.   Writeln(Check('[0()<0>]{}['));         {False}
  31.   Writeln(Check('[0()<0>]{}0(<0>).]>')); {True}
  32. end.

Объяснение кода листинга программы

  1. В функции Check(s: String) : Boolean происходит проверка строки s на правильную скобочную запись.
  2. Если первый символ строки s не равен символу конца строки (#0), то выполняется следующий блок кода.
  3. Если в строке s есть точка (Pos('.',s) > 0), то строка укорачивается до точки (s := Copy(s,1,Pos('.',s))).
  4. Далее, в цикле For, проверяется каждый символ строки s на наличие в константе c ('.' + '{}[]()<>').
  5. Если символ найден, то он удаляется из строки s (Delete(s,Pos(Copy(c,k*2-1,2),s),2)).
  6. Флаг f устанавливается в True, если найден хотя бы один символ из константы c.
  7. После цикла For, флаг f проверяется на равенство True и в случае положительного результата, функция возвращает True.
  8. Если длина строки s равна 1, то функция возвращает True.
  9. В противном случае, вызывается рекурсивный вызов функции Check(s).
  10. В основной части кода, функция Check вызывается для различных тестовых строк.
  11. Для первой тестовой строки '0[0(0)0]0.[(') функция возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  12. Для второй тестовой строки '0[0(0)0<0>0].)))[[[', функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  13. Для третьей тестовой строки '[(0)<0>]{}.'), функция возвращает False, так как закрывающая скобка ')' находится перед открывающей скобкой '(' и это не допустимо.
  14. Для четвертой тестовой строки '[0()<0>]{}0(<0>).]>'), функция также возвращает True, так как все символы из константы c присутствуют в строке и в правильном порядке.
  15. В основной части кода, после вызова функции Check для каждой тестовой строки, выводится результат проверки (True или False).
  16. Комментарии к коду описывают, что делает каждый блок кода.
  17. Комментарии начинаются с символа '//', а затем идет описание кода.
  18. Комментарии не влияют на работу программы, так как они игнорируются компилятором.
  19. Комментарии используются для пояснения кода и его отладки.
  20. Комментарии могут быть использованы для документирования кода и описания его функциональности.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы