Используя стек, проверить правильность вложений операторных скобок (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.

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

  1. Тип данных переменной Myst — stack (стек), она содержит массив символов и счетчик размера.
  2. Вложенные функции и процедуры: a. Push — добавляет символ в стек. b. Isempty — проверяет, пуст ли стек. c. Pop — удаляет и возвращает последний добавленный в стек символ (предполагая, что стек не пуст). d. OpenFileIn — открывает файл для чтения и сохраняет его имя в переменной f. e. OpenFileOut — открывает файл для записи и сохраняет его имя в переменной f. f. Compare — сравнивает последний символ в стеке со введенным символом и, если необходимо, удаляет соответствующие скобки из стека.
  3. Основная программа: a. Создает файл для записи результатов. b. Открывает файл для чтения и начинает его обрабатывать построчно. c. Проверяет каждый символ в строке на соответствие скобкам '(' и ')', '[' и ']', '{ и }'. d. Если символ не соответствует, записывает информацию об ошибке в файл результатов и выводит сообщение об ошибке. e. Если все символы проверены и ошибок не найдено, выводит сообщение об успешном завершении.

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


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

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

15   голосов , оценка 4.2 из 5
Похожие ответы