Zbiory

Strona g│≤wna

 

Zbiory

Co to s▒ te zbiory? Mhhh... s▒ to typy reprezentuj▒ce mechanizm kolekcji... mo┐e to nie zabrzmi zbyt dobrze, ale zaczekaj chwilkΩ i poczytaj dalej...

Normalnie deklaruj▒c jaki╢ typ robisz tak:

type
  TCars = (tcFord, tcSkoda, tcFerrari, tcPorshe, tcOpel, tcPeugeot, tcRenault);

Je┐eli chcesz zadeklarowaµ zbi≤r robisz w ten spos≤b: 

type
  TCars = (tcFord, tcSkoda, tcFerrari, tcPorshe, tcOpel, tcPeugeot, tcRenault);
  TCarSet = set of TCars;

Tak wiΩc zbiory deklaruje siΩ za pomoc▒ s│≤w set of...

Zastanawiasz siΩ po co? Ot≤┐ zbiory mo┐na "wybieraµ" z typu i przypisywaµ do konkretnej zmiennej - zobacz!

var
  Tanie,
  Srednie,
  Drogie : TCarSet;
begin
  Tanie := [];
  Srednie := [ tcSkoda, tcOpel, tcFord, tcPeugeot, tcRenault ];
  Drogie := [ tcFerrari, tcPorshe ];

W ten spos≤b do r≤┐nych zmiennych dopisali╢my poszczeg≤lne elementy ze zbioru. Zbiory przypisuje siΩ za pomoc▒ nawias≤w klamrowych, a nawias pousty [] oznacza zbi≤r pusty. 
UWAGA! Max. ilo╢µ jaka mo┐e siΩ znale╝µ w zbiorze nie mo┐e przekraczaµ 255.

Oczywi╢cie elementy zbioru mo┐na ze sob▒ por≤wnywaµ za pomoc▒ operatora in:

procedure TForm1.Button1Click(Sender: TObject);
begin
{  porownanie, czy dany element dotyczy danego zbioru }
  if not (tcFord in Drogie) then
    { ... }
end;

NastΩpuje sprawdzenie: je┐eli element tcFord nie nale┐y do zmiennej Drogie, ( kt≤ra wskazuje na zbi≤r ) to wykonaj jakie╢ operacje...

Mo┐liwe jest tak┐e por≤wnywanie typ≤w w trochΩ inny spos≤b: 

procedure TForm1.Button2Click(Sender: TObject);
var
  I : Integer;
begin
  I := 99;
  if I in [1..100, 101..120, 200] then
    ShowMessage('Tak, liczba: ' + IntToStr(i) + ' nale┐y do zbioru...');
end;

W tym wypadku do zmienej I zostaje przypisana liczba 99, a nastΩpnie nastΩpuje por≤wnanie, czy: zmienna i jest z zakresu od 1 do 100 lub czy jest z zakresu od 101 do 120 lub czy jest to liczba 200. 

R≤wnie┐ jest mo┐liwe tworzenie zbior≤w w postaci tekstowej: 

procedure TForm1.Button2Click(Sender: TObject);
type
  SetLitery = set of 'A'..'E';
var
  Litery : SetLitery;
begin
  if ('B' in Litery) then { ... }
end;

Nowy typ StLitery bΩd▒ z zakresu od litery A do E. Zauwa┐ skr≤con▒ deklaracje typu, kt≤ra tak┐e jest mo┐liwa. NastΩpnie nastΩpuje sprawdzenie, czy dana litera nale┐y do zbioru. 

Dodawanie i odejmowanie element≤w

Oczywi╢cie istnieje mo┐liwo╢µ dodawania element≤w do zbioru. Robi siΩ to za pomoc▒ polece± Include ( dodawanie ) oraz Exclude ( odejmowanie ):

procedure TForm1.Button1Click(Sender: TObject);
begin
{  porownanie, czy dany element dotyczy danego zbioru }
  if not (tcFord in Drogie) then
  begin
    Include(Drogie, tcFord); // dodanie elementu do zbioru...
    Exclude(Srednie, tcFord); // odjecie elementu ze zbioru...
  end;
end;

Dodawanie lub odejmowanie element≤w jest tak┐e mo┐liwe za pomoc▒ operator≤w + i -

    Drogie := Drogie + [tcFord];
    Srednie := Srednie - [tcFord];

Jednak u┐ycie polece± Include/Exclude jest bardziej efektowne gdy┐ szybsze. Oto kawa│ek tego programu: 

type
{   deklaracja zbiorow i typow }
  TCars = (tcFord, tcSkoda, tcFerrari, tcPorshe, tcOpel, tcPeugeot, tcRenault);
  TCarSet = set of TCars;

var
  Tanie,
  Srednie,
  Drogie : TCarSet;

procedure TForm1.Button1Click(Sender: TObject);
begin
{  porownanie, czy dany element dotyczy danego zbioru }
  if not (tcFord in Drogie) then
  begin
    Include(Drogie, tcFord); // dodanie elementu do zbioru...
    Exclude(Srednie, tcFord); // odjecie elementu ze zbioru...
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{  przypisanie elementow do poszczegolnyh zmiennych }
  Tanie := [];
  Srednie := [ tcSkoda, tcOpel, tcFord, tcPeugeot, tcRenault ];
  Drogie := [ tcFerrari, tcPorshe ];
end;

Jak zwykle czekam na pytania/sugestie/info o b│edach itp. pod adresem: boduch@poland.com

Adam Boduch