6. príklady


Posledná zmena: 14.10.2002

Banner Text 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