Een beetje aan de late kant maar je maakt het je zelf ERG lastig door met stringlists te werken.
Er is een SET operatie in Delphi die dit voor kleine sets kan (voor grotere ook geloof ik, dan gebruik je TBITS). Vergelijk de lengte van het eerste met de tweede (al zit daar de eerste ook in)
In essentie is de eerste source 3 regels, de rest is printen en variabele declaratie
Delphi Code:
program testset;
{$ifdef FPC}
{$mode delphi}
{$else}
{$apptype console}
{$endif}
uses classes,sysutils;
const setmax = 20;
Type TSomeSet = set of 0..setmax;
procedure printset(inset:TSomeSet);
var i : integer;
begin
for i:=0 to setmax do
if i in inset then
writeln(i);
end;
var
set1,set2,set3:tsomeset;
begin
set1:=[1,2,5,6,9,10];
set2:=[1,2,3,4,5,6,7,8,9,10];
// (set1+set2 = combinatie van beide sets) - (set1 * set2 = gezamelijke delen set1 en 2)
set3:=(set1+set2)-(set1*set2);
printset(set3);
readln;
end.
Delphi Code:
program testset;
{$ifdef FPC}
{$mode delphi}
{$else}
{$apptype console}
{$endif}
uses classes,sysutils;
const setmax = 20;
Type
TSomeSet = set of 0..setmax;
const
unionset : TSomeSet = [0..setmax];
function StringlistToSet(s:TStringlist):TSomeSet;
var i,j : integer;
begin
result:=[];
for i:=0 to s.count-1 do
begin
if trystrtoint(s[i],j)then
if (j>0) and (j<=setmax) then
include(result,j);
end;
end;
procedure SetToStringList(inset:TSomeSet;var OutList : TStringList);
var i : integer;
begin
if not assigned(outlist) then
exit;
outlist.clear;
for i:=0 to setmax do
if i in inset then
outlist.add(inttostr(i));
end;
procedure printStringList(OutList : TStringList);
var i : integer;
begin
if not assigned(outlist) then
exit;
outlist.clear;
for i:=0 to outlist.count-1 do
writeln(outlist[i]);
end;
// van hier
procedure printset(inset:TSomeSet);
var i : integer;
begin
for i:=0 to setmax do
if i in inset then
writeln(i);
end;
var my1,my2,my3:tstringlist;
set1,set2,set3:tsomeset;
begin
set1:=[1,2,5,6,9,10];
set2:=[1,2,3,4,5,6,7,8,9,10];
set3:=(set1+set2)-(set1*set2); // (set1+set2 = combinatie van beide sets) - (set1 * set2 = gezamelijke delen set1 en 2)
printset(set3);
// tot hier is alles wat nodig is.
// opzetten data gaat makkelijker vanaf set
my1:=tstringlist.Create;
settostringlist(set1,my1);
my2:=tstringlist.Create;
settostringlist(set2,my2);
my3:=tstringlist.Create;
// dan hetzelfde voor stringlists
set1:=stringlisttoset(my1);
set2:=stringlisttoset(my2); // converteer naar set.
set3:=(set1+set2)-(set1*set2); // bereken het verschil
settostringlist(set3,my3); // terug naar stringlist
printstringlist(my3);
readln;
end.
Bookmarks