Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

Re: "Schlossknack"-Algorithmus

  Alt 19. Apr 2007, 19:38
Es geht auch ohne Rekursion. Man muss sich nur überlegen, was passiert,
wenn zu einer "Zahl" der Wert 1 addiert wird.
Es kann an jeder Stelle einen Übertrag geben.

Delphi-Quellcode:
{**************************************************************************
* NAME:    IncrementWithMask
* DESC:    erhöht eine Nummer (die als String vorliegt) um Eins
*          Dabei darf "Number" an bestimmten Stellen auch Buchstaben enthalten
*          "Mask" bestimmt, an welchen Positionen Ziffern oder Buchstaben erlaubt sind
* Mask:  0 = Ziffern    (0..9)
*        A = Buchstaben  (A..Z)
*        Z = Ziffern & Buchstaben
*        H = Hex-Ziffern  (0..9, A..F)
*          = diese Stelle bleibt
* PARAMS:  [-]
* RESULT:  die erhöhte Nummer
*************************************************************************}

function IncrementWithMask(const Number, Mask:string):string;

   function IncrementDigit(x:PChar; m:Char):Boolean;
   var
      c : Char;
   begin
      Result := False;
      case m of
         '0':
         begin
            c := Succ(x^);
            if c > '9then
            begin
               c := '0';
               Result := True;
            end;
            x^ := c;
         end;
         'A':
         begin
            c := Succ(x^);
            if c > 'Zthen
            begin
               c := 'A';
               Result := True;
            end;
            x^ := c;
         end;
         'Z':
         begin
            c := x^;
            if c = '9then
               c := 'A'
            else if c = 'Zthen
            begin
               c := '0';
               Result := True;
            end
            else
               c := Succ(c);
            x^ := c;
         end;

         'H':
         begin
            c := x^;
            if c = '9then
               c := 'A'
            else if c = 'Fthen
            begin
               c := '0';
               Result := True;
            end
            else
               c := Succ(c);
            x^ := c;
         end;

         ' ':
            ;
      else
         raise Exception.CreateFmt('IncrementWithMask(%s, %s) - invalid Mask', [Number, Mask]);
      end;
   end;

var
   i : Integer;
begin
   Result := Number;
   for i:=length(Result) downto 1 do
   begin
      if not IncrementDigit(@result[i], Mask[i]) then
         Break;
   end;
end;
Beispiel:
Delphi-Quellcode:
var
   s, m : string;
begin
  s:= '0008899';
  m:= '0000000';
  s := IncrementWithMask(s, m); // s enthält nun '0008900'
Andreas
  Mit Zitat antworten Zitat