http://www.rosettacode.org/wiki/Set#FreeBASIC
But the bit vector way is superior IMO.
Code: Select all
'Set Routines
'clear/initialise set
SUB set_clear(s() AS boolean)
DIM i AS integer
FOR i = lbound(s) TO ubound(s)
s(i) = false
NEXT i
END SUB
'add element to a set
SUB set_incl(n AS integer, s() AS boolean)
s(n) = true
END SUB
'remove element from set
SUB set_excl(n AS integer, s() AS boolean)
s(n) = false
END SUB
'Is an element in the set?
FUNCTION set_in(n AS integer, s() AS boolean) AS boolean
set_in = s(n)
END FUNCTION
'cardinality (return number of elements in set)
FUNCTION set_card(s() AS boolean) AS integer
DIM n AS integer,i AS integer
n = 0
FOR i = lbound(s) TO ubound(s)
IF s(i) = true THEN
n += 1
END IF
NEXT i
set_card = n
END FUNCTION
'intersection
SUB set_inter(s1() AS boolean,s2() AS boolean,result() AS boolean)
DIM i AS integer
FOR i = lbound(s1) TO ubound(s1)
IF s1(i) and s2(i) THEN
result(i) = true
END IF
NEXT i
END SUB
'union
SUB set_union(s1() AS boolean,s2() AS boolean,result() AS boolean)
DIM i AS integer
FOR i = lbound(s1) TO ubound(s1)
IF s1(i) or s2(i) THEN
result(i) = true
END IF
NEXT i
END SUB
'difference (s1 - s2)
SUB set_diff(s1() AS boolean,s2() AS boolean,result() AS boolean)
DIM i AS integer
FOR i = lbound(s1) TO ubound(s1)
IF s1(i) and not s2(i) THEN
result(i) = true
END IF
NEXT i
END SUB
'symmetric difference (result is union(s1,s2) - inter(s1,s2))
SUB set_symdiff(s1() AS boolean,s2() AS boolean,result() AS boolean)
DIM i AS integer
FOR i = lbound(s1) TO ubound(s1)
IF s1(i) xor s2(i) THEN
result(i) = true
END IF
NEXT i
END SUB
' are the sets equal?
FUNCTION set_isequal(s1() AS boolean,s2() AS boolean) AS boolean
DIM i AS integer
DIM equal AS boolean
equal = true
FOR i = lbound(s1) TO ubound(s1)
IF not(s1(i) eqv s2(i)) THEN
equal = false
EXIT FOR
END IF
NEXT i
set_isequal = equal
END FUNCTION
'Is set s1 a subset of set s2?
FUNCTION set_issubset(s1() AS boolean,s2() AS boolean) AS boolean
DIM subset AS boolean
DIM i AS integer
subset = true
FOR i = lbound(s1) TO ubound(s1)
IF not(s1(i) imp s2(i)) THEN
subset = false
EXIT FOR
END IF
NEXT i
set_issubset = subset
END FUNCTION
'show set
SUB set_show(s() AS boolean)
DIM i AS integer
FOR i = lbound(s) TO ubound(s)
IF s(i) = true THEN
print i;
END IF
NEXT i
print
END SUB
Code: Select all
#include "sets.bi"
const maxset = 10
DIM A(maxset) AS boolean
DIM B(maxset) AS boolean
DIM C(maxset) AS boolean
DIM result(maxset) AS boolean
DIM i AS integer
' A = {1,2,3,4,5,6,7}
' B = {4,5,6}
' C = {6,7,8,9}
' fill sets
FOR i = 1 TO 7: set_incl(i,A()): NEXT i
FOR i = 4 TO 6: set_incl(i,B()): NEXT i
FOR i = 6 TO 9: set_incl(i,C()): NEXT i
'show sets
print "A: ";
set_show(A())
print "B: ";
set_show(B())
print "C: ";
set_show(C())
'intersection
print "Intersection of A & B: ";
set_inter(A(),B(),result())
set_show(result())
'union
print "Union of B & C: ";
set_union(B(),C(),result())
set_show(result())
'difference between B & C (B - C)
set_clear(result())
print "Difference between C & A (C - A): ";
set_diff(C(),A(),result())
set_show(result())
'symmetric difference between A & C
set_clear(result())
print "Symmetric difference between A & C: ";
set_symdiff(A(),C(),result())
set_show(result())
'subset; is C a subset of A?
print "Is C a subset of A? ";set_issubset(C(),A())
print "Is B a subset of A? ";set_issubset(B(),A())
' how many elements in A?
print "Set A has";set_card(A());" elements"
' remove elements 1..5 from A
FOR i = 1 TO 5
set_excl(i,A())
NEXT i
print "Removing elements 1..5 from A..."
print "A: ";
set_show(A())
' add elements 8,9 to A
print "Adding elements 8 & 9 to A..."
print "A: ";
set_incl(8,A())
set_incl(9,A())
set_show(A())
'equal sets
print "Does A = C?: ";set_isequal(A(),C())
print "Does A = B?: ";set_isequal(A(),B())