| Posledná zmena: 8.10.2002

množiny

## Množiny

- nasledujú úlohy na množinu čísel - pre všetky predpokladáme tieto deklarácie:

type
baza = 1..50;
mnozina = set of baza;

funkcia vytvorí z množiny reťazec
    function vypis(const mn:mnozina):string;
    var
      i:baza;
    begin
      Result:='[';
      for i:=low(baza) to high(baza) do
        if i in mn then
          Result:=Result+','+IntToStr(i);
      Result:=Result+']';
      if Result[2]=',' then delete(Result,2,1);
    end;
náhodná množina
náhodné generovanie množiny: pre každý prvok "hodíme mincu" - podľa výsledku zaradíme / nezaradíme do výsledku |
    function generuj:mnozina;
    var
      i:baza;
    begin
      Result:=[];
      for i:=low(baza) to high(baza) do
        if random(2)=0 then Result:=Result+[i];
    end;
počet prvkov množiny
    function pocet(const mn:mnozina):integer;
    var
      i:baza;
    begin
      Result:=0;
      for i:=low(baza) to high(baza) do
        if i in mn then inc(Result);
    end;
párne prvky
funkcia vráti len všetky párne čísla |
    function parne(const mn:mnozina):mnozina;
    var
      i:baza;
    begin
      Result:=[];
      for i:=low(baza) to high(baza) do
        if (i mod 2=0)and(i in mn) then
          Result:=Result+[i];
    end;
každý druhý prvok
funkcia vráti každý druhý prvok množiny napr. parne2([1,2,3,5,6,7,9,10]) vráti [2,5,7,10] |
    function parne2(const mn:mnozina):mnozina;
    var
      i,j:baza;
    begin
      Result:=[]; j:=0;
      for i:=low(baza) to high(baza) do
        if i in mn then begin
          inc(j);
          if j mod 2=0 then
            Result:=Result+[i];
        end;
    end;
nepárne čísla z množiny
funkcia vráti všetky nepárne čísla z danej množiny dalo by sa aj
    Result:=mn-parne(mn);
    function neparne(const mn:mnozina):mnozina;
    var
      i:baza;
    begin
      Result:=[];
      for i:=low(baza) to high(baza) do
        if odd(i)and(i in mn) then
          Result:=Result+[i];
    end;
množinový doplnok
pozor! častou chybou je zápis
    Result:=[baza]-mn;
    function doplnok(const mn:mnozina):mnozina;
    begin
      Result:=[low(baza)..high(baza)]-mn;
    end;
prienik
prienik dvoch množín bez množinovej operácie * dalo by sa aj napr. Result:=a-(a-b); |
    function prienik(const a,b:mnozina):mnozina;
    var
      i:baza;
    begin
      Result:=[];
      for i:=low(baza) to high(baza) do
        if (i in a)and(i in b) then
          Result:=Result+[i];
    end;
náhodná množina
funkcia vygeneruje náhodnú n-prvkovú množinu |
    function nahodne(n:integer):mnozina;
    var
      i,k:integer;
      p:array[1..50] of baza;
    begin
      for i:=1 to 50 do p[i]:=i;
      k:=50; Result:=[];
      while n>0 do begin
        i:=random(k)+1;
        Result:=Result+[p[i]];
        p[i]:=p[k]; dec(k); dec(n);
      end;
    end;

- ďalšie úlohy sú na množinu znakov - pre všetky predpokladáme tieto deklarácie:

type
zmnozina = set of char;

písmená v reťazci
funkcia boli zistí, ktoré písmená sa vyskytli v zadanom znakovom reťazci (nebudeme rozlišovať malé a veľké) chceme podmožinu ['a'..'z'] |
    function boli(s:string):zmnozina;
    var
      i:integer;
    begin
      s:=LowerCase(s); Result:=[];
      for i:=1 to length(s) do
        Result:=Result+[s[i]];
      Result:=Result*['a'..'z'];
    end;
chýbajúce písmená
ako predchádzajúca úloha, ale zistiť, ktoré chýbajú dalo by sa aj Result:=['a'..'z']-boli(s); |
    function neboli(s:string):zmnozina;
    var
      i:integer;
    begin
      s:=LowerCase(s); Result:=['a'..'z'];
      for i:=1 to length(s) do
        Result:=Result-[s[i]];
    end;
znaky v súbore
funkcia zistí, ktoré znaky sa v textovom súbore vyskytli aspoň raz zaujímajú nás znaky z [' '..#255] |
    function bolivsubore(s:string):zmnozina;
    var
      t:TextFile;
      z:char;
    begin
      AssignFile(t,s); Reset(t);
      Result:=[];
      while not eof(t) do begin
        read(t,z); Result:=Result+[z];
      end;
      CloseFile(t);
      Result:=Result*[' '..#255];
    end;
z množiny reťazec
funkcia vypis z množiny znakov vytvorí reťazec reprezentujúci danú množinu, napr. v tvare ['2','D','X','a','b'] |
    function vypis(const mn:zmnozina):string;
    var
      z:char;
    begin
      Result:='[';
      for z:=' ' to #255 do
        if z in mn then
          Result:=Result+','''+z+'''';
      Result:=Result+']';
      if Result[2]=',' then delete(Result,2,1);
    end;
z množiny reťaze
funkcia vypis2 z množiny znakov vytvorí reťazec len zo znakov v množine |
    function vypis2(const mn:zmnozina):string;
    var
      z:char;
    begin
      Result:='';
      for z:=' ' to #255 do
        if z in mn then
          Result:=Result+z;
    end;
počet prvkov
funkcia pocet zistí počet prvkov množiny znakov |
    function pocet(const mn:zmnozina):integer;
    var
      z:char;
    begin
      Result:=0;
      for z:=' ' to #255 do
        if z in mn then inc(Result);
    end;

### Ďalšie úlohy

- funkcia pre zadané n vytvorí množinu všetkých deliteľov n, ktoré sú menšie ako 256
- vytvoriť množinu všetkých čísel do 255, ktoré obsahujú cifru 3
- vytvoriť množinu všetkých čísel do 255, v ktorej pre všetky prvky platí, že v ich dvojkovom zápise je párny počet cifier 0 aj 1 (vymyslite si aj iné podmienky, napr. rovnaký počet 0 a 1 a pod.)

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