Witam
Mam taki problem. Mam program który ma tłumaczyć wyrażenie w postaci ONP do postaci wyrażenia algebraicznego. I otóż program mam napisany wszystko cacy tylko jest jeden mały problem. Otóż zamiast przekształconego wyrażenia [23+3*] pojawia mi się tylko (*) i za diabła nie wiem czym to jest spowodowane :( Byłby ktoś tak miły i pomogł mi znaleŹĆ blad w progamie i go usunac?? Bede bardzo wdzieczny. Prosze bardzo. Kod programu zamieszczam niżej
PROGRAM ONPP;
USES Crt;
const MAX=100;
TYPE
maxstring=string[max];
pwezel=^wezel;
wezel=record
nast:pwezel;
znak:maxstring;
END;
function push(wierzcholek:pwezel;co_dod:maxstring):pwezel;
var nowy:pwezel;
begin
getmem(nowy,sizeof(wezel)); {new(nowy);}
nowy^.nast:=wierzcholek;
nowy^.znak:=co_dod;
push:=nowy
end;
function pop(wierzcholek:pwezel;co_zdj:maxstring):pwezel;
var
temp:pwezel;
begin
temp:=wierzcholek^.nast;
co_zdj:=wierzcholek^.znak;
freemem(wierzcholek,sizeof(wezel)); {dispose(wierzcholek);}
pop:=temp
end;
procedure przerwij;
begin
writeln('Wprowadzono zle dane...');
halt(1)
end;
procedure info;
begin
writeln(^m^j^j'Program zamienia wyrazenia z Odwrotnej Notacji Polskiej na zwykla.');
writeln('W pliku zrodlowym napisano wyrazenie w onp dla pojedynczych znakow.');
writeln('Dozwolone operatory: +, - , *, /');
writeln('Zapis w zwyklej notacji z nawiasami:')
end;
var
i,ile_arg,ile_oprt:integer;
onp,tmp1,tmp2,out,out1:maxstring;
wierzcholek:pwezel;
plik:file;
begin
ile_arg:=0;
ile_oprt:=0;
assign(plik,'p.txt');
reset(plik,1);
onp[0]:=^@;
out[0]:=^@;
out1[0]:=^@;
tmp1[0]:=^@;
tmp2[0]:=^@;
i:=1;
while(not eof(plik))do
begin
byte(onp[0]):=i;
blockread(plik,onp[i],1);
if((onp[i]='(')or(onp[i]=')'))then przerwij;
inc(i)
end;
close(plik);
wierzcholek:=nil; {brakowało tego}
for i:=1 to byte(onp[0])do {byte(onp[0])=length(onp) - dla t. pascala i dla shortstringów w delphi}
begin
if((onp[i]='+')or(onp[i]='-')or(onp[i]='*')or(onp[i]='/'))
then
begin
if(ile_arg<2)
then przerwij
else
begin
wierzcholek:=pop(wierzcholek,tmp1);
wierzcholek:=pop(wierzcholek,tmp2);
wierzcholek:=push(wierzcholek,'('+tmp2+onp[i]+tmp1+')');
inc(ile_oprt)
end
end
else
begin
out1:=onp[i];
wierzcholek:=push(wierzcholek,out1);
inc(ile_arg)
end
end;
if(ile_arg<>(ile_oprt+1))then przerwij;
info;
writeln(wierzcholek^.znak);
end.