| Posledná zmena: 14.10.2002

polia

## Polia

eratostenove sito
Napíšte procedúru, ktorá metódou eratostenovho sita nájde a vypíše (do Memo1) všetky prvočísla do n - konštanta. |
    procedure esito;
    const
      n=1000;
    var
      e:array[2..n] of boolean;
      i,j:integer;
      s:string;
    begin
      Memo1.Lines.Clear; s:='';
      for i:=2 to n do e[i]:=true;
      for i:=2 to n do
        if e[i] then begin
          s:=s+IntToStr(i)+' ';
          j:=i+i;
          while j<=n do begin
            e[j]:=false; inc(j,i);
          end;
        end;
      Memo1.Lines.Add(s);
    end;
frekvenčná tabuľka písmen v súbore
Napíšte program, ktorý prečíta zo vstupného súboru text až po `'.'` a vypíše v abecednom poradí malé písmená, ktoré sa v ňom vyskytli práve raz. - dorobte tak, aby sa nerozlišovali malé a veľké písmená |
    var
      t:TextFile;
      p:array['a'..'z'] of integer;
      z:char;
    begin
      AssignFile(t,'test.txt'); Reset(t);
      for z:=low(p) to high(p) do p[z]:=0;
      z:=' ';
      while not eof(t) and (z<>'.') do begin
        read(t,z);
        if (z>='a') and (z<='z') then inc(p[z]);
      end;
      CloseFile(t);
      for z:=low(p) to high(p) do
        if p[z]=1 then Memo1.Lines.Add(z);
    end;
cyklický posun poľa
Procedúra posun cyklicky posunie prvky poľa o 1 jeden vpravo - nepoužije pomocné pole. |
    type
      pole = array[1..10] of integer;

    procedure posun(var p:pole);
    var
      i,p1:integer;
    begin
      p1:=p[high(p)];
      for i:=high(p) downto low(p)+1 do
        p[i]:=p[i-1];
      p[low(p)]:=p1;
    end;
pole čísel do reťazca
Funkcia PoleToStr vytvorí reťazec z prvkov celočíselneho poľa - pripravený na výpis. |
    type
      pole = array[1..10] of integer;

    function PoleToStr(var p:pole):string;
    var
      i:integer;
    begin
      Result:='';
      for i:=low(p) to high(p) do
        Result:=Result+IntToStr(p[i])+' ';
    end;

### Ďalšie úlohy

- Máme pole cifier `array [1..10] of 0..9` reprezentujúce desaťciferné čísla. Vytvorte funkcie, ktoré z takéhoto typu vytvoria integer a naspäť – z integeru daný typ. Vytvoriť funkciu na sčítanie dvoch takýchto čísel.
- V poli A sú len 0 alebo 1. Napíšte procedúru, ktorá ho utriedi vzostupne. Nie je povolené najprv spočítať počet 0 a potom tento počet 0 priradiť do prvých prvkov poľa a zvyšok doplniť 1. Môžete prvok poľa uchovať do nejakej premennej a potom ho priradiť do iného prvku, resp. vymeniť obsahy dvoch premenných. Riešte túto úlohu, ak sú prvkami poľa 0, 1 a 2.
- Procedúra posunK cyklicky posunie prvky poľa o k prvkov vpravo - nepoužije pomocné pole, ani v cykle k-krát neposúvajte o 1 prvok.

## Pole korytnačiek

n-uholník
Najprv umiestnime n korytnačiek vo vrcholoch pravidelného n-uholníka (na kružnici s polomerom d). Potom sa natočia tak, že každá je smerom k svojej nasledujúcej. Konštanta p určuje o koľko je nasledujúca korytnačka, napr. p=2 znamená, že nasledujúcou 1 je 3.

Na záver všetky naraz prejdú vzdialenosť k svovej nasledujúcej krokom 1.

    const
      n=11; d=200; p=6;
    var
      k:array[1..n] of TKor;
      i,j,v:integer;
    begin
      for i:=1 to n do begin
        k[i]:=TKor.Create;
        with k[i] do begin
          PH; Smer:=i*360/n; Dopredu(d);
        end;
      end;
      for i:=1 to n do
        with k[i] do begin
          j:=(i+p-1) mod n+1;
          Smer:=Smerom(k[j].X,k[j].Y);
          PD;
        end;
      v:=round(k[p mod n+1].Vzd(k[1].X,k[1].Y));
      for j:=1 to v do begin
        for i:=1 to n do
          k[i].Dopredu(1);
        cakaj(1);
      end;
    end;

krúženie n korytnačiek
Umiestnite rovnomerne n korytnačiek na vodorovnej priamke a každú postupne natočte o 15 stupňov. Potom sa bude každá pohybovať po svojej kružnici (Dopredu(4) a Vpravo(2)) pričom v každom kroku vykreslíme úsečky, ktoré spájajú dve susedné korytnačky. |
    const
      n=80;
    var
      i:integer;
      k:array[1..n] of TKor;
      xx,yy:real;
    begin
      for i:=1 to n do begin
        k[i]:=TKor.Create(10*i+10,250,i*15);
        k[i].HP:=5;
      end;
      while true do begin
        for i:=1 to n do
          with k[i] do begin
            Dopredu(4); Vpravo(2);
          end;
        zmaz;
        for i:=1 to n-1 do
          with k[i] do begin
            xx:=x; yy:=y; ZmenXY(k[i+1].X,k[i+1].Y);
            ZmenXY(xx,yy);
          end;
        cakaj(1);
      end;
    end;
n poľovníkov naháňa jednu korytnačku
n náhodne rozmiestnených korytnačiek naháňa jednu korytnačku, ktorá chodí po obvode štvorca s konštantným krokom d, naháňajúce korytnačky sa hýbu s krokom koef*d. Podľa koeficientu koef budú vznikať rôzne krivky. všimnite si, že pri nastavení náhodnej farby sme použili

random(16777216);

namiesto

RGB(random(256),
random(256),
random(256));

v tomto prípade to dáva rovnaké výsledky

    const
      n=6; d=3; koef=0.6; stvorec=60;
    var
      k:array[0..n] of TKor;
      i,j:integer;
    begin
      zmaz;
      k[0]:=TKor.Create(200,300);
      for i:=1 to n do begin
        k[i]:=TKor.Create(random(sirka),random(vyska));
        k[i].FP:=random(16777216);
        k[i].HP:=2;
      end;
      for j:=1 to 500 do begin  // počet krokov naháňačky
        with k[0] do begin
          Dopredu(d);
          if j mod stvorec=0 then Vpravo(90);
        end;
        for i:=1 to n do
          with k[i] do begin
            Smer:=Smerom(k[0].X,k[0].Y);
            Dopredu(d*koef);
          end;
        cakaj(1);
      end;
    end;

### Ďalšie úlohy

- N korytnačiek je na začiatku rovnomerne rozostavených na vodorovnej priamke - všetky sú natočené na sever - korytnačky budú stále chodiť nejakou rýchlosťou (napr. prvá krokom 1, druhá krokom 2, ...). Ak prekročia hranicu +200 alebo -200, tak sa otočia a idú opačným smerom. Zabezpečte, aby korytnačky nikdy nevyšli z hraníc +200 a -200.
- Na ploche je N náhodne rozostavených korytnačiek. Prvá z nich chodí stále rovno, len na okraji plochy sa odrazí ako gulečníková guľa na okraji stola. Všetky ostatné sa navzájom naháňaju: druhá ide stále za prvou, tretia za druhou, ...
- pomocou poľa korytnačiek nakreslite pravidelný N-uholník so všetkými uhlopriečkami tak, že uhlopriečky sa budú vykresľovať naraz - každú uhlopriečku bude kresliť jedna korytnačka - zabezpečte, aby ju kreslila na 100 krokov vždy 1/100 dĺžky.

© 2002 AB, KVI
blaho@fmph.uniba.sk