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.
|