Zbiory - realizacja tablicowa
(* Zadanie. Utworzyc abstrakcyjny typ Zbior wraz z procedurami wykonywanymi na danych typu Zbior. Do reprezentowania zbiorow uzyc tablic. Utworzyc biblioteke Pascala (UNIT) zawierajaca wszystkie napisane definicje i procedury. Przedyskutowa/c marno/s/c takiej realizacji. Zastanowi/c si/e jak mo/zna to poprawi/c? Realizacja 'zbiorow' z zastosowaniem tablic. Przyklad. Stale: Moc = ilosc elementow w zbiorze type ElementZbioru = liczba czlkowita z zakresu 1..Moc Zbior = tablica [1..Moc] o elementach TRUE lub FALSE Procedury i funkcje: UtworzZbiorUniwersalny(Z) - proc. (TRUE -> Z[I] DodajElement[DoZbioru](E,Z) - proc. UsunElement[ZeZbioru](E,Z) - proc. UtworzPusty(Z) - FALSE -> Z[I] PustyZbior - funkcja; boolean RowneZbiory - ,, WZbiorze - ,,; sprawdza czy el. nalezy do zbioru SumaZbiorow - suma topol. 2 zbiorow RoznicaZbiorow - roznica topol. 2 zb. IloczynZbiorow - przeciecie 2 zbiorow PodzbiorZbioru - funk., boolean CzytajZb - czyta niezerowe elementy zbioru z konsoli WypiszZb - wypisuje numery niezerowych elementow *) uses Crt; const Moc = 100; type ElementZbioru = 1..Moc; Zbior = array [ElementZbioru] of boolean; procedure UtworzPusty(var Z: Zbior); (* oproznia zbior S *) var I: integer; begin for I:=1 to Moc do Z[i]:=false end; procedure UtworzZbiorUniwersalny(var Z: Zbior); (* wstawia TRUE do Z dla kazdego i*) var I: integer; begin for i:=1 to Moc do Z[i]:=true; end; procedure DodajElement(E: ElementZbioru; var Z: Zbior); (* Dodaje element do zbioru *) begin Z[E]:=true end; procedure UsunElement(E: ElementZbioru; var Z: Zbior); (* Usuwa element zbioru *) begin Z[E]:=false end; Funkcja PustyZbior musi sprawdza/c elementy tablicy a/z do chwili gdy znajdzie TRUE lub przebiegnie wszystkie elementy. U/zyjemy konstrukcji VAR aby zabezpieczy/c si/e przed kopiowaniem tablicy, jest to strata czasu przy du/zych zbiorach function PustyZbior(var Z: Zbior): boolean; (* TRUE gdy Z jest pusty *) var I: integer; begin powtarzaj az znajdziesz element lub miniesz koniec I:=0; PustyZbior:=true; repeat I:=I+1 until Z[I] or (I>Moc); if(I<Moc) then PustyZbior:=false; end; function CzyWZbiorze(E: ElementZbioru; Z: Zbior): boolean; (* zwraca TRUE gdy E nalezy do Z lub FALSE gdy E nie nalezy do Z *) begin CzyWZbiorze:=Z[E] end; function RowneZbiory(var Z1, Z2: Zbior): boolean; (* zwraca TRUE gdy Z1=Z2 lub FALSE gdy Z1<>Z2 *) var I: integer; begin powtarzaj az do chwili gdy znajdziesz rozne elementy lub dojdziesz do konca I:=0; RowneZbiory:=false; repeat i:=I+1 until (Z1[I] <> Z2[I]) or (I>Moc); if (I>Moc) then RowneZbiory:=true; end; procedure SumaZbiorow(var Z1, Z2, Suma: Zbior); Zwraca zbior Suma rowny sumie mnog. Z1 i Z2 var I: integer; begin for i:=1 to Moc do Suma[I]:= Z1[I] or Z2[I]; end; procedure RoznicaZbiorow(var Z1, Z2, Roznica: Zbior); Zwraca zbior Roznica rowny roznicy mnog. Z1 i Z2 var I: integer; begin for i:=1 to Moc do Roznica[I]:= Z1[I] and not Z2[I]; end; procedure IloczynZbiorow(var Z1, Z2, Iloczyn: Zbior); Zwraca zbior Iloczyn rowny przecieciu Z1 i Z2 var I: integer; begin for i:=1 to Moc do Iloczyn[I]:= Z1[I] and Z2[I]; end; function Podzbior(var Z1, Z2: Zbior): boolean; (* Zwraca TRUE jesli zbior Z1 jest podzbiorem zbioru Z2 i FALSE jesli nie jest *) var I: integer; begin Powtarzaj az do chwili gdy trafisz na element istniejacy w Z1 i nie bedzie go w Z2 lub miniesz koniec I:=0; Podzbior:=false; repeat I:=I+1 until (Z1[I] and not Z2[I]) or (I>Moc); if (I>Moc) then Podzbior:=true end; procedure WypiszZbior(var Z: Zbior); (* Wypisuje niezerowe elementy zbioru Z w postaci liczb calkowitych *) var I, Licz: integer; begin Licz:=0; writeln; for I:=1 to Moc do begin if Z[I] then begin write(I:5,', '); Licz:=Licz+1; if(Licz mod 10) =0 then writeln end end; writeln end; -------------- var S, Q: Zbior; E: ElementZbioru; begin clrscr; UtworzPusty(S); for E:=7 to 46 do DodajElement(E,S); WypiszZbior(S); writeln(PustyZbior(S)); Ci/agle musimy budowa/c zbi/or, a wlasciwie inicjowa/c go uzywajac procedury UtworzPusty. Jest to do/s/c uci/a/zliwe. Czy mo/zna to w jaki/s sposob upro/sci/c? Pomagaja tutaj obiekty! ZerujZbior(Q); DodajElement(30,Q); writeln(RowneZbiory(S,Q)); DodajElement(40,Q); writeln(RowneZbiory(S,Q)); RoznicaZbiorow(S,Q,S); WypiszZbior(S); writeln(Podzbior(Q,S)); SumaZbiorow(S,Q,S); WypiszZbior(S); writeln(Podzbior(Q,S)) end.
File translated from TEX by TTH, version 4.03.
On 16 Oct 2013, 21:50.