|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль) |
|
Разное - Помогите найти ошибку(косяк) в программе с бинарным деревом.(Паскаль)
|
Новый участник Сообщения: 1 |
Профиль | Отправить 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 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
помогите найти ошибку | 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 |
|