Programowanie w języku Delphi » Artykuły

Zbiory

  • 2008-10-03 15:17
  • 0 komentarzy
  • 1348 odsłon
  • Oceń ten tekst jako pierwszy
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;