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.