| Posledná zmena: 13.10.2002

funkcie a znakové reťazce

## Číselné funkcie

Fibonacciho čísla
Napíšte celočíselnú funkciu, ktorá pre vstupný parameter N vypočíta N-té Fibonacciho číslo. Napr. Fibonacci(0) = 1 Fibonacci(1) = 1 Fibonacci(2) = 2 Fibonacci(3) = 3
Fibonacci(4) = 5
Snažte sa minimalizovať počet lokálnych premenných.

    function Fibonacci(n:integer):integer;
    var
      f0,f1:integer;
    begin
      f0:=1; f1:=1; Result:=f1;
      while n>1 do begin
        Result:=f0+f1;
        f0:=f1; f1:=Result;
        dec(n);
      end;
    end;

počet deliteľov
Napíšte funkciu pocdel(n:integer), ktorá zistí počet deliteľov čísla n, počítame len deliteľov od 1 menšie ako n. Pomocou nej zadefinujte funkciu, ktorá zistí, či je nejaké číslo prvočíslo. |
    function pocdel(n:integer):integer;
    var
      i:integer;
    begin
      Result:=0;
      for i:=1 to n div 2 do
        if n mod i = 0 then inc(Result);
    end;

    function jeprvocislo(n:integer):boolean;
    begin
      Result:=pocdel(n)=1;
    end;
je prvočíslo
Napíšte funkciu, ktorá zistí, či dané číslo je prvočíslo (bez funkcie pocdel). |
    function jeprvocislo(n:integer):boolean;
    var
      i:integer;
    begin
      Result:=n>1; i:=2;
      while Result and (i<=n div 2) do begin
        Result:=n mod i<>0; inc(i);
      end;
    end;
súčet deliteľov
Napíšte funkciu sucdel(n:integer), ktorá spočíta všetkých deliteľov čísla n, počítame len deliteľov od 1 menšie ako n. Pomocou nej zadefinujte funkciu, ktorá zistí, či je nejaké číslo dokonalé - číslo sa rovná súčtu svojich deliteľov. |
    function sucdel(n:integer):integer;
    var
      i:integer;
    begin
      Result:=0;
      for i:=1 to n div 2 do
        if n mod i = 0 then inc(Result,i);
    end;

    function jedokonale(n:integer):boolean;
    begin
      Result:=sucdel(n)=n;
    end;
spriatelené čísla
Napíšte procedúru, ktorá nájde všetky dvojice spriatelených čísel menších ako dané n. Spriatelenými sa nazývajú dve prirodzené čísla, ak o každom z nich platí, že je súčtom všetkých deliteľov druhého čísla. Známe sú napr. (220,284); (1184, 1210) |
    procedure spriatelene(n:integer);
    var
      i,j:integer;
    begin
      for i:=1 to n do begin
        j:=sucdel(i);
        if (j<=n) and (sucdel(j)=i) then
          Memo1.Lines.Add(IntToStr(i)+','+IntToStr(j));
      end;
    end;
i-ta cifra čísla
Funkcia cifra(n,i:integer) vráti i-tu cifru čísla - cifry počítame od najnižšieho rádu. |
    function cifra(n,i:integer):integer;
    begin
      while (n>0) and (i>1) do begin
        n:=n div 10; dec(i);
      end;
      Result:=n mod 10;
    end;

### Ďalšie úlohy

- Napíšte celočíselnú funkciu s tromi parametrami c, k a n, ktorá vsunie cifru c na k-te miesto sprava v čísle n (teda vráti zmodifikované číslo n). Ak sa to urobiť nedá (k je väčšie ako počet cifier čísla n), vráti nezmenené číslo n.
- Napíšte procedúru, ktorá pre prirodzené číslo n a nájde všetky dvojice čísel z intervalu <n, 2*n>, ktoré sú blížencami. Blížencami sa nazývajú dve prvočísla, ktorých rozdiel je 2, napr. 41 a 43 sú blíženci.

## Znakové reťazce

palindromy
Napíšte funkciu, ktorá vráti true, ak reťazec, ktorý je jej parametrom je palindrom, inak vráti false. Palindrom je taký reťazec, ktorý sa rovnako číta spredu aj odzadu. Napr. ťahať, abcddcba |
    function palindrom(s:string):boolean;
    var
      i:integer;
    begin
      i:=1; Result:=true;
      while Result and (i<=length(s) div 2) do begin
        Result:= s[i]=s[length(s)-i+1];
        inc(i);
      end;
    end;
celý súbor do jedného znakového reťazca
Napíšte funkciu FileToStr, ktorá otvorí textový súbor a celý jeho obsah načíta do jediného veľkého znakového reťazca - reťazec má obsahovať aj konce riadkov. Parametrom funkcie je meno súboru a výsledkom je načítaný reťazec. |
    function FileToStr(meno:string):string;
    var
      t:TextFile;
      r:string;
    begin
      AssignFile(t,meno); Reset(t); Result:='';
      while not eof(t) do begin
        readln(t,r); Result:=Result+r+#13#10;
      end;
      CloseFile(t);
    end;

### Ďalšie úlohy

- Vylepšite funkciu palindorm tak, že ignoruje medzery a nerozlišuje malé a veľké písmená. Napr. aj toto sú palindromy: "Jelenovi pivo nelej" alebo "Kobyla Ma Maly Bok".
- Napíšte procedúru, ktorá vo vstupnom reťazci nahradí všetky výskyty `' '` sa nahradia `'* *'` – vsunutú medzeru už nenahrádzajte!

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