Используя стек, проверить правильность вложений операторных скобок (begin - end) в программе на Паскале - Free Pascal
Формулировка задачи:
В файле находится текст программы на Паскале. Используя стек, проверить правильность вложений операторных скобок (begin - end) в этой программе.
Решение задачи: «Используя стек, проверить правильность вложений операторных скобок (begin - end) в программе на Паскале»
textual
Листинг программы
type stack = record data : array [0..100000] of char; size : longint; end; var Myst : stack; i : longint; fin, fout : text; tmp : char; line, row : longint; Flag : boolean; procedure push(ch : char; var st : stack); begin inc(st.size); st.data[st.size] := ch; end; function isempty(st : stack) : boolean; begin if (st.size = 0) then isempty := true else isempty := false; end; procedure pop(var st : stack); begin if(NOT isempty(st)) then begin st.data[st.size] := ' '; dec(st.size); end else writeln('Stack is empty!'); end; procedure OpenFileIn(var f : text); var NameF : string; begin write('Введите название проверяемого файла'); readln(NameF); assign(f, NameF); reset(f); end; procedure OpenFileOut(var f : text); var NameF : string; begin NameF := 'result.txt'; writeln('Результат в файле: ',NameF); assign(f, NameF); rewrite(f); end; function compare(ch : char) : boolean; begin if (ch = '(') or (ch = '[') or (ch = '{') then push(ch, Myst) else begin if(ch = ')') then if (Myst.data[Myst.size] = '(') then pop(Myst) else compare := false; if(ch = ']') then if (Myst.data[Myst.size] = '[') then pop(Myst) else compare := false; if(ch = '}') then if (Myst.data[Myst.size] = '{') then pop(Myst) else compare := false; end; end; BEGIN row := 1; line := 1; Flag := true; OpenFileIn(fin); while (NOT EOF(fin)) do begin while(NOT EOLn(fin)) do begin read(fin, tmp); Flag := compare(tmp); if (Flag = false) then begin OpenFileOut(fout); writeln(fout, 'Error: ', line, ' ', row); close(fout); exit(); end; inc(row); end; readln(fin); row := 1; inc(line); end; OpenFileOut(fout); if (isempty(Myst)) then writeln(fout, 'No errors!') else writeln(fout, 'Not enough of closing brackets'); Close(fout); Close(fin); END.
Объяснение кода листинга программы
- Тип данных переменной
Myst
— stack (стек), она содержит массив символов и счетчик размера. - Вложенные функции и процедуры:
a. Push — добавляет символ в стек.
b. Isempty — проверяет, пуст ли стек.
c. Pop — удаляет и возвращает последний добавленный в стек символ (предполагая, что стек не пуст).
d. OpenFileIn — открывает файл для чтения и сохраняет его имя в переменной
f
. e. OpenFileOut — открывает файл для записи и сохраняет его имя в переменнойf
. f. Compare — сравнивает последний символ в стеке со введенным символом и, если необходимо, удаляет соответствующие скобки из стека. - Основная программа: a. Создает файл для записи результатов. b. Открывает файл для чтения и начинает его обрабатывать построчно. c. Проверяет каждый символ в строке на соответствие скобкам '(' и ')', '[' и ']', '{ и }'. d. Если символ не соответствует, записывает информацию об ошибке в файл результатов и выводит сообщение об ошибке. e. Если все символы проверены и ошибок не найдено, выводит сообщение об успешном завершении.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д