ONP kalkulator pascal

0

Witam.
Mam do napisania kalkulator obsługujący proste wyrażenia +-*/ oraz nawiasy przy użyciu ONP.
Zaciąłem się w momencie zapełniania stosów znaków i argumentów.
Otóż chciałbym aby wyświetlona została zawartość tych stosów.
A wyświetlane są tylko ostatni argument i ostatni znak.
Proszę o pomoc.
Oto kod programu:

program calcONP;

var
wejscie : string;
wyjscie : ansistring;
stos : array[1..400] of char;

procedure analiza (var wejscie : string);
var
i : integer;

begin
for i :=1 to length(wejscie) do
begin
case wejscie[i] of
'+' : stos := wejscie[i];
'-' : stos := wejscie[i];
'*' : stos := wejscie[i];
'/' : stos := wejscie[i];
else
wyjscie := wejscie[i];
end;
end;

for i:=1 to length(wyjscie) do
writeln(wyjscie);
writeln;

for i:=1 to length(stos) do
writeln(stos);
writeln;
end;

begin
writeln('podaj ciag: ');
readln(wejscie);
analiza(wejscie);
readln;
end.

0

Wydawało mi się do tej pory, że odwrotna notacja polska służy do tego, żeby nie było nawiasów...

0

No i masz rację. Napisałem obsługująca nawiasy, tzn pozbywająca się ich. Choć to jeszcze nie zostało zaimpelemtowane przeze mnie w tym programie.

0

Ach, sory, nie zrozumiałem cię z początku. Błąd jest tu:

'+' : stos := wejscie[i];

Powinno być coś w rodzaju: stos[length(stos)+1]:=wejscie[i], chociaż nie wiem, czy nie będzie Ci potrzebny dodatkowy licznik długości stosu. A zamiast wyjscie:=wejscie[i] -> wyjscie:=wyjscie+wejscie[i].

0

Dzięki, przydało się.
Lecz pojawił się kolejny problem... W jaki sposób zaimplementować w moim programie priorytety operatorów? Tzn, aby była prawidłowa kolejność wykonywania działań? Bardzo proszę o pomoc.
Wiem, że w tym celu będzie trzeba zedytować "case", lecz nie mam pojęcia w jaki sposób. Mam także problem z procedurą obliczającą wyrażenie ONP. Jeżeli mógłby mi ktoś pomóc, byłbym bardzo wdzięczny.
Aktualny kod programu wygląda tak (jako komentarze, są rzeczy z którymi mam problem):

program calcONP;

var
wejscie : ansistring;
wyjscie : ansistring;
stos : array[1..400] of char;

procedure analiza (wejscie : string);
var
i : integer;

begin
for i :=1 to length(wejscie) do
begin
case wejscie[i] of
'+' : stos[length(stos)+1]:=wejscie[i];
{tu bedzie potrzebna instrukcja}
'-' : stos[length(stos)+1]:=wejscie[i];
{tu bedzie potrzebna instrukcja}
'*' : stos[length(stos)+1]:=wejscie[i];
{tu bedzie potrzebna instrukcja}
'/' : stos[length(stos)+1]:=wejscie[i];
{tu bedzie potrzebna instrukcja}
{A TU JESZCZE CO SIE DZIEJE GDY POJAWIAJĄ SIE NAWIASY}

           else
               wyjscie := wyjscie+wejscie[i];
     end;

end;

writeln(wyjscie);
writeln;

writeln(stos);
writeln;

end;

procedure obliczONP (wyjscie : ansistring);
var
i : integer;
begin
stos := 0;
for i:=1 to length(wyjscie) do
begin
case wyjscie[i] of
'liczba' : stos := stos + wyjscie[i];
else
{zdejmij ze stosu jeden element a}
{zdejmij ze stosu kolejny element b}
end;
stos := stos + (a char b);
wynik := stos;
writeln('wynik');
end;

begin
writeln('podaj ciag: ');
readln(wejscie);
analiza(wejscie);
obliczONP;
readln;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1