Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program zapoctovyProgram;
- Uses Math;
- type
- PZaznam = ^TZaznam;
- TZaznam = record
- Znak: char;
- Hodnota: integer;
- Dalsi: PZaznam;
- end;
- var
- zacatek: PZaznam;
- procedure prevedDoPostfixu(var zacatek: PZaznam); {predpoklad na konzoli je vypsany infix zapis vyrazu}
- type
- PZaznamZas = ^TZaznamZas;
- TZaznamZas = record
- Znak: char;
- PrednostOperace: integer;
- Dalsi: PZaznamZas;
- end;
- var
- z, u, v, w: char;
- prednostOperaceZ, i: integer;
- Hodnota, Hodnota1, Hodnota2: real;
- zacatekZas, pomocnaZas: PZaznamZas;
- pomocna: PZaznam;
- podminka, bylaDesetinnaCarka: boolean;
- begin
- zacatekZas := nil;
- repeat
- podminka := false; bylaDesetinnaCarka := false;
- Hodnota := 0; Hodnota2 := 0; i := 1;
- prednostOperaceZ := 0;
- repeat {resi viceciferna cisla}
- seekeoln; {preskoci mezery}
- w := v; v := u; u := z;
- read(z);
- if (z = ',') or (z = '.') then
- begin
- byladesetinnaCarka := true;
- end;
- if (z in ['0'..'9']) and (byladesetinnaCarka = false) then
- begin
- Hodnota1 := Hodnota1 * 10 + (ord(z)-48);
- podminka := true;
- end
- else if (z in ['0'..'9']) and (byladesetinnaCarka = true) then
- begin
- Hodnota2 := Hodnota2 + (ord(z)-48)/(power(10,i));
- podminka := true;
- i := i + 1;
- end
- until (not (z = ',')) and (not (z = '.')) and (not (z in ['0'..'9']));
- if (podminka = true) then
- begin
- Hodnota := Hodnota1 + Hodnota2;
- write(Hodnota, ' ');
- end;
- case z of
- '(': {do zasobniku}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := 0;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- case u of
- 'n':
- begin
- if (w = 's') and (v = 'i') then {sinus reprezentuji jako A}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'A'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (w = 't') and (v = 'a') then {tangens (tan) = C}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'C'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (v = 'l') then {ln = E}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'E'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- 's': {cosinus = B}
- begin
- if (w = 'c') and (v = 'o') then
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'B'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- 'g':
- begin
- if (w <> 'o') and (v = 't') then {tangens (tg) = C}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'C'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (w = 'l') and (v = 'o') then {log_10 = D}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'D'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- end;
- end;
- '+', '-':
- begin
- prednostOperaceZ := 1;
- if (u = '(') then write(0, ' ');
- if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then {novy operator ma vetsi hodnotu -> pridam ho do zasobniku}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then {novy operator ma stejnou hodnotu -> vypisu ten ze zasobniku a novy pridam do zasobniku}
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas^.Znak := z;
- end
- else begin {vypis co je v zasobniku po kulatou zavorku, pridej tam z}
- while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- '*', '/':
- begin
- prednostOperaceZ := 2;
- if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then
- begin
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas^.Znak := z;
- end
- else begin
- while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- '^':
- begin
- prednostOperaceZ := 3;
- if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then
- begin
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas^.Znak := z;
- end
- else begin
- while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- ')':
- begin
- while (true) do
- begin
- if (zacatekZas^.Znak = '(') then
- begin
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- break;
- end;
- write(zacatekZas^.Znak, ' ');
- zacatekZas := zacatekZas^.Dalsi;
- end;
- end;
- end;
- until seekeoln;
- while (zacatekZas <> nil) do {pokud cely vyraz nebyl ohranicen zavorkami, posledni zbyvajici operator se nevypise, vypisu ho manualne}
- begin
- write(zacatekZas^.Znak, ' ');
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end
- end;
- begin
- prevedDoPostfixu(zacatek);
- readln;
- readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement