Radomíra Duží L06615 Datový typ množina Množina slouží k uložení prvků stejného bázového ordinárního typu. Bázové typy - jsou typy, jejichž hodnot mohou prvky množiny nabývat. Nesmí obsahovat více než 256 přípustných hodnot ani hodnoty záporné, číselné hodnoty tvoří celá čísla. Jedná se o typy byte (čísla), char(znaky), boolean, mohou to být také výčtové typy. Deklarace množiny set of... Příklady deklarací: (Obecně) Type název = set of bázový typ; Type Mnozina = set of byte; Type Znaky = set of char; Type Cisla = 1..10 Výčtový typ: Type vycet = (cervena, modra, zluta) var barva : set of vycet; Deklarace proměnné typu množina: var mnozina: set of bázový typ; V paměti počítače jsou množiny reprezentovány jako posloupnost bitů, každému prvku množiny je v paměti počítače vyhrazen 1 bit, hodnota 1 je užita, je-li prvek v odpovídajícím ordinárním pořadí uložen v množině, v opačném případě se hodnota rovná 0. 1 0 0 1
Konstrukce množiny: Hodnoty do množiny přiřazujeme pomocí hranatých závorek: mnozina:= [] - prázdná množina mnozina:= [1,2,3,4,5] mnozina:= [1..5] (množina, jejíž prvky mohou nabývat hodnot 1 až 5) mnozina:= [1,2, 4..8,15] (množina s prvky 1,2, 4 až 8, 15) mnozina:= [cervena, modra, zluta] mnozina:= [ A, E, I, O, U ] Operace s množinami: Operace na množinách: 1. union (A,B,C) do C přiřadí sjednocení A a B 2. intersection (A,B,C) do C přiřadí průnik A a B 3. difference (A,B,C) do C přiřadí množinový rozdíl A - B 4. member (x,a) vrátí TRUE, když prvek x patří do množiny, jinak vrátí FALSE 5. makenull (A) vytvoří prázdnou množinu A 6. insert (x,a) vloží prvek x do množiny A 7. delete (x,a) odstraní prvek x z množiny A, pokud v ní takový prvek existuje 8. min (A), max (A) vrací minimální (resp. maximální) hodnotu prvku v množině A 9. equal (A,B) vrátí TRUE, pokud A=B, jinak vrátí FALSE 10. assign (A,B) do množiny A přiřadí hodnotu B
Implementace množiny uspořádaným lineárním seznamem V případě implementace množiny uspořádaným lineárním seznamem předpokládáme, že množinu tvoří jednotlivé prvky seznamu. V podstatě vytváříme uspořádaný seznam, do nějž je nutné vkládat prvky ve správném pořadí (prvek s nejnižší hodnotou na začátek seznamu, prvek s nejvyšší hodnotou pak na jeho konec). Prvek s určitou hodnotou se v seznamu může vyskytovat pouze jedenkrát. Deklarace type ukaz = ^mnozina; mnozina = record ; var pa, pb, pc: ukaz; hodn: Integer; dalsi: ukaz Vytvoření prázdné množiny procedure TForm1.FormCreate(Ser: TObject); pa:=nil; pb:=nil; ; Vkládání prvků do množiny procedure Vloz(var p: ukaz; x: Integer); var q, r: ukaz; if p=nil then new(q); q^.hodn:=x; q^.dalsi:=nil; p:=q if x< p^.hodn then // pa, pb - pro vytvoření dvou množin, pc - výsledná množina (operace sjednocení, průnik) // jestliže je ukazatel na prvek nastaven na nil, lze předpokládat, že je seznam (množina prvků) prázdný // prvky vkládáme na konkrétní pozici v seznamu // vložení prvku do prázdného seznamu // je-li prvek menší, než aktuální
new(q); q^.hodn:=x; q^.dalsi:=p; p:=q if x=p^.hodn then q:=p; while (q^.dalsi<>nil) and (x>q^.hodn) do q:=q^.dalsi; if x>q^.hodn then new(r); r^.hodn:=x; r^.dalsi:=nil; q^.dalsi:=r if x<>q^.hodn then new(r); r^.hodn:=q^.hodn; q^.hodn:=x; r^.dalsi:=q^.dalsi; q^.dalsi:=r Sjednocení množin procedure sjednoceni(pa, pb: ukaz; var C: ukaz); c:=pa; while pb<>nil do prvek, vložíme menší prvek před aktuální prvek // prvek se stejnou hodnotou nemůžeme vložit vícekrát... // je-li prvek větší než aktuální prvek, vložíme ho za daný prvek // výsledná množina (C) obsahuje všechny prvky, které se vyskytují v daných množinách (A, B). Najdeme-li v nich prvek se stejnou hodnotou, bude se ve sjednocení množin vyskytovat pouze 1x.
Vloz(C, pb^.hodn); pb:=pb^.dalsi Průnik procedure prunik(pa, pb: ukaz; var C: ukaz); c:=nil; while pa<>nil do while (pb<>nil) and (pb^.hodn<pa^.hodn) do pb:=pb^.dalsi; if pb^.hodn=pa^.hodn then Vloz(C, pb^.hodn); pa:=pa^.dalsi volání procedury pro vkládání prvků a jejich výpis procedure TForm1.Button1Click(Ser: TObject); Vloz(pA, StrToInt(Edit1.text)); Edit1.Clear; Button2Click(Ser); ; // výsledná množina (C) obsahuje pouze ty prvky, které mají mají stejnou hodnotu a vyskytují se zároveň v množině A a B. // prvky množiny vložíme formuláře pomocí komponenty Edit procedure TForm1.Button2Click(Ser: TObject); var q: ukaz; q:=pa; Memo1.Lines.Clear; while q<>nil do Memo1.Lines.Add(IntToStr(q^.hodn)); q:=q^.dalsi // prvky množiny zobrazíme pomocí komponenty Memo
; volání procedur sjednocení a průnik a jejich výpis procedure TForm1.Button6Click(Ser: TObject); var q: ukaz; sjednoceni (pa, pb, pc); Memo3.Lines.Clear; q:=pc; while q<>nil do ; Memo3.Lines.Add(IntToStr(q^.hodn)); q:=q^.dalsi ; procedure TForm1.Button7Click(Ser: TObject); var q: ukaz; prunik (pa, pb, pc); Memo3.Lines.Clear; q:=pc; while q<>nil do Memo3.Lines.Add(IntToStr(q^.hodn)); q:=q^.dalsi ; ;