Найти ошибку в построении бинарного дерева - 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;

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


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

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

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