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

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

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:7
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,
- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:7
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/23=' 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.
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.