Pascal konwersja notacji do ONP

0

Witam. Na wstępie zaznaczę że mam bardzo małe doświadczenie w programowaniu i zostałem postawiony przed problemem stworzenia programu obliczającego wartość całki oznaczonej. Mam juz element wczytujacy calke z pliku oraz granice całkowania, jednak nie potrafie sobie poradzić z konwersją funkcji do postaci onp tak by dało się ją wyliczyć. Mógłby mi ktoś podpowiedzieć w jaki sposób możnaby to najprościej zrobić? Myślałem nad rozbiciem całego wyrażenia na części i za pomocą pętli wrzucamie ich do tablicy oraz wywoływanie po natrafieniu na jakis operator działania, ale też nie bardzo wiem jak z tum ruszyć i nigdzie nie mogę znaleźć pomocy w związku z moim problemem. Liczę że znajdzie sie ktoś kto będzie mi w stanie to wyjaśnić. Pozdrawiam

0

https://www.dropbox.com/sh/intgcadk632v4ir/71bMZDMTE7/SDiZO-2012-3%20%282%29.pdf
od slajdu 11, mam nadzieje że Ci to jakoś pomoże: )

0

właśnie niezbyt bo chciałem to trochę inaczej zrobić.

 program project1;
  const max=20;
var
  t: array [1..max] of char;
  x, y, z: text;
  a, b, c:string;

begin
     begin
     Writeln('Zanim zaczniesz korzystac z programu calka upewnij sie ze w pliku "calka.txt" ');
     Writeln('jest wzor calki a  w plikach "calka2.txt oraz "calka3.txt" odpowiednio dolna ');
     Writeln('i gorna granica calkowania');
          ASSIGN(x, 'calka.txt');
          ASSIGN(y, 'calka2.txt'); {granica górna calkowania}
          ASSIGN(z, 'calka3.txt'); {granica dolna calkowania}

                    reset(x);
                    reset(y);
                    reset(z);
                    readln(x, a);
                    readln(y, b);
                    readln(z, c);
                    close(x);
                    close(y);
                    close(z);

     end;
                     write('zawartosc "calka.txt": ');         writeln(a);
                     write('zawartosc "calka2.txt": ');        writeln(b);
                     write('zawartosc "calka3.txt": ');        writeln(c);
                       t:=a ; {nadaje tabeli stringi z pliku "calka.txt"}

                       readln;

end.

w tym momencie mam ni mniej ni więcej tyle że wyrażenie a jest wczytane z pliku calka.txt i ma postać (xxx+5x)/8 lub coś w tym stylu. skoro t:=a i 't' to jest tablica to:
t[1]:=
t[2]:=

t[3]:=x
...
t[11]:=8

i właśnie muszę stworzyć jakiś algorytm, który według zasad zamiany na ONP przerobi mi to wyrażenie do innej postaci. Mam prośbę by ktoś mi podsunął pomysł jak można to w miarę łatwo osiągnąć, czy trzeba napisać jakąś procedurę, pętle, wykorzystać dodatkową tablicę jako stos, a jeżeli tak to w jaki sposób? Byłbym baaardzo wdzięczny za odp. bo mi póki co to idzie jak krew z nosa.

0

wybacz nie zauważyłem Twojej odp. Chciałbym trochę zmienić prośbę pomocy bo już jako tako zrozumiałem dlaczego ONP jest niezbędne do rozwiązania w dosyć prosty sposób tego problemu. Chciałbym teraz do mojego programu zaimplementować stos i wyjście i nie wiem jak to najprościej zrobić, mianowicie myślałem nad tablicami tylko z nimi mam taki problem że nie wiem jakiej komendy użyć aby dane wyrażenie (char) wylądowało na jej końcu, czy mógłby mi ktoś z tym pomóc? z góry dziękuje za zainteresowanie,

0
stos: array of COŚ;
L:Integer;
V:COŚ;

push:
L:=Length(stos);
SetLength(stos,L+1);
stos[L]:=V;

pop:
if Length(stos)>0 then
begin
  L:=Length(stos);
  V:=stos[L-1];
  SetLength(stos,L-1);
end;
0

stworzyłem do tej pory coś takiego:

 program calka;
        const
          max=20;
var
  v,y,z:text;
  i:integer;
  b,c:integer; // granice calkowania
  t: array [1..max] of char; // wejscie
  s: array [1..max] of char; // stos symboli
  w: array [1..max] of char; //wyjscie
  q: array [1..max] of char; // gotowe onp
  a:string; // nasza funkcja

  procedure onp(j,k:integer);
  begin
  for i:=1 to max do
      begin
      if t[i] in ['0','1','2','3','4','5','6','7','8','9','x'] then
               begin
               w[j]:=t[i];
               j:=j+1;
               end
        else if t[i] in ['+','-'] then
         begin
         if s[k-1] in ['+','-','/','*'] then
              begin
               w[j]:=s[k-1];
               s[k-1]:=t[i];
               j:=j+1;
               k:=k+1
               end
               else
               begin
               s[k]:=t[i];
               k:=k+1;
              end;
         end
      else if  t[i] in ['/','*'] then
               begin
                    if s[k-1] in ['/','*'] then
                     begin
                     w[j]:=s[k-1];
                     s[k-1]:=t[i];
                     j:=j+1;
                     k:=k+1
                     end
                    else
                        begin
                         s[k]:=t[i];
                          k:=k+1;
                           end;
                           end
    else if t[i] in['='] then
         begin
         for k:=1 to k do
             begin
              w[j]:=s[k];
              j:=j+1;
             end;
         end;

    end;


                   for j:=1 to length(a) do
                        begin
                        write(w[j]);
                        end;

                      end;

begin
begin
    Writeln('Zanim zaczniesz korzystac z programu calka upewnij sie ze w pliku "calka.txt" ');
    Writeln('jest wzor calki a  w plikach "calka2.txt oraz "calka3.txt" odpowiednio dolna ');
    Writeln('i gorna granica calkowania');
         ASSIGN(v, 'calka.txt');
         ASSIGN(y, 'calka2.txt'); {granica górna calkowania}
         ASSIGN(z, 'calka3.txt'); {granica dolna calkowania}

                   reset(v);
                   reset(y);
                   reset(z);
                   readln(v, a);
                   readln(y, b);
                   readln(z, c);
                   close(v);
                   close(y);
                   close(z);

    end;
                    write('zawartosc "calka.txt": ');         writeln(a);
                    write('zawartosc "calka2.txt": ');        writeln(b);
                    write('zawartosc "calka3.txt": ');        writeln(c);
                      t:=a ; {nadaje tabeli stringi z pliku "calka.txt"}
                      onp(1,1);
                       readln;
end.

i działa to tak że dla wyrażenia
'1/23+4=' zwraca mi
12/34
+ a powinno być bodajże 12/34+
jeżeli dam
'4+1/2
3=' to otrzymam
412/3+* zamiast 412/3*+

o ile się nie mylę i w związku z tym mam prośbę czy ktoś mógłby mi pomóc gdzie jest błąd bo sam jakoś nie potrafię do tego dojść..

EDIT: już wyczaiłem :) zacząłem schodzić ze stosu od dna a nie od wierzchu, Poniżej poprawiona wersja kodu jakby ktoś kiedyś potrzebował i się natknął na ten temat:

 program calka;
        const
          max=20;
var
  v,y,z:text;
  i:integer;
  b,c:integer; // granice calkowania
  t: array [1..max] of char; // wejscie
  s: array [1..max] of char; // stos symboli
  w: array [1..max] of char; //wyjscie
  q: array [1..max] of char; // gotowe onp
  a:string; // nasza funkcja

  procedure onp(j,k:integer);
  begin
  for i:=1 to max do
      begin
      if t[i] in ['0','1','2','3','4','5','6','7','8','9','x'] then
               begin
               w[j]:=t[i];
               j:=j+1;
               end
    else if t[i] in['='] then
          begin
            for  k:=k-1 downto 1 do
             begin
              w[j]:=s[k];
              j:=j+1;
             end;
          end
     else if t[i] in ['+','-'] then
         begin
         if s[k-1] in ['+','-','/','*'] then
              begin
               w[j]:=s[k-1];
               s[k-1]:=t[i];
               j:=j+1;
               end
               else
               begin
               s[k]:=t[i];
               k:=k+1;
              end;
         end
      else if  t[i] in ['/','*'] then
               begin
                    if s[k-1] in ['/','*'] then
                     begin
                     w[j]:=s[k-1];
                     s[k-1]:=t[i];
                     j:=j+1;
                     end
                    else
                        begin
                         s[k]:=t[i];
                          k:=k+1;
                           end;
                           end

    end;


                   for j:=1 to j do
                        begin
                        write(w[j]);
                      end;

                      end;

begin
begin
    Writeln('Zanim zaczniesz korzystac z programu calka upewnij sie ze w pliku "calka.txt" ');
    Writeln('jest wzor calki a  w plikach "calka2.txt oraz "calka3.txt" odpowiednio dolna ');
    Writeln('i gorna granica calkowania');
         ASSIGN(v, 'calka.txt');
         ASSIGN(y, 'calka2.txt'); {granica górna calkowania}
         ASSIGN(z, 'calka3.txt'); {granica dolna calkowania}

                   reset(v);
                   reset(y);
                   reset(z);
                   readln(v, a);
                   readln(y, b);
                   readln(z, c);
                   close(v);
                   close(y);
                   close(z);

    end;
                    write('zawartosc "calka.txt": ');         writeln(a);
                    write('zawartosc "calka2.txt": ');        writeln(b);
                    write('zawartosc "calka3.txt": ');        writeln(c);
                      t:=a ; {nadaje tabeli stringi z pliku "calka.txt"}
                      onp(1,1);
                       readln;
end. 

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