hauzer

prostak.pas

Nov 18th, 2011
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.31 KB | None | 0 0
  1. { Da bi se program uspesno preveo idite na Options->Mode...
  2.   i izaberite "Release" }
  3.  
  4. program prostak;
  5.  
  6. uses crt;
  7.  
  8. { Tipovi promenljivih }
  9. type
  10.     lwarray = array of longword; { Zbog istorijskih razloga funkcija ne sme da
  11.                                    vraca promenljivi niz, ali ako se deklarise
  12.                                    novi tip, onda moze }
  13.  
  14. { Konstante }
  15. const
  16.     escape_char : char = #27;
  17.  
  18. { Konstante }
  19. const
  20.     prvi_prosti : longword = 2;
  21.  
  22. { Eratostenovo sito - algoritam za pronalazenje prostih brojeva
  23.   - vraca niz svih prostih brojeve od 2 do m }
  24. function esito(m : longword) : lwarray;
  25. var
  26.     i, p, psqr, n : longword;
  27.     marked : boolean;
  28. begin
  29.     { Dodeli niz }
  30.     setlength(esito, m - prvi_prosti);
  31.  
  32.     { Popuni niz }
  33.     for i := prvi_prosti to m do
  34.         esito[i-prvi_prosti] := i;
  35.  
  36.     { Eratostenovo sito }
  37.     p := prvi_prosti;
  38.     psqr := sqr(p);
  39.     while true do
  40.     begin
  41.         { Oznaci brojeve na osnovu trenutnog prostog broja }
  42.         marked := false;
  43.         n := p;
  44.         i := psqr;
  45.         while i <= m do
  46.         begin
  47.             if esito[i-prvi_prosti] <> 0 then
  48.             begin
  49.                 esito[i-prvi_prosti] := 0;
  50.                 marked := true;
  51.             end;
  52.  
  53.         n := n + 1;
  54.         i := p * n;
  55.         end;
  56.         { Ako nema oznacenih brojeva ili ako je kvadrat trenutnog prostog broja
  57.           veci od gornje granice, onda prekini petlju: prekrizeni su svi
  58.           kompozitni brojevi }
  59.         if marked = false then break;
  60.         if psqr > m then break;
  61.  
  62.         { Odredi sledeci prosti broj }
  63.         for i := p + 1 to m do
  64.         begin
  65.             if esito[i-prvi_prosti] <> 0 then
  66.             begin
  67.                 p := esito[i-prvi_prosti];
  68.                 break;
  69.             end;
  70.         end;
  71.  
  72.         psqr := sqr(p);
  73.     end;
  74. end;
  75.  
  76. { Nadji proste brojeve od a do b }
  77. function nadji_proste(a, b : longword) : lwarray;
  78. var
  79.     i, k, j : longword;
  80. begin
  81.     if a < prvi_prosti then
  82.         a := prvi_prosti;
  83.  
  84.     if a >= b then
  85.         setlength(nadji_proste, 0)
  86.     else
  87.     begin
  88.         nadji_proste := esito(b);
  89.         k := b - a;
  90.         j := a - prvi_prosti;
  91.  
  92.         for i := 0 to k do
  93.         begin
  94.             nadji_proste[i] := nadji_proste[i+j];
  95.         end;
  96.  
  97.         setlength(nadji_proste, k);
  98.     end;
  99. end;
  100.  
  101. { Proverava da li je broj prost }
  102. function da_li_je_prost(p : longword) : boolean;
  103. var
  104.     x : longword;
  105.     prosti : lwarray;
  106. begin
  107.     da_li_je_prost := false;
  108.  
  109.     if p > prvi_prosti then
  110.     begin
  111.         prosti := esito(p + 1);
  112.         x := p;
  113.         while x <= p do
  114.         begin
  115.             if prosti[x] = p then
  116.             begin
  117.                 da_li_je_prost := true;
  118.                 break;
  119.             end;
  120.  
  121.             x := x - 1;
  122.         end;
  123.     end;
  124. end;
  125.  
  126. { Ispisuje niz prostih brojeva
  127.   - svakih x brojeva ce procedura sacekati da korisnik pristisne dugme }
  128. procedure ispisi_proste(prosti : lwarray; x : longword);
  129. var
  130.     i, j, l : longword;
  131. begin
  132.     j := 0;
  133.     l := length(prosti);
  134.     for i := 0 to l do
  135.     begin
  136.         if prosti[i] <> 0 then
  137.         begin
  138.             if (j <> 0) and (j mod x = 0) then
  139.                 if readkey() = escape_char then break;
  140.  
  141.             writeln(prosti[i]);
  142.             j := j + 1;
  143.         end;
  144.     end;
  145. end;
  146.  
  147. { Prikazi meni i vrati odabranu stavku }
  148. function meni(naslov : string; izbori : array of string) : integer;
  149. const
  150.     duzina_dekoracije : integer = 5;
  151. var
  152.     maxl, nsl, i, j, l, brizbora : integer;
  153.     st : string;
  154. begin
  155.     { Nadji duzinu najduze linije koja ce biti prikazana }
  156.     nsl := length(naslov);
  157.     maxl := nsl;
  158.     for st in izbori do
  159.     begin
  160.         l := length(st);
  161.         if l > maxl then
  162.             maxl := l;
  163.     end;
  164.     brizbora := length(izbori); str(brizbora, st);
  165.     maxl := maxl + length(st) + duzina_dekoracije;
  166.  
  167.     { Ispisi gornju granicu menija }
  168.     write(' ');
  169.     for i := 0 to maxl - 2 do write('-');
  170.     writeln(' ');
  171.  
  172.     { Ispisi naslov }
  173.     write('|');
  174.     l := maxl - nsl;
  175.     j := l div 2;
  176.     for i := 1 to l - 2 do
  177.     begin
  178.         if i = j then
  179.             write(' ', naslov, ' ')
  180.         else write('=');
  181.     end;
  182.     writeln('|');
  183.  
  184.     { Ipisi gornju granicu naslova }
  185.     write('|');
  186.     for i := 0 to maxl - 2 do write('=');
  187.     writeln('|');
  188.  
  189.     { Ipisi donju granicu naslova }
  190.     write('|');
  191.     for i := 0 to maxl - 2 do write('=');
  192.     writeln('|');
  193.  
  194.     { Ispisi izbore }
  195.     for i := 0 to brizbora - 1 do
  196.     begin
  197.         write('| ', i + 1, '. ');
  198.         write(izbori[i]);
  199.         l := maxl - length(izbori[i]) - duzina_dekoracije;
  200.         for j := 1 to l do write(' ');
  201.         writeln('|');
  202.     end;
  203.  
  204.     { Ispisi donju granicu menija }
  205.     write(' ');
  206.     for i := 0 to maxl - 2 do write('-');
  207.     writeln(' ');
  208.  
  209.     write('> ');
  210.     meni := integer(readkey()) - integer('0');
  211. end;
  212.  
  213. { Pocetak programa }
  214. var
  215.     a, b : longword;
  216.     prosti : lwarray;
  217.     treba_izaci : boolean;
  218.     izbori : array [1..3] of string;
  219.     izb : integer;
  220. begin
  221.     izbori[1] := 'Nadji sve proste brojeve u odredjenom opsegu';
  222.     izbori[2] := 'Proveri da li je broj prost ';
  223.     izbori[3] := 'Izadji';
  224.     treba_izaci := false;
  225.  
  226.     while not treba_izaci do
  227.     begin
  228.         clrscr();
  229.         izb := meni('PROSTAK', izbori);
  230.         clrscr();
  231.  
  232.         case izb of
  233.             1: begin
  234.                 write('Unesite granice opsega: ');
  235.                 readln(a, b);
  236.  
  237.                 writeln('Radim...');
  238.                 writeln();
  239.                 prosti := nadji_proste(a, b);
  240.                 if length(prosti) = 0 then
  241.                     writeln('Granice su neodgovarajuce!')
  242.                 else
  243.                     ispisi_proste(prosti, 20);
  244.  
  245.                 readkey();
  246.             end;
  247.             2: begin
  248.                 write('Unesite broj: ');
  249.                 readln(a);
  250.  
  251.                 write('Broj ... ');
  252.                 if not da_li_je_prost(a) then
  253.                     write('ni');
  254.                 writeln('je prost.');
  255.  
  256.                 readkey();
  257.             end;
  258.             3: treba_izaci := true
  259.             else
  260.             begin
  261.                 writeln('Nepostojeca komanda!');
  262.                 readkey();
  263.             end;
  264.         end;
  265.     end;
  266. end.
Advertisement
Add Comment
Please, Sign In to add comment