program Lab2_1; uses crt; const n = 6; TextFile = 'file_in.pas'; type BTr = ^BTree; PTree = ^TTree; BTree = record data : char; left : PTree; right : PTree; end; TTree = object private barrier : boolean; zv : BTr; procedure CreateTree(fCh : char); function IsOper(C : char) : boolean; procedure KillSk(var S : string); function GetOperPos(S : string) : word; public constructor Create; procedure SetTree(S : string); function GetLevel : word; function GetValue : real; destructor Done; end; var Tree : PTree; mL : integer; F : text; root : BTr; Str : string; level : word; constructor TTree.Create; begin barrier := true end; destructor TTree.Done; begin if barrier then exit; zv^.left^.Done; zv^.right^.Done; dispose(zv^.left); dispose(zv^.right); dispose(zv) end; function Max(v1, v2 : word) : word; begin if v1 > v2 then Max := v1 else Max := v2 end; procedure ReadFile(var S : string); var C : char; begin S := ''; reset(F); while not eof(F) do begin read(F, C); if C <> '=' then S := S + C end; close(F) end; procedure PrintTree(b : PTree; level : integer); var i : integer; begin if b^.barrier then exit; PrintTree(b^.zv^.right, level + 3); write('':level); writeln('':level,' ',b^.zv^.data); PrintTree(b^.zv^.left, level + 3) end; procedure TTree.CreateTree(fCh : char); begin new(zv); new(zv^.left, Create); new(zv^.right, Create); zv^.data := fCh; barrier := false; end; function TTree.IsOper(C : char) : boolean; begin if (C = '+') or (C = '-') or (C = '*') or (C = '/') then IsOper := true else IsOper := false end; procedure TTree.KillSk(var S : string); var i, sk : integer; begin while (S[1] = '(') and (S[length(S)] = ')') do begin sk := 0; for i := 2 to length(S)-1 do begin if sk < 0 then exit; if S[i] = '(' then inc(sk); if S[i] = ')' then dec(sk) end; if sk = 0 then S := copy(S, 2, length(S)-2) else begin writeln (' Error! '); ReadKey; halt; end; end end; function TTree.GetOperPos(S : string) : word; var i, sk, L : word; begin sk := 0; L := length(S); for i := 1 to L do begin if S[i] = '(' then inc(sk); if S[i] = ')' then dec(sk); if (sk = 0) and IsOper(S[i]) then begin GetOperPos := i; exit end; end; GetOperPos := 0 end; procedure TTree.SetTree(S : String); var L, R : String; P, D : word; begin KillSk(S); D := length(S); P := GetOperPos(S); if P = 0 then CreateTree(S[1]) else begin CreateTree(S[P]); L := copy(S, 1, P-1); KillSk(L); R := copy(S, P+1, D-P); KillSk(R); zv^.left^.SetTree(L); zv^.right^.SetTree(R) end end; function TTree.GetLevel : word; begin if barrier then GetLevel := 0 else GetLevel := Max(zv^.left^.GetLevel + 1, zv^.right^.GetLevel + 1) end; function TTree.GetValue : real; begin case zv^.data of '+' : GetValue := zv^.left^.GetValue + zv^.right^.GetValue; '-' : GetValue := zv^.left^.GetValue - zv^.right^.GetValue; '*' : GetValue := zv^.left^.GetValue * zv^.right^.GetValue; '/' : GetValue := zv^.left^.GetValue / zv^.right^.GetValue; '0'..'9' : GetValue := ord(zv^.data) - 48 end end; procedure AssignFile; begin assign(F, TextFile); {$I-} reset(F); {$I+} if IOResult <> 0 then begin writeln('Error: ', TextFile, ' Not Found '); readkey; halt end end; begin ClrScr; AssignFile; New(Tree, Create); ReadFile(Str); writeln(' Formula: ',str); Tree^.SetTree(Str); writeln(' Input Formula: '); if Tree^.barrier then writeLn(' Tree Is Empty ') else PrintTree(Tree, 0); level := Tree^.GetLevel-2; if level >= 0 then writeLn(' Level: ',level) else writeLn(' Error: level not found'); writeLn(' Value: ',Tree^.GetValue:2:2); dispose(Tree, Done); ReadKey; end.