Найти ошибку в построении бинарного дерева - Pascal ABC
Формулировка задачи:
Код программы:
Подается на вход:
5+(2*(3-1))
Запись в дереве:
( ( 5 + 2 ) * ( 3 - 1 ))
Правильная запись в дереве:
( 5 + ( 2 * ( 3 - 1 ) ) )
Заранее спасибо за помощь
Если быть точным ошибка здесь,может посоветуете что с приоритетами сделать?
Решение задачи: «Найти ошибку в построении бинарного дерева»
textual
Листинг программы
procedure Build_Base(s: string; var root: Tfpile);//Tfpie-дерево var k, i: Byte; x, err: integer; work: array[1..255] of integer; s1: string; //Функция определения места очередного знака из множества op в s function SearchOp(s: string; op: oper): Byte;//oper:set of char,где содержатся все операции var i, n, k, x: Byte; begin n := length(s); i := n; k := 0; while (i >= 1) and not (S[i] in op) do dec(i); if i < 1 then SearchOp := 0 else if s[i] in op then SearchOp := i else begin if s[i] = '(' then begin writeln('Error1'); //Halt end; if s[i] = ')' then begin k := 1; while (i >= 1) and (k > 0) do begin if s[i] = ')' then k := k + 1; if s[i] = '(' then k := k - 1; dec(i); end; if (i < 1) then SearchOp := 0 else if k < 0 then begin writeln('Error2'); //Halt end else begin x := SearchOp(copy(s, 1, i - 1), op); if x > 0 then SearchOp := x else SearchOp := 0; end; end; end; end; begin //определяем корректность расстановки скобок k := 0; for i := 1 to length(s) do begin if s[i] = '(' then k := k + 1; work[i] := k; if s[i] = ')' then k := k - 1; end; //Если в выражении первый символ открывающая скобка, а последний //символ – закрывающая скобка и эти скобки образуют пару, удаляем их if (work[1] = 1) and (work[length(s)] = 1) then begin k := 0; for i := 1 to length(s) do if work[i] = 0 then k := k + 1; if k = 0 then s := copy(s, 2, length(s) - 1); end; //ищем операцию * или / k := SearchOp(s, ['*', '/']); if k > 0 then begin new(root); root^.znak := s[k]; root^.perem := ''; root^.chislo := Maxint; Build_Base(copy(s, k + 1, length(s) - k), root^.tfright); Build_Base(copy(s, 1, k - 1), root^.tfleft); end else begin //Ищем операции + или - k := SearchOp(s, ['+', '-']); if k > 0 then begin new(root); root^.znak := s[k]; root^.perem := ''; root^.chislo := Maxint; Build_Base(copy(s, k + 1, length(s) - k), root^.tfright); Build_Base(copy(s, 1, k - 1), root^.tfleft); end else begin //Знаков операция не найдено, ищем переменную if (length(s) = 1) and (lowcase(s[1]) in ['a'..'z']) then begin new(root); root^.znak := #0; root^.perem := s; writeln('Введите ', root^.perem, ':'); readln(root^.chislo); root^.tfleft := nil; root^.tfright := nil; end else begin for i := 1 to length(s) do if s[i] in ['0'..'9'] then s1 := s1 + s[i]; s := s1; Val(s, x, err); if err = 0 then begin new(root); root^.znak := #0; root^.perem := ''; root^.chislo := x; root^.tfleft := nil; root^.tfright := nil; end else begin writeln('!!!FatalErrorOfHate!!!'); end; end; end; end; end;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д