🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #347200

Megaset

#347200
From: apl
Date: Mon, 10 Jan 2022 13:34
40 lines
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-mail

Show 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