5. príklady


Posledná zmena: 13.10.2002

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