Programowanie w języku Delphi

Zbiory

  • 2016-09-08 07:27
  • 6 komentarzy
  • 5615 odsłon
  • Oceń ten tekst jako pierwszy
Set - zbiór. Zbiory (sets) są unikatowym, bardzo efektywnym mechanizmem właściwym językowi Pascal. Zbiory wykorzystuje się do przechowywania kolekcji elementów porządkowych. Zbiory deklaruje się za pomocą dyrektywy: set of, np:

type
  TChars = set of Char;
  TByteSet = set of Byte;

Jak wcześniej wspomniałem, zbiory służą do deklarowania prostych typów porządkowych, toteż takie deklaracje są niewłaściwe:

type
  TStrSet = set of String;
  TLongNo = set of Word;
  TSignedNo = set of Integer;

string nie jest typem wyliczeniowym, natomiast dwie następne deklaracje są niepoprawne ponieważ zbiory mogą maksymalnie zawierać 256 elementów, a numery porządkowe elementów muszą zawierać się w zakresie od 0 do 255 - Word i Integer dają nam dużo więcej elementów, ponadto Integer dałby nam elementy o numerach porządkowych ujemnych (Ord(Low(Integer)) < 0).

Zbiory mogą maksymalnie zawierać 256 elementów, a numery porządkowe elementów nie mogą przekraczać zakresu 0..255.

Inne sposoby deklaracji zbiorów:
type
  TWeekDays =  (Ni, Pn, Wt, Sr, Cz, Pt, So);
  TWeekDaysSet = set of TWeekDays ; // zbiór oparty na typie wyliczeniowym
 
  TDigits = set of 0 .. 9
  TLetters = set of 'A' .. 'Z';

Działania na zbiorach


Aby przypisać do zbioru jakieś elementy należy użyć konstrukcji:
var
  Samogloski, Spolgloski, Krzaczki: set of Char;
// ...
begin
  Samogloski := ['a', 'e', 'i', 'u', 'o', 'y'];
  Spolgloski := ['b' .. 'h', 'j' .. 't' {itd}];
  Krzaczki := [];

Wyrażenie [] oznacza zbiór pusty.
Aby dodać lub odjąć elementy zbiorów postępujemy tak jak w matematyce:
var
  A, B, C: set of Byte;
// ...
begin
// ...
  A := B + C - [9, 14 .. 13];
// ...
  C := A - [0];

Aby dołączyć/wyłączyć jeden element do zbioru możemy posłużyć się funkcjami Include() i Exclude():
Include(Spolgloski, 'm');
Exclude(Samogloski, 'i');
 
// to samo co:
// Spolgloski := Spolgloski + ['m'];
// Samogloski := Samogloski - ['i'];

Jaka jest różnica między tymi dwoma metodami? Cytując za nieistniejącą już stroną Borlanda (http://www.borland.pl/tech/optymalizacja_wydajnosci.shtml):
<quote>Przyglądając się eksperymentom przeprowadzanym na zbiorach danych (set) można dojść do ciekawych wniosków. Otóż okazuje się że konstrukcja postaci: s := s + ['a'] jest o dwa rzędy wielkości wolniejsza od polecenia Include(s, 'a'). Rozsądnym zatem wydaje się być natychmiastowe zastąpienie wszystkich operacji dodawania pojedynczych elementów do zbioru poprzez zastosowanie polecenia include. Zresztą obserwując implementacje podstawowych modułów Delphi zobaczymy, że wszystkie operacje związane z dodawaniem lub usuwaniem elementu zbioru (np. komponentu) wykonywane są z użyciem poleceń Include i Exclude.</quote>

Iloczyny zbiorów zapisujemy:
var
  A, B, C: set of Byte;
// ...
begin
  A := [1, 2, 3, 4];
  B := [3, 4, 5, 6];
  C := A * B; // w zbiorze znajdą się elementy: 3, 4

Aby sprawdzić, czy w zbiorze znajduje się dany element, posługujemy się operatorem in:
var
  AvailChars: set of Char;
  X: Char;
// ...
begin
// ...
  if X in AvailChars then
    DoSomething;

Do sprawdzania, czy dany zbiór zawiera się w innym zbiorze należy posłużyć się operatorem: <=:
var
  X, Y: set of Byte;
// ...
begin
  X := [17 ..  41];
  Y := [5  ..100];
 
  if not (X <= Y) then
    ShowError;

6 komentarzy

chemik143 2008-02-14 03:08

Zawsze sie znajdzie ktoś, kto znajdzie pojedynczy błąd i już nie wytrzyma jak nie najedzie..

Jojersztajner 2006-04-04 07:19

świetna znajomość Delphi? [diabel]

timmy 2006-02-28 22:21

"Współgłoski" ??? świetna znajomość Delphi nie zwalnia chyba z poprawnego używania własnego języka nie ??

mlagrass 2006-01-08 07:19

przydaje się...

Marooned 2005-12-31 13:20

to trza było poprawić ;p

nediam 2005-12-31 12:53

artykulik dobry ale link zawiera niepotrzebny ":" na koncu :)