Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль) (http://forum.oszone.net/showthread.php?t=223402)

w1121 20-12-2011 20:05 1818964

Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль)
 
Задание

Во входном файле задана инфиксная форма логического выражения , содержащая односимвольные имена (большие латинские буквы) логических операндов , символы операций (малые буквы n-вместо not, a-вместо and и o- вместо or) и круглые скобки Разработать процедуры: 1.P1-проверки корректности записи инфиксной формы; 2.P2-преобразования инфиксной формы в префиксную. В случае ошибочности исходной инфиксной формы выдать сообщение об ошибке.
Обязательно необходимы деревья и рекурсия.

Нужно подкорректировать процедуру создания дерева(процедура p2), так как процедура работает только с выражениями, не превышающими 10 символов.

program p5;
type derevo=^st;
st=record
x:char;
l,r:derevo;
end;
var root,p:derevo; str:string; er:boolean;

procedure p0(var str:string);
begin
assign(input,'f1.txt');
reset(input);
readln(str);
close(input);
end;

procedure p1(var er:boolean; str:string);
var q,e,o,n,k,i:integer; c,c1:char;
begin
q:=0;
e:=0;
n:=0;
k:=0;
c1:=' ';
for i:=1 to length(str) do
begin
c:=str[i];
case c of
'(': q:=q+1;
')': q:=q-1;
'A'..'Z': e:=e+1;
'o': e:=e-1;
'a': e:=e-1;
end;
if ((c1='o') and (c='o')) or
((c1='o') and (c='a')) or
((c1='a') and (c='o')) or
((c1='a') and (c='a')) or
((c1='n') and (c='o')) or
((c1='n') and (c='a')) or
((c1='n') and (c='n')) then k:=1;
c1:=c;
end;
if ((q=0) and (e-1=0) and (k<>1)) then er:=true else er:=false;
end;


procedure p2(str:string; var root:derevo);
var prior,k:integer;
p:derevo;
c:char;
left,right:string;

procedure pr(var c:char; var prior:integer);
begin
case c of
'o': prior:=0;
'a': prior:=1;
'n': prior:=2;
end;
end;

procedure tree(str:string; var p:derevo; var k:integer);
var i,max,n,j:integer; g:derevo;
begin
g:=nil;
if (length(str)>0) then
if (length(str)=1) then
begin
new(p);
p^.x:=str[1];
p^.l:=nil;
p^.r:=nil;
end
else
begin
i:=1;
max:=100;
prior:=100;
j:=0;
n:=0;
while i<length(str) do
begin
pr(str[i],prior);
if str[i]='(' then j:=j+1;
while j<>0 do
begin
i:=i+1;
if str[i]='<' then j:=j+1;
if str[i]=')' then j:=j-1;
end;
if (((str[i]='a') or (str[i]='o') or (str[i]='n')) and (prior<max)) then
begin
max:=prior;
n:=i;
end;
if i<>length(str) then i:=i+1;
end;
new(p);
if k=0 then begin root:=p; k:=1; end;
p^.x:=str[n];
{write(p^.x);}
p^.l:=nil;
p^.r:=nil;
left:=copy(str,1,n-1);
right:=copy(str,n+1,length(str)-n);
if ((left[1]='(') and (left[length(left)]=')')) then left:=copy(left,2,length(left)-2);
if ((right[1]='(') and (right[length(right)]=')')) then right:=copy(right,2,length(right)-2);

tree(left,p^.l,k);

tree(right,p^.r,k)
end;
end;

begin
k:=0;
tree(str, p,k);
end;

procedure p3(var p:derevo);
begin
if p<>nil then
begin
write(p^.x);
p3(p^.l);
p3(p^.r);
end;
end;


begin
p0(str);
p1(er,str);
if er=true then
begin
p2(str,root);
p3(root);
end
else writeln('oshibka');
writeln;
end.


Время: 16:28.

Время: 16:28.
© OSzone.net 2001-