Zbiory

Adam Boduch

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;

0 komentarzy