Advertisement
Guest User

Prace

a guest
Feb 7th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.45 KB | None | 0 0
  1. program zapoctovyProgram;
  2.  
  3. Uses Math;
  4.  
  5. type
  6.   PZaznam = ^TZaznam;
  7.   TZaznam = record
  8.     Znak: char;
  9.     Hodnota: integer;
  10.     Dalsi: PZaznam;
  11.   end;
  12.  
  13. var
  14.   zacatek: PZaznam;
  15.  
  16. procedure prevedDoPostfixu(var zacatek: PZaznam);  {predpoklad na konzoli je vypsany infix zapis vyrazu}
  17. type
  18.   PZaznamZas = ^TZaznamZas;
  19.   TZaznamZas = record
  20.     Znak: char;
  21.     PrednostOperace: integer;
  22.     Dalsi: PZaznamZas;
  23.   end;
  24. var
  25.   z, u, v, w: char;
  26.   prednostOperaceZ, i: integer;
  27.   Hodnota, Hodnota1, Hodnota2: real;
  28.   zacatekZas, pomocnaZas: PZaznamZas;
  29.   pomocna: PZaznam;
  30.   podminka, bylaDesetinnaCarka: boolean;
  31. begin
  32.   zacatekZas := nil;
  33.   repeat
  34.     podminka := false; bylaDesetinnaCarka := false;
  35.     Hodnota := 0; Hodnota2 := 0; i := 1;
  36.     prednostOperaceZ := 0;
  37.     repeat      {resi viceciferna cisla}
  38.       seekeoln; {preskoci mezery}
  39.       w := v; v := u; u := z;
  40.       read(z);
  41.       if (z = ',') or (z = '.') then
  42.       begin
  43.            byladesetinnaCarka := true;
  44.       end;
  45.       if (z in ['0'..'9']) and (byladesetinnaCarka = false) then
  46.       begin
  47.            Hodnota1 := Hodnota1 * 10 + (ord(z)-48);
  48.            podminka := true;
  49.       end
  50.       else if (z in ['0'..'9']) and (byladesetinnaCarka = true) then
  51.       begin
  52.            Hodnota2 := Hodnota2 + (ord(z)-48)/(power(10,i));
  53.            podminka := true;
  54.            i := i + 1;
  55.       end
  56.     until (not (z = ',')) and (not (z = '.')) and (not (z in ['0'..'9']));
  57.     if (podminka = true) then
  58.     begin
  59.          Hodnota := Hodnota1 + Hodnota2;
  60.          write(Hodnota, ' ');
  61.     end;
  62.     case z of
  63.     '(':      {do zasobniku}
  64.     begin
  65.       new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := 0;
  66.       pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  67.       case u of
  68.       'n':
  69.       begin
  70.         if (w = 's') and (v = 'i') then       {sinus reprezentuji jako A}
  71.         begin
  72.              new(pomocnaZas); pomocnaZas^.Znak := 'A'; pomocnaZas^.PrednostOperace := -10;
  73.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  74.         end
  75.         else if (w = 't') and (v = 'a') then       {tangens (tan) = C}
  76.         begin
  77.              new(pomocnaZas); pomocnaZas^.Znak := 'C'; pomocnaZas^.PrednostOperace := -10;
  78.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  79.         end
  80.         else if (v = 'l') then                     {ln = E}
  81.         begin
  82.              new(pomocnaZas); pomocnaZas^.Znak := 'E'; pomocnaZas^.PrednostOperace := -10;
  83.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  84.         end;
  85.       end;
  86.       's':                      {cosinus = B}
  87.       begin
  88.         if (w = 'c') and (v = 'o') then
  89.         begin
  90.              new(pomocnaZas); pomocnaZas^.Znak := 'B'; pomocnaZas^.PrednostOperace := -10;
  91.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  92.         end;
  93.       end;
  94.       'g':
  95.       begin
  96.         if (w <> 'o') and (v = 't') then       {tangens (tg) = C}
  97.         begin
  98.              new(pomocnaZas); pomocnaZas^.Znak := 'C'; pomocnaZas^.PrednostOperace := -10;
  99.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  100.         end
  101.         else if (w = 'l') and (v = 'o') then         {log_10 = D}
  102.         begin
  103.              new(pomocnaZas); pomocnaZas^.Znak := 'D'; pomocnaZas^.PrednostOperace := -10;
  104.              pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  105.         end;
  106.       end;
  107.       end;
  108.     end;
  109.     '+', '-':
  110.     begin
  111.       prednostOperaceZ := 1;
  112.       if (u = '(') then write(0, ' ');
  113.       if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then {novy operator ma vetsi hodnotu -> pridam ho do zasobniku}
  114.       begin
  115.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  116.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  117.       end
  118.       else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then   {novy operator ma stejnou hodnotu -> vypisu ten ze zasobniku a novy pridam  do zasobniku}
  119.       begin
  120.            write(zacatekZas^.Znak, ' ');
  121.            pomocnaZas := zacatekZas;
  122.            zacatekZas^.Znak := z;
  123.       end
  124.       else begin {vypis co je v zasobniku po kulatou zavorku, pridej tam z}
  125.            while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
  126.            begin
  127.              write(zacatekZas^.Znak, ' ');
  128.              pomocnaZas := zacatekZas;
  129.              zacatekZas := zacatekZas^.Dalsi;
  130.              dispose(pomocnaZas);
  131.            end;
  132.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  133.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  134.       end;
  135.     end;
  136.     '*', '/':
  137.     begin
  138.       prednostOperaceZ := 2;
  139.       if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then
  140.       begin
  141.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  142.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  143.       end
  144.       else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then
  145.       begin
  146.            write(zacatekZas^.Znak, ' ');
  147.            pomocnaZas := zacatekZas;
  148.            zacatekZas^.Znak := z;
  149.       end
  150.       else begin
  151.         while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
  152.            begin
  153.              write(zacatekZas^.Znak, ' ');
  154.              pomocnaZas := zacatekZas;
  155.              zacatekZas := zacatekZas^.Dalsi;
  156.              dispose(pomocnaZas);
  157.            end;
  158.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  159.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  160.       end;
  161.     end;
  162.     '^':
  163.     begin
  164.       prednostOperaceZ := 3;
  165.       if (zacatekZas = nil) or (prednostOperaceZ > zacatekZas^.PrednostOperace) then
  166.       begin
  167.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  168.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  169.       end
  170.       else if (prednostOperaceZ = zacatekZas^.PrednostOperace) then
  171.       begin
  172.            write(zacatekZas^.Znak, ' ');
  173.            pomocnaZas := zacatekZas;
  174.            zacatekZas^.Znak := z;
  175.       end
  176.       else begin
  177.         while (zacatekZas <> nil) and (zacatekZas^.Znak <> '(') do
  178.            begin
  179.              write(zacatekZas^.Znak, ' ');
  180.              pomocnaZas := zacatekZas;
  181.              zacatekZas := zacatekZas^.Dalsi;
  182.              dispose(pomocnaZas);
  183.            end;
  184.            new(pomocnaZas); pomocnaZas^.Znak := z; pomocnaZas^.PrednostOperace := prednostOperaceZ;
  185.            pomocnaZas^.Dalsi := zacatekZas; zacatekZas := pomocnaZas;
  186.       end;
  187.     end;
  188.     ')':
  189.     begin
  190.       while (true) do
  191.       begin
  192.         if (zacatekZas^.Znak = '(') then
  193.         begin
  194.              pomocnaZas := zacatekZas;
  195.              zacatekZas := zacatekZas^.Dalsi;
  196.              dispose(pomocnaZas);
  197.              break;
  198.         end;
  199.         write(zacatekZas^.Znak, ' ');
  200.         zacatekZas := zacatekZas^.Dalsi;
  201.       end;
  202.     end;
  203.  
  204.     end;
  205.   until seekeoln;
  206.   while (zacatekZas <> nil) do  {pokud cely vyraz nebyl ohranicen zavorkami, posledni zbyvajici operator se nevypise, vypisu ho manualne}
  207.   begin
  208.     write(zacatekZas^.Znak, ' ');
  209.     pomocnaZas := zacatekZas;
  210.     zacatekZas := zacatekZas^.Dalsi;
  211.     dispose(pomocnaZas);
  212.   end
  213. end;
  214.  
  215. begin
  216.   prevedDoPostfixu(zacatek);
  217.   readln;
  218.   readln;
  219. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement