unit Kombination;
interface
uses
Classes;
type
TKombination =
record
private
FValue: Integer;
FAnzahlStellen: Integer;
FKleinsteZiffer: Integer;
FGroesteZiffer: Integer;
function MaxValue: Integer;
function ZiffernAnzahl: Integer;
function ZiffernWert(AIndex: Integer): Integer;
public
constructor Create(AnzahlStellen, KleinsteZiffer, GroesteZiffer: Integer);
function Inc: Boolean;
function GetZiffer(AIndex: Integer): Integer;
end;
procedure Test(AItemList: TStrings);
implementation
uses
SysUtils, Math;
constructor TKombination.Create(AnzahlStellen, KleinsteZiffer, GroesteZiffer: Integer);
begin
FValue := 0;
FAnzahlStellen := AnzahlStellen;
FKleinsteZiffer := KleinsteZiffer;
FGroesteZiffer := GroesteZiffer;
end;
function TKombination.MaxValue: Integer;
begin
Result := ZiffernWert(FAnzahlStellen) - 1;
end;
function TKombination.ZiffernAnzahl: Integer;
begin
Result := FGroesteZiffer - FKleinsteZiffer + 1;
end;
function TKombination.ZiffernWert(AIndex: Integer): Integer;
begin
Result := Trunc(Power(ZiffernAnzahl, AIndex));
end;
function TKombination.Inc: Boolean;
begin
Result := FValue < MaxValue;
if Result
then
FValue := FValue + 1;
end;
function TKombination.GetZiffer(AIndex: Integer): Integer;
begin
if (AIndex < 0)
or (AIndex >= FAnzahlStellen)
then
raise Exception.CreateFmt('
GetZiffer(%d) Index außerhalb des gültigen Wertebereichs', [AIndex]);
Result := (FValue
div ZiffernWert(AIndex))
mod ZiffernAnzahl;
Result := Result + FKleinsteZiffer;
end;
procedure Test(AItemList: TStrings);
var
lKombination: TKombination;
s:
String;
i, n: Integer;
begin
AItemList.Clear;
lKombination := TKombination.Create(3, 1, 15);
repeat
s := '
';
for i := 2
downto 0
do
begin
n := lKombination.GetZiffer(i);
if n < 10
then
s := s + IntToStr(n)
else
s := s + Char(Ord('
A') + n - 10);
end;
AItemList.Add(s);
until not lKombination.Inc;
end;
end.