Obliczanie wyrażenia w postaci ONP

0

witam,
mam mały problem odnośnie programu który napisałem.
Dostałem pracę domową mającą za zadanie z pliku dzialanie.txt odczytywać działanie w postaci onp
np.

4
4
+
=

które w dalszej części programu ma je obliczać.

Zrobiłem coś takiego:

program zad_praca_domowa;

const MAX_S = 100;  // definiuje rozmiar stosu

var
  S : array[0..MAX_S-1] of double; // stos
  p : integer;                     // wskačnik stosu
  e : string;                      // element wyra_enia ONP
  v1,v2 : double;                  // argumenty operacji
  c : word; plik:text;                       // pozycja b_ŕdu przy konwersji
begin

assign(plik,'dzialanie.txt');
reset(plik);
readln(plik,e);
close(plik);
  
  p := 0;              // inicjujemy stos;

  repeat               // w pŕtli przetwarzamy wyra_enie ONP
readln(plik,e);         // odczytujemy element wyra_enia ONP

    if e = '=' then break;

    val(e,v1,c);       // dokonujemy konwersji

    if c = 0 then
    begin              // liczba
      S[p] := v1;      // umieszczamy j_ na stosie
      inc(p);          // zwiŕkszamy wskačnik stosu
    end
    else
    begin              // operator
      v1 := S[p-2];    // pobieramy ze stosu dwa argumenty
      v2 := S[p-1];
      case e[1] of        // wykonujemy operacje wg operatora
        '+' : v1 := v1 + v2;
        '-' : v1 := v1 - v2;
        '*' : v1 := v1 * v2;
        '/' : v1 := v1 / v2;
      end;
      S[p-2] := v1;    // wynik umieszczamy na stosie
      dec(p);          // ze stosu zniknŕ_a jedna liczba
    end;

  until false;

  writeln(S[p-1]:0:6); // wypisujemy wynik ze szczytu stosu
  readln;

end.

wszystko niby kompiluje się bez błędu, ale wcale nie działa.
Jak by ktoś mógł mi z tym pomóc/podpowiedzieć co jest źle.

Z góry dziękuje za każdą odpowiedz.

dodanie znacznika <code> dla zawartości pliku oraz znacznika `` - fp

1

Nie wiem, może źle patrze. Ale jak to może działać, skoro najpierw zamykasz plik, a później się do niego odwołujesz? :/

0

Nie rozumiem

 repeat               // w pŕtli przetwarzamy wyra_enie ONP
readln(plik,e);         // odczytujemy element wyra_enia ONP

a wcześniej:

assign(plik,'dzialanie.txt');
reset(plik);
readln(plik,e);
close(plik);

To jak chcesz czytać jak plik nie jest otwarty.

0

Zacznij od przedstawiania jakiegoś pliku dzialanie.txt

0

ok, poprawiłem tamten błąd, teraz to wygląda tak :

 program zad_praca_domowa;
 
const MAX_S = 100;  // definiuje rozmiar stosu
 
var
  S : array[0..MAX_S-1] of double; // stos
  p : integer;                     // wskačnik stosu
  e : string;                      // element wyra_enia ONP
  v1,v2 : double;                  // argumenty operacji
  c : word; plik:text;                       // pozycja b_ŕdu przy konwersji
begin
 
assign(plik,'dzialanie.txt');
reset(plik);
readln(plik,e);

 
  p := 0;              // inicjujemy stos;
 
  repeat               // w pŕtli przetwarzamy wyra_enie ONP
readln(plik,e);         // odczytujemy element wyra_enia ONP
 
    if e = '=' then break;
 
    val(e,v1,c);       // dokonujemy konwersji
 
    if c = 0 then
    begin              // liczba
      S[p] := v1;      // umieszczamy j_ na stosie
      inc(p);          // zwiŕkszamy wskačnik stosu
    end
    else
    begin              // operator
      v1 := S[p-2];    // pobieramy ze stosu dwa argumenty
      v2 := S[p-1];
      case e[1] of        // wykonujemy operacje wg operatora
        '+' : v1 := v1 + v2;
        '-' : v1 := v1 - v2;
        '*' : v1 := v1 * v2;
        '/' : v1 := v1 / v2;
      end;
      S[p-2] := v1;    // wynik umieszczamy na stosie
      dec(p);          // ze stosu zniknŕ_a jedna liczba
    end;
 
  until false;
 
  writeln(S[p-1]:0:6); // wypisujemy wynik ze szczytu stosu
  readln;
  close(plik);
 
end. 
 

wszystko teraz prawie wszystko działa tylko wyczytuje mi 2 element a nie liczy wyrażenia :(

0

plik dzialanie.txt wygląda tak

4
4
+
=
0

W takim razie coś chrzani waść: http://ideone.com/FWWrZL

1
readln(plik,e);

to jest niepotrzebne (chodzi o ten poza pętlą zaraz po reset)

0

dziękuje, wszystkim za pomoc już wszystko gra :)

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