home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system1 / sets.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  3KB  |  108 lines

  1. Syntax10.Scn.Fnt
  2. MODULE Sets;
  3. IMPORT Texts;
  4. CONST size* = 32;
  5. PROCEDURE Clear*(VAR s: ARRAY OF SET);
  6.     VAR i: INTEGER;
  7. BEGIN
  8.     i := 0; WHILE i < LEN(s) DO s[i] := {}; INC(i) END
  9. END Clear;
  10. PROCEDURE Fill*(VAR s: ARRAY OF SET);
  11.     VAR i: INTEGER;
  12. BEGIN
  13.     i := 0; WHILE i < LEN(s) DO s[i] := {0 .. size-1}; INC(i) END
  14. END Fill;
  15. PROCEDURE Incl*(VAR s: ARRAY OF SET; x: INTEGER);
  16. BEGIN INCL(s[x DIV size], x MOD size)
  17. END Incl;
  18. PROCEDURE Excl*(VAR s: ARRAY OF SET; x: INTEGER);
  19. BEGIN EXCL(s[x DIV size], x MOD size)
  20. END Excl;
  21. PROCEDURE In*(VAR s: ARRAY OF SET; x: INTEGER): BOOLEAN;
  22. BEGIN RETURN x MOD size IN s[x DIV size]
  23. END In;
  24. PROCEDURE Includes*(VAR s1, s2: ARRAY OF SET): BOOLEAN;
  25.     VAR i: INTEGER;
  26. BEGIN
  27.     i := 0;
  28.     WHILE i < LEN(s1) DO
  29.         IF s1[i] + s2[i] # s1[i] THEN RETURN FALSE END;
  30.         INC(i)
  31.     END;
  32.     RETURN TRUE;
  33. END Includes;
  34. PROCEDURE Elements*(VAR s: ARRAY OF SET; VAR lastElem: INTEGER): INTEGER;
  35.     VAR i, n, max: INTEGER;
  36. BEGIN
  37.     i := 0; n := 0; max := SHORT(LEN(s)) * size;
  38.     WHILE i < max DO
  39.         IF (i MOD size) IN s[i DIV size] THEN INC(n); lastElem := i END;
  40.         INC(i)
  41.     END;
  42.     RETURN n
  43. END Elements;
  44. PROCEDURE Empty*(VAR s: ARRAY OF SET): BOOLEAN;
  45.     VAR i: INTEGER;
  46. BEGIN
  47.     i := 0;
  48.     WHILE i < LEN(s) DO
  49.         IF s[i] # {} THEN RETURN FALSE END;
  50.         INC(i)
  51.     END;
  52.     RETURN TRUE
  53. END Empty;
  54. PROCEDURE Equal*(VAR s1, s2: ARRAY OF SET): BOOLEAN;
  55.     VAR i: INTEGER;
  56. BEGIN
  57.     i := 0;
  58.     WHILE i < LEN(s1) DO
  59.         IF s1[i] # s2[i] THEN RETURN FALSE END;
  60.         INC(i)
  61.     END;
  62.     RETURN TRUE
  63. END Equal;
  64. PROCEDURE Different*(VAR s1, s2: ARRAY OF SET): BOOLEAN;
  65.     VAR i: INTEGER;
  66. BEGIN
  67.     i := 0;
  68.     WHILE i < LEN(s1) DO
  69.         IF s1[i] * s2[i] # {} THEN RETURN FALSE END;
  70.         INC(i)
  71.     END;
  72.     RETURN TRUE
  73. END Different;
  74. PROCEDURE Unite*(VAR s1, s2: ARRAY OF SET);
  75.     VAR i: INTEGER;
  76. BEGIN
  77.     i := 0; WHILE i < LEN(s1) DO s1[i] := s1[i] + s2[i]; INC(i) END
  78. END Unite;
  79. PROCEDURE Differ*(VAR s1, s2: ARRAY OF SET);
  80.     VAR i: INTEGER;
  81. BEGIN
  82.     i := 0; WHILE i < LEN(s1) DO s1[i] := s1[i] - s2[i]; INC(i) END
  83. END Differ;
  84. PROCEDURE Intersect*(VAR s1, s2, s3: ARRAY OF SET);
  85.     VAR i: INTEGER;
  86. BEGIN
  87.     i := 0; WHILE i < LEN(s1) DO s3[i] := s1[i] * s2[i]; INC(i) END
  88. END Intersect;
  89. PROCEDURE Print*(VAR f: Texts.Writer; s: ARRAY OF SET; w, indent: INTEGER);
  90.     VAR col, i, max: INTEGER;
  91. BEGIN
  92.     i := 0; col := indent; max := SHORT(LEN(s)) * size;
  93.     Texts.Write(f, "{");
  94.     WHILE i < max DO
  95.         IF In(s, i) THEN
  96.             IF col + 4 > w THEN
  97.                 Texts.WriteLn(f); 
  98.                 col := 0; WHILE col < indent DO Texts.Write(f, " "); INC(col) END
  99.             END;
  100.             Texts.WriteInt(f, i, 3); Texts.Write(f, ",");
  101.             INC(col, 4)
  102.         END;
  103.         INC(i)
  104.     END;
  105.     Texts.Write(f, "}")
  106. END Print;
  107. END Sets.
  108.