Article View: pl.comp.lang.delphi
Article #347200Megaset
From: apl
Date: Mon, 10 Jan 2022 13:34
Date: Mon, 10 Jan 2022 13:34
40 lines
3768 bytes
3768 bytes
Witam, w tym poście chcę przedstawić moje rozwiązanie dotyczące tworzenia i posługiwania się zbiorami o dowolnej wielkości. Krytyka i alternatywne propozycje mile widziane.
Biblioteka i kody źródłowe do pobrania ze strony https://apl.home.amu.edu.pl/apl/
Pozdrawiam,
apl
Typ zbiorowy w Delhi pozwala operować na zbiorach zawierających do 256 elementów. Stan ten można łatwo zmienić. Przedstawiamy tu metodę tworzenia i obsługi zbiorów o praktycznie nieograniczonej licz-bie elementów.
W Delhi (jak również i w Turbo-Pascalu), wartości typu zbiorowego są odnotowywane w ten sposób, że każdemu elementowi zbioru jest przyporządkowany jeden bit. Ustawienie bitu na 1 sygnalizuje obecność elementu, a ustawienie na 0 jego nieobecność. Każdy bajt może zatem kodować obecność ośmiu elemen-tów. Ten sposób kodowania zbiorów jest bardzo oszczędny i z tego względu chcieliśmy go zachować.
Delhi przeznacza na zapis zmiennej zbiorowej nie więcej niż 32 bajty, stąd wspomniane ograniczenie li-czebności zbiorów. Można to zmienić przeznaczając na kodowanie zbiorów strukturę o większych roz-miarach, np. tablica array[byte] of byte pozwoli zapisywać zbiory o 2048 elementach. Wystarczy więc zadeklarować tablicę o odpowiednio dużych rozmiarach o elementach typu byte (ze względu na prostotę obliczeń) i następnie utworzyć podprogramy modyfikujące i odczytujące odpowiednie bity owej struktury, aby móc posługiwać się zbiorami o nieograniczonej praktycznie wielkości.
Do właściwego bitu można dotrzeć posługując się maskami i operacjami bitowymi. Zakładając że ele-menty tablicy są indeksowane zaczynając od 0, bajt w którym znajduje się bit związany z danym elemen-tem zbioru można obliczyć wg wzoru
m= i div 8,
a numer bitu wg wzoru
n=i mod 8,
gdzie i jest numerem elementu, zaś maska, to liczba
l=1 shl n.
Przykładowo, przy deklaracjach
type TarrSet = array[byte] of byte;
procedure ilmn(const i:word;var l,m,n:word);
Begin
m:=i div 8;
n:=i mod 8;
l:=1 shl n;
End;{lmn}
elementy do zbioru można włączać za pomocą procedury:
procedure includeToSet(var s:TarrSet;i:word);
//włącza liczbę i do zbioru s
var l,m,n:word;
Begin
ilmn(i,l,m,n);
s[m]:=l or s[m];
End;{includeToSet}
W załączonym tekście modułu pn. „Megasety” zamieszczamy podprogramy do włączania i wyłączania elementów ze zbioru, obliczania sumy różnicy i iloczynu zbiorów, sprawdzania zawartości zbioru i przy-należności elementu do zbioru. Dołączamy też prosty program demonstrujący ich użycie.
Andrzej Pluciński
apl@amu.edu.pl
Technical Details
Message-ID:
<4deb1dbb-89eb-4541-af46-eb0fe4815911n@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.man.lodz.pl!newsfeed.pionier.net.pl!1.us.feeder.erje.net!feeder.erje.net!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mailShow Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:24c9:: with SMTP id m9mr3870866qkn.615.1641821651505; Mon, 10 Jan 2022 05:34:11 -0800 (PST) X-Received: by 2002:a9d:6a4d:: with SMTP id h13mr53996120otn.184.1641821651087; Mon, 10 Jan 2022 05:34:11 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.man.lodz.pl!newsfeed.pionier.net.pl!1.us.feeder.erje.net!feeder.erje.net!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Mon, 10 Jan 2022 05:34:10 -0800 (PST) Injection-Info: google-groups.googlegroups.com; posting-host=109.173.147.108; posting-account=ukiAYgoAAADpsCfFgVYs3wM73JlzLYyB NNTP-Posting-Host: 109.173.147.108 User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <4deb1dbb-89eb-4541-af46-eb0fe4815911n@googlegroups.com> Subject: Megaset From: apl <pla895534@gmail.com> Injection-Date: Mon, 10 Jan 2022 13:34:11 +0000 Lines: 71 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit