Pascal konwersja notacji do ONP

Pascal konwersja notacji do ONP
M7
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:7
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

marcinmierzejewski1024
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:14
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: )

M7
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:7
0

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

Kopiuj
 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.

marcinmierzejewski1024
postaram sie jutro to napisać dla samego ćwiczenia w c++, ale nie obiecuje że mi się uda. Co masz na myśli "i właśnie muszę stworzyć jakiś algorytm, który według zasad zamiany na ONP przerobi mi to wyrażenie do innej postaci."? do jakiej innej postaci? Nie wiem czy ja mam tylko problem ze zrozumieniem co chcesz osiagnac, dla Ciebie jest to pewnie jasne ale jakbys mogł nieco jasniej co na wejsciu a co na wyjsciu - chociaż na tym etapie.
M7
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:7
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,

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
0
Kopiuj
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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M7
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:7
0

stworzyłem do tej pory coś takiego:

Kopiuj
 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:

Kopiuj
 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. 
edytowany 2x, ostatnio: Minio7

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.