Используя стек, проверить правильность вложений операторных скобок (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. Если все символы проверены и ошибок не найдено, выводит сообщение об успешном завершении.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д