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: real;
- Dalsi: PZaznam;
- end;
- var
- zacatek, konec: PZaznam;
- Memory, ANS: real; {ANS = vysledek posledniho vypoctu, Memory = pamet}
- OFF: boolean;
- pocitat: boolean;
- function faktorial(n: real):real;
- procedure prevedDoPostfixu(var zacatek, konec: PZaznam; var pocitat: boolean); {predpoklad na konzoli je vypsany infix zapis vyrazu}
- type
- PZaznamZas = ^TZaznamZas;
- TZaznamZas = record
- Znak: char;
- Hodnota: real;
- PrednostOperace: integer;
- Dalsi: PZaznamZas;
- end;
- var
- z, u, v, w, k: char;
- prednostOperaceZ, i: integer;
- Hodnota, Hodnota1, Hodnota2: real;
- bylaDesetinnaCarka, cetlCislo: boolean;
- zacatekZas, pomocnaZas: PZaznamZas;
- pomocna: PZaznam;
- begin
- z := '#';
- zacatekZas := nil;
- cetlCislo := false;
- new(zacatek); zacatek^.Dalsi := nil; konec := zacatek;
- repeat
- bylaDesetinnaCarka := false;
- Hodnota1 := 0; Hodnota2 := 0; Hodnota := 0; i := 1;
- prednostOperaceZ := 0;
- if (cetlCislo = false) then begin k := w; w := v; v := u; u := z; read(z); end;
- while (z = ' ') do begin read(z); end;
- cetlCislo := false;
- case z of
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
- begin
- while (z = ',') or (z = '.') or (z in ['0'..'9']) do {resi viceciferna cisla}
- begin
- if (z = ',') or (z = '.') then bylaDesetinnaCarka := true;
- if (z in ['0'..'9']) and (byladesetinnaCarka = false) then {vypocet cele casti cisla}
- begin
- Hodnota1 := Hodnota1 * 10 + (ord(z)-48);
- end
- else if (z in ['0'..'9']) and (byladesetinnaCarka = true) then {vypocet desetinne casti}
- begin
- Hodnota2 := Hodnota2 + (ord(z)-48)/(power(10,i));
- i := i + 1;
- end;
- k := w; w := v; v := u; u := z; {cteni}
- read(z);
- end;
- Hodnota := Hodnota1 + Hodnota2;
- new(pomocna); pomocna^.Hodnota := Hodnota; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- cetlCislo := true;
- end;
- '(': {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
- begin
- if (k = 'c') then
- begin {arkus sinus = K}
- new(pomocnaZas); pomocnaZas^.Znak := 'K'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else begin {sinus reprezentuji jako S}
- new(pomocnaZas); pomocnaZas^.Znak := 'S'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end
- else if (w = 't') and (v = 'a') then {tangens (tan) = T}
- begin
- if (k = 'c') then
- begin {arkus tangens = N}
- new(pomocnaZas); pomocnaZas^.Znak := 'N'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else begin {tangens reprezentuji jako T}
- new(pomocnaZas); pomocnaZas^.Znak := 'T'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- 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 = C}
- begin
- if (k = 'c') then
- begin {arkus kosinus = I}
- new(pomocnaZas); pomocnaZas^.Znak := 'I'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else begin {cosinus = C}
- new(pomocnaZas); pomocnaZas^.Znak := 'C'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- 'g':
- begin
- if (v = 't') then
- begin {arkus tangens = N}
- if (w = 'c') then
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'N'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- else begin {tangens = T}
- new(pomocnaZas); pomocnaZas^.Znak := 'T'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- end
- else if (w = 'l') and (v = 'o') then {log10 = L}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'L'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end
- end;
- 'd':
- begin
- if (w = 'r') and (v = 'a') then {rad = konverze ze stupnu na radiany}
- begin
- new(pomocnaZas); pomocnaZas^.Znak := 'R'; pomocnaZas^.PrednostOperace := -10;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- end;
- end;
- '_':
- begin
- if (w = 'l') and (v = 'o') and (u = 'g') then {log_a = U}
- begin
- read(z);
- i := 1;
- while (z = ',') or (z = '.') or (z in ['0'..'9']) do {resi viceciferna cisla}
- begin
- if (z = ',') or (z = '.') then bylaDesetinnaCarka := true;
- if (z in ['0'..'9']) and (byladesetinnaCarka = false) then {vypocet cele casti cisla}
- begin
- Hodnota1 := Hodnota1 * 10 + (ord(z)-48);
- end
- else if (z in ['0'..'9']) and (byladesetinnaCarka = true) then {vypocet desetinne casti}
- begin
- Hodnota2 := Hodnota2 + (ord(z)-48)/(power(10,i));
- i := i + 1;
- end;
- k := w; w := v; v := u; u := z; {cteni}
- read(z);
- end;
- Hodnota := Hodnota1 + Hodnota2;
- if (z = '(') then
- begin
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := 0;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- new(pomocnaZas); pomocnaZas^.Znak := 'U'; pomocnaZas^.PrednostOperace := -10; pomocnaZas^.Hodnota := Hodnota;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end
- end;
- 'F', 'f': {off - okamzite vypne program}
- begin
- if ((v = 'O') or (v = 'o')) and ((u = 'F') or (u = 'f')) then begin OFF := true; exit; end;
- end;
- 'i', 'I': {Pi}
- begin
- if (u = 'p') or (u = 'P') then
- begin
- new(pomocna); pomocna^.Hodnota := Pi; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end;
- end; {ANS funkce}
- 'S', 's':
- begin
- if ((v = 'A') or (v = 'a')) and ((u = 'n') or (u = 'N')) then
- begin
- new(pomocna); pomocna^.Hodnota := ANS; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end;
- if (u = 'M') and (z = 'S') then
- begin
- Memory := ANS; pocitat := false;
- end;
- end;
- 'e': {eulerovo cislo}
- begin
- if (u <> 'd') then
- begin
- new(pomocna); pomocna^.Hodnota := 2.7182818284590452353; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end
- end;
- 'C': {MC = memory clean = vycisti pamet}
- begin
- if (u = 'M') then
- begin
- Memory := 0; pocitat := false;
- end;
- end;
- 'R': {MR = memory return = pouzije pamet, vypise ji}
- begin
- if (u = 'M') then
- begin
- new(pomocna); pomocna^.Hodnota := Memory; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end;
- end;
- '!':
- begin
- if (u in ['0'..'9']) or (((v = 'P') or (v = 'p')) and ((u = 'i') or (u = 'I'))) or (u = 'e') then
- begin
- new(pomocna); pomocna^.Znak := '!'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end
- else if (u = ')') then
- begin
- new(pomocna); pomocna^.Znak := '!'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end;
- end;
- '+', '-':
- begin
- prednostOperaceZ := 1;
- if (u = '(') or (ord(u)=10) or (ord(u)=13) or (u = '#') then {na ruznych systemech se chova ruzne, vykryt vsechny moznosti}
- begin
- new(pomocna); pomocna^.Hodnota := 0; pomocna^.Znak := '?'; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- end;
- if (v = '+') and (u = '/') and (z = '-') then {funkce zmeny znamenka na vysledek}
- begin
- if (ANS = 0) then writeln(0)
- else begin
- ANS := -ANS;
- i := 0;
- Hodnota1 := ANS;
- while (not(((Round(Hodnota1) - power(10,i-14)) <= Hodnota1) and (Hodnota1 <= (Round(Hodnota1) + power(10,i-14)))))
- and (i <= 15) do {na zjistovani poctu desetinnych mist}
- begin
- Hodnota1 := Hodnota1 * 10;
- i := i + 1;
- end;
- writeln(ANS:0:i);
- end;
- pocitat := false;
- end
- else if (u <> 'M') then
- begin
- 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
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- 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 <> '(') and (zacatekZas^.Znak <> 'S')
- and (zacatekZas^.Znak <> 'C') and (zacatekZas^.Znak <> 'T') and (zacatekZas^.Znak <> 'L')
- and (zacatekZas^.Znak <> 'E') and (zacatekZas^.Znak <> 'U') and (zacatekZas^.Znak <> 'R')
- and (zacatekZas^.Znak <> 'K') and (zacatekZas^.Znak <> 'I') and (zacatekZas^.Znak <> 'N')do
- begin
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end
- else begin
- if (z = '+') then {pricteni ANS do pameti}
- begin
- Memory := Memory + ANS; pocitat := false;
- end
- else begin
- Memory := Memory - ANS; pocitat := false;
- end;
- 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
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- pomocnaZas := zacatekZas;
- zacatekZas^.Znak := z;
- end
- else begin
- while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') and (zacatekZas^.Znak <> 'S')
- and (zacatekZas^.Znak <> 'C') and (zacatekZas^.Znak <> 'T') and (zacatekZas^.Znak <> 'L')
- and (zacatekZas^.Znak <> 'E') and (zacatekZas^.Znak <> 'U') and (zacatekZas^.Znak <> 'R')
- and (zacatekZas^.Znak <> 'K') and (zacatekZas^.Znak <> 'I') and (zacatekZas^.Znak <> 'N') do
- begin
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- 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
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- pomocnaZas := zacatekZas;
- zacatekZas^.Znak := z;
- end
- else begin
- while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') and (zacatekZas^.Znak <> 'S')
- and (zacatekZas^.Znak <> 'C') and (zacatekZas^.Znak <> 'T') and (zacatekZas^.Znak <> 'L')
- and (zacatekZas^.Znak <> 'E') and (zacatekZas^.Znak <> 'U') and (zacatekZas^.Znak <> 'R')
- and (zacatekZas^.Znak <> 'K') and (zacatekZas^.Znak <> 'I') and (zacatekZas^.Znak <> 'N')do
- begin
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- konec^.Dalsi := pomocna; konec := pomocna;
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
- pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
- end;
- end;
- ')': {vycisti se zasobnik po pristi zavorku}
- begin
- while (true) do
- begin
- if (zacatekZas^.Znak = '(') then
- begin
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- break;
- end;
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil;
- if (pomocna^.Znak = 'U') then pomocna^.Hodnota := zacatekZas^.Hodnota;
- konec^.Dalsi := pomocna; konec := pomocna;
- zacatekZas := zacatekZas^.Dalsi;
- end;
- end;
- end;
- until z = '=';
- while (zacatekZas <> nil) do {pokud cely vyraz nebyl ohranicen zavorkami, posledni zbyvajici operator se nevypise, vypisu ho manualne}
- begin
- new(pomocna); pomocna^.Znak := zacatekZas^.Znak; pomocna^.Dalsi := nil; {~cisteni zasobniku}
- konec^.Dalsi := pomocna; konec := pomocna;
- pomocnaZas := zacatekZas;
- zacatekZas := zacatekZas^.Dalsi;
- dispose(pomocnaZas);
- end;
- pomocna := zacatek; zacatek := zacatek^.Dalsi; dispose(pomocna); {protoze jsme na zacatku vytvorili jeden prvek
- seznamu navic (aby slo algoritmem vytvaret dalsi), na konci ho smazeme}
- end;
- procedure vypisPostfix(zacatek: PZaznam);
- var
- pomocna: PZaznam;
- begin
- pomocna := zacatek;
- while (pomocna <> nil) do
- begin
- if (pomocna^.Znak = '?') then write(pomocna^.Hodnota:0:2, ' ')
- else write(pomocna^.Znak, ' ');
- pomocna := pomocna^.Dalsi;
- end;
- end;
- procedure spocitejPostfix(var zacatek: PZaznam; pocitat: boolean);
- var
- p1, p2, p3, p4, pomocna: PZaznam;
- podminka: boolean;
- i: integer;
- testovaciHodnota: real;
- begin
- if (pocitat = true) then
- begin
- p1 := zacatek; p2 := zacatek; p3 := zacatek;
- podminka := true;
- while (p1 <> nil) and (podminka = true) do
- begin
- if (p1^.Znak = '?') then p1 := p1^.Dalsi {p1 otaznik = je tam hodnota, pokud ne, je tam operator nebo funkce}
- else begin
- case p1^.Znak of
- '+', '-', '*', '/', '^':
- begin
- p3 := zacatek;
- while (p3^.Dalsi^.Dalsi <> nil) and (p3^.Dalsi^.Dalsi <> p1) do p3 := p3^.Dalsi;
- p2 := p3^.Dalsi;
- p4 := p1^.Dalsi;
- case p1^.Znak of
- '+':
- begin
- p3^.Hodnota := p3^.Hodnota + p2^.Hodnota;
- p3^.Dalsi := p4;
- dispose(p2); dispose(p1);
- p1 := zacatek;
- end;
- '-':
- begin
- p3^.Hodnota := p3^.Hodnota - p2^.Hodnota;
- p3^.Dalsi := p4;
- dispose(p2); dispose(p1);
- p1 := zacatek;
- end;
- '*':
- begin
- p3^.Hodnota := p3^.Hodnota * p2^.Hodnota;
- p3^.Dalsi := p4;
- dispose(p2); dispose(p1);
- p1 := zacatek;
- end;
- '/':
- begin
- if (p2^.Hodnota = 0) then podminka := false
- else begin
- p3^.Hodnota := p3^.Hodnota / p2^.Hodnota;
- p3^.Dalsi := p4;
- dispose(p2); dispose(p1);
- p1 := zacatek;
- end;
- end;
- '^':
- begin
- p3^.Hodnota := power(p3^.Hodnota, p2^.Hodnota);
- p3^.Dalsi := p4;
- dispose(p2); dispose(p1);
- p1 := zacatek;
- end
- else break;
- end;
- end;
- 'S', 'C', 'T', 'L', 'E', 'U', 'R', '!', 'K', 'I', 'N':
- begin
- p2 := zacatek;
- while (p2 <> nil) and (p2^.Dalsi <> p1) do p2 := p2^.Dalsi;
- p4 := p1^.Dalsi;
- case p1^.Znak of
- 'S': {sinus}
- begin
- p2^.Hodnota := sin(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- 'K': {arkus sinus}
- begin
- if (p2^.Hodnota > 1) or (p2^.Hodnota < -1) then podminka := false
- else begin
- p2^.Hodnota := arcsin(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'C': {kosinus}
- begin
- p2^.Hodnota := cos(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- 'I': {arkus kosinus}
- begin
- if (p2^.Hodnota > 1) or (p2^.Hodnota < -1) then podminka := false
- else begin
- p2^.Hodnota := arccos(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'T': {tangens}
- begin
- if (tan(p2^.Hodnota) > power(10,15)) or (tan(p2^.Hodnota) < -power(10,15)) then podminka := false {vylepsit}
- else begin
- p2^.Hodnota := tan(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'N': {arkus tangens}
- begin
- p2^.Hodnota := arctan(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- 'E': {ln}
- begin
- if (p2^.Hodnota <= 0) then podminka := false
- else begin
- p2^.Hodnota := Logn(2.7182818284590452353, p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'L': {log_10}
- begin
- if (p2^.Hodnota <= 0) then podminka := false
- else begin
- p2^.Hodnota := Logn(10, p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'U': {log_a}
- begin
- if (p2^.Hodnota <= 0) then podminka := false
- else begin
- p2^.Hodnota := Logn(p1^.Hodnota, p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end;
- 'R': {stupne na radiany, alternativa pro °}
- begin
- p2^.Hodnota := (Pi/180)*(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- '!':
- begin
- if (Round(p2^.Hodnota) <> (p2^.Hodnota)) or (p2^.Hodnota < 0) then podminka := false
- else begin
- p2^.Hodnota := faktorial(p2^.Hodnota);
- p2^.Dalsi := p4;
- dispose(p1);
- p1 := zacatek;
- end;
- end
- else break;
- end;
- end;
- end;
- end;
- end;
- if (zacatek <> nil) and (podminka = true) then
- begin
- if (-(power(10, -14)) <= zacatek^.Hodnota) and (zacatek^.Hodnota <= (power(10,-14))) then begin ANS := 0; writeln(0); end {resi kladnou a zapornou nulu}
- else begin
- i := 0;
- testovaciHodnota := zacatek^.Hodnota;
- while (not(((Round(testovaciHodnota) - power(10,i-14)) <= testovaciHodnota) and (testovaciHodnota <= (Round(testovaciHodnota) + power(10,i-14)))))
- and (i <= 15) do {na zjistovani poctu desetinnych mist}
- begin
- testovaciHodnota := testovaciHodnota * 10;
- i := i + 1;
- end;
- ANS := zacatek^.Hodnota;
- writeln(ANS:0:i);
- end;
- end
- else writeln('Nema reseni v R');
- end;
- while zacatek <> nil do
- begin
- pomocna := zacatek;
- zacatek := zacatek^.Dalsi;
- dispose(pomocna);
- end;
- end;
- begin
- Memory := 0; ANS := 0; OFF := false;
- Writeln('Kalkulacka');
- Writeln('Konstanty: pi, e');
- Writeln('Operatory: +, -, *, /, ^');
- Writeln('Matematicke funkce: sin(x), cos(x), tan(x), arcsin(x), arcccos(x), arctan(x), a^x, log(x), ln(x), log_a(x), n!');
- Writeln('Ostatni funkce: M+, M-, MR, MC, MS, +/-, off');
- Writeln('Pozn: Funkce ve vychozim nastaveni prijimaji hodnoty v radianech, funkce na konverzi stupen -> radian = rad(x)');
- while (true) do
- begin
- pocitat := true;
- prevedDoPostfixu(zacatek, konec, pocitat);
- if (OFF = true) then break;
- {vypisPostfix(zacatek); writeln; }
- spocitejPostfix(zacatek, pocitat);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement