59 lines
1.9 KiB
Text
59 lines
1.9 KiB
Text
# symetric difference using associative arrays to represent the sets #
|
|
# include the associative array code for string keys and values #
|
|
PR read "aArray.a68" PR
|
|
|
|
# adds the elements of s to the associative array a, #
|
|
# the elements will have empty strings for values #
|
|
OP // = ( REF AARRAY a, []STRING s )REF AARRAY:
|
|
BEGIN
|
|
FOR s pos FROM LWB s TO UPB s DO
|
|
a // s[ s pos ] := ""
|
|
OD;
|
|
a
|
|
END # // # ;
|
|
# returns an AARRAY containing the elements of a that aren't in b #
|
|
OP - = ( REF AARRAY a, REF AARRAY b )REF AARRAY:
|
|
BEGIN
|
|
REF AARRAY result := INIT HEAP AARRAY;
|
|
REF AAELEMENT e := FIRST a;
|
|
WHILE e ISNT nil element DO
|
|
IF NOT ( b CONTAINSKEY key OF e ) THEN
|
|
result // key OF e := value OF e
|
|
FI;
|
|
e := NEXT a
|
|
OD;
|
|
result
|
|
END # - # ;
|
|
# returns an AARRAY containing the elements of a and those of b #
|
|
# i.e. in set terms a UNION b #
|
|
OP + = ( REF AARRAY a, REF AARRAY b )REF AARRAY:
|
|
BEGIN
|
|
REF AARRAY result := INIT HEAP AARRAY;
|
|
REF AAELEMENT e := FIRST a;
|
|
WHILE e ISNT nil element DO
|
|
result // key OF e := value OF e;
|
|
e := NEXT a
|
|
OD;
|
|
e := FIRST b;
|
|
WHILE e ISNT nil element DO
|
|
result // key OF e := value OF e;
|
|
e := NEXT b
|
|
OD;
|
|
result
|
|
END # + # ;
|
|
|
|
BEGIN # task #
|
|
# construct the associative arrays for the task #
|
|
REF AARRAY a := INIT LOC AARRAY;
|
|
REF AARRAY b := INIT LOC AARRAY;
|
|
a // []STRING( "John", "Bob", "Mary", "Serena" );
|
|
b // []STRING( "Jim", "Mary", "John", "Bob" );
|
|
# find and show the symetric difference of a and b #
|
|
REF AARRAY c := ( a - b ) + ( b - a );
|
|
REF AAELEMENT e := FIRST c;
|
|
WHILE e ISNT nil element DO
|
|
print( ( " ", key OF e ) );
|
|
e := NEXT c
|
|
OD;
|
|
print( ( newline ) )
|
|
END
|