Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль)

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

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Задание

Во входном файле задана инфиксная форма логического выражения , содержащая односимвольные имена (большие латинские буквы) логических операндов , символы операций (малые буквы 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.

Отправлено: 20:05, 20-12-2011

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
помогите найти ошибку igor7 Программирование в *nix 1 07-02-2011 09:55
Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе yulia_hoi Программирование и базы данных 6 08-01-2010 14:50
Помогите найти ошибку в скрипте Anarasius AutoIt 4 03-01-2010 21:38
C/C++ - Помогите найти ошибку KEKS-KEKS Программирование и базы данных 9 01-11-2007 20:30
Прошу помочь найти ошибку в программе. Sox Программирование в *nix 15 05-12-2005 08:47




 
Переход