program pochodne;
type drzewo = ^wezel;
wezel = record
w,o : integer; // wartosc lub ekiwwalent operatora/ wlacznik trybu 'operatorowego'
lsyn, psyn : drzewo;
end;
type lista = ^elementlisty;
elementlisty=record
w: integer;
nast: lista;
end;
var
s : String;
blad : Integer;
pre, koncowe : Drzewo;
procedure insert(var d:Drzewo); //wczyt do drzewa
begin
new(d);
readln(s);
d^.o := 1;
if s = 'x' then d^.w := 0 else
if s = '+' then d^.w := 1 else
if s = '-' then d^.w := 2 else
if s = '*' then d^.w := 3 else
if s = '/' then d^.w := 4 else
if s = 'exp' then d^.w := 5 else
if s = 'ln' then d^.w := 6 else
if s = 'sin' then d^.w := 7 else
if s = 'cos' then d^.w := 8
else begin
d^.o := 0;
val(s, d^.w, blad);
end;
if (d^.o = 1) and (d^.w <> 0) then begin
insert(d^.lsyn);
if (d^.w>=1) and (d^.w<=4) then insert(d^.psyn) else d^.psyn := nil;
end else begin
d^.lsyn := nil;
d^.psyn := nil;
end;
end;
procedure licz(var co, gdzie : Drzewo);
var
pom : Drzewo;
begin
new(gdzie);
gdzie^.psyn := nil;
gdzie^.lsyn := nil;
if co^.o = 1 then begin
gdzie^.o := 1;
case co^.w of
0 : begin // x
gdzie^.o := 0;
gdzie^.w := 1;
end; //+
1 : begin
gdzie^.w := 1;
licz(co^.lsyn, gdzie^.lsyn);
licz(co^.psyn, gdzie^.psyn);
end;
2 : begin //-
gdzie^.w := 2;
licz(co^.lsyn, gdzie^.lsyn);
licz(co^.psyn, gdzie^.psyn);
end;
3 : begin //*
gdzie^.w := 1;
new(gdzie^.lsyn);
gdzie^.lsyn^.o := 1;
gdzie^.lsyn^.w := 3;
gdzie^.lsyn^.psyn := co^.psyn;
new(gdzie^.psyn);
gdzie^.psyn^.o := 1;
gdzie^.psyn^.w := 3;
gdzie^.psyn^.lsyn := co^.lsyn;
licz(co^.lsyn, gdzie^.lsyn^.lsyn);
licz(co^.psyn, gdzie^.psyn^.psyn);
end;
4 : begin // /
gdzie^.w := 4;
new(gdzie^.psyn);
gdzie^.psyn^.o := 1;
gdzie^.psyn^.w := 3;
gdzie^.psyn^.lsyn := co^.psyn;
gdzie^.psyn^.psyn := co^.psyn;
new(gdzie^.lsyn);
pom := gdzie^.lsyn;
pom^.o := 1;
pom^.w := 2;
new(pom^.lsyn);
pom^.lsyn^.o := 1;
pom^.lsyn^.w := 3;
pom^.lsyn^.psyn := co^.psyn;
new(pom^.psyn);
pom^.psyn^.o := 1;
pom^.psyn^.w := 3;
pom^.psyn^.lsyn := co^.lsyn;
licz(co^.lsyn, pom^.lsyn^.lsyn);
licz(co^.psyn, pom^.psyn^.psyn);
end;
5 : begin // exp
gdzie^.w := 3;
gdzie^.lsyn := co;
licz(co^.lsyn, gdzie^.psyn);
end;
6 : begin // ln
gdzie^.w := 3;
new(gdzie^.lsyn);
pom := gdzie^.lsyn;
pom^.o := 1;
pom^.w := 4;
new(pom^.lsyn);
pom^.lsyn^.o := 1;
pom^.lsyn^.w := 1;
pom^.lsyn^.lsyn := nil;
pom^.lsyn^.psyn := nil;
pom^.psyn := co^.lsyn;
licz(co^.lsyn, gdzie^.psyn);
end;
7 : begin // sin
gdzie^.w := 3;
new(gdzie^.lsyn);
gdzie^.lsyn^.o := 1;
gdzie^.lsyn^.w := 8;
gdzie^.lsyn^.lsyn := co^.lsyn;
gdzie^.lsyn^.psyn := nil;
licz(co^.lsyn, gdzie^.psyn);
end;
8 : begin // cos
gdzie^.w := 3;
new(gdzie^.lsyn);
gdzie^.lsyn^.o := 1;
gdzie^.lsyn^.w := 2;
new(gdzie^.lsyn^.lsyn);
gdzie^.lsyn^.lsyn^.o := 0;
gdzie^.lsyn^.lsyn^.w := 0;
gdzie^.lsyn^.lsyn^.lsyn := nil;
gdzie^.lsyn^.lsyn^.psyn := nil;
new(gdzie^.lsyn^.psyn);
gdzie^.lsyn^.psyn^.o := 1;
gdzie^.lsyn^.psyn^.w := 7;
gdzie^.lsyn^.psyn^.lsyn := co^.lsyn;
gdzie^.lsyn^.psyn^.psyn := nil;
licz(co^.lsyn, gdzie^.psyn);
end;
end;
end else begin
gdzie^.o := 0;
gdzie^.w := 0;
end;
end;
procedure wypiszd(d:drzewo);
var
wypisz : string;
begin
if d<>nil then begin
if d^.o = 1 then begin
case d^.w of
0 : wypisz := 'x';
1 : wypisz := '+';
2 : wypisz := '-';
3 : wypisz := '*';
4 : wypisz := '/';
5 : wypisz := 'exp';
6 : wypisz := 'ln';
7 : wypisz := 'sin';
8 : wypisz := 'cos';
end;
writeln(wypisz);
end else writeln(d^.w);
readln();
wypiszd(d^.lsyn);
wypiszd(d^.psyn);
end;
end;
begin
insert(pre);
licz(pre, koncowe);
wypiszd(koncowe);
end.
Jeszcze przerobić to na unit(czego jeszcze nie robiłem, jak na razie) i program.
Nie, tylko nie fizyka
, uciekam(już w liceum uczyłem się jej tuż przed klasówkami przy kawie do 3 nad ranem i na parę dni stawałem się mistrzem fal, 'freestajlowych' teorii/przekształceń i bóg wie czego... na 3 starczało:P) ! To nie dla mnie. Gratuluje bo zapewne mega ciężki kierunek.
Done. Podział na moduły na szczęście jest łopatologiczny. O 9 basen
.