95 lines
2.4 KiB
ObjectPascal
95 lines
2.4 KiB
ObjectPascal
program Rosetta_Set;
|
||
|
||
{$mode objfpc}{$H+}
|
||
|
||
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
|
||
cthreads, {$ENDIF} {$ENDIF}
|
||
Classes;
|
||
|
||
{$R *.res}
|
||
type
|
||
CharSet = set of char;
|
||
|
||
var
|
||
A, B, C, S: CharSet;
|
||
M: char;
|
||
|
||
function SetToString(const ASet: CharSet): string;
|
||
var
|
||
J: char;
|
||
begin
|
||
Result := '';
|
||
// Test all chars
|
||
for J in char do
|
||
// If the char is in set, add to result
|
||
if J in ASet then
|
||
Result := Result + J + ', ';
|
||
// Clear the result
|
||
if Result > '' then
|
||
Delete(Result, Length(Result) - 1, 2);
|
||
end;
|
||
|
||
procedure PrintSet(const ASet: CharSet; const ASetName: string;
|
||
const ATitle: string = '');
|
||
begin
|
||
if ATitle > '' then
|
||
WriteLn(ATitle);
|
||
WriteLn(ASetName, ' = [', SetToString(ASet), ']', #10);
|
||
end;
|
||
|
||
procedure ShowEqual(const ASetA, ASetB: CharSet; const ASetNameA, ASetNameB: string);
|
||
begin
|
||
WriteLn(ASetNameA, ' = [', SetToString(ASetA), ']');
|
||
WriteLn(ASetNameB, ' = [', SetToString(ASetB), ']');
|
||
if ASetA = ASetB then
|
||
WriteLn(ASetNameA, ' = ', ASetNameB)
|
||
else
|
||
WriteLn(ASetNameA, ' <> ', ASetNameB);
|
||
end;
|
||
|
||
|
||
begin
|
||
// Set Creation
|
||
A := ['A', 'B', 'C', 'D', 'E', 'F'];
|
||
B := ['E', 'F', 'G', 'H', 'I', 'J'];
|
||
PrintSet(A, 'A', 'Set Creation');
|
||
PrintSet(B, 'B');
|
||
|
||
// Test m ∈ S -- "m is an element in set S"
|
||
M := 'A';
|
||
if M in A then
|
||
WriteLn('"A" is in set A');
|
||
|
||
// A ∪ B -- union; a set of all elements either in set A or in set B.
|
||
S := A + B;
|
||
PrintSet(S, 'S', 'S = A U B -- union; a set of all elements either in set A or in set B.');
|
||
|
||
// A ∩ B -- intersection; a set of all elements in both set A and set B.
|
||
S := A * B;
|
||
PrintSet(S, 'S',
|
||
'S = A ∩ B -- intersection; a set of all elements in both set A and set B.');
|
||
|
||
// A \ B -- difference; a set of all elements in set A, except those in set B.
|
||
S := A - B;
|
||
PrintSet(S, 'S',
|
||
'S = A \ B -- difference; a set of all elements in set A, except those in set B.');
|
||
|
||
// A ⊆ B -- subset; true if every element in set A is also in set B.
|
||
Writeln('A ⊆ B -- subset; true if every element in set A is also in set B.');
|
||
if A <= B then
|
||
WriteLn('A in B')
|
||
else
|
||
Writeln('A is not in B');
|
||
Writeln;
|
||
//A = B -- equality; true if every element of set A is in set B and vice-versa.
|
||
Writeln('A = B -- equality; true if every element of set A is in set B and vice-versa.');
|
||
|
||
ShowEqual(A, B, 'A', 'B');
|
||
S := A * B;
|
||
C := ['E', 'F'];
|
||
ShowEqual(S, C, 'S', 'C');
|
||
|
||
readln;
|
||
|
||
end.
|