Article View: pl.comp.lang.delphi
Article #347201Re: Megaset
From: J-23
Date: Fri, 14 Jan 2022 09:43
Date: Fri, 14 Jan 2022 09:43
54 lines
4307 bytes
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-mailReferences:
<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