🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Megaset

#347201
From: J-23
Date: Fri, 14 Jan 2022 09:43
54 lines
4307 bytes
W dniu 2022.01.10 o 14:34, apl pisze:
> 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


1. Piszesz w środowisku IDE Delphi a nie Delhi - o ile pierwszy raz 
myślałem że to literówka - tak za n-tym razem zrozumiałem że to 
literówką nie jest.

2. Opisałeś dość dobrze co przedstawiasz lecz problem jest w tym że nie 
sprecyzowałeś czego szukasz - działania na zbiorach można wykonać na 
wiele sposobów - Jeśli pytasz czy twoje rozwiązanie jest dobre to ja Ci 
odpowiem zależy do czego chcesz go użyć

Pozdrawiam
J-23
Technical Details
Message-ID: <61e145d0$0$542$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!feeds.phibee-telecom.net!border2.nntp.dca1.giganews.com!nntp.giganews.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <4deb1dbb-89eb-4541-af46-eb0fe4815911n@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!feeds.phibee-telecom.net!border2.nntp.dca1.giganews.com!nntp.giganews.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Fri, 14 Jan 2022 10:43:43 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0
Subject: Re: Megaset
Newsgroups: pl.comp.lang.delphi
References: <4deb1dbb-89eb-4541-af46-eb0fe4815911n@googlegroups.com>
From: J-23 <Baczeklu@poczta.fm>
In-Reply-To: <4deb1dbb-89eb-4541-af46-eb0fe4815911n@googlegroups.com>
Lines: 54
Message-ID: <61e145d0$0$542$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 178.213.140.164
X-Trace: 1642153424 unt-rea-a-02.news.neostrada.pl 542 178.213.140.164:49336
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit