Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Buchstaben zählen [gelöst]


blackbirdXXX - Di 03.02.04 17:44
Titel: Buchstaben zählen [gelöst]
Ich habe ein kleines Problem. Ich würde gerne Strings "hochzählen". Das heißt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
AAAA
AAAB
AAAC
AAAD
AAAE
...
AAAY
AAAZ
AABA
AABB
AABC
...


Weiß jemand wie ich das hinkriege?
Damit will ich dann ein Memo füllen.


KidPaddle - Di 03.02.04 18:08

So aus dem Stehgreif und ohne Prüfung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure IncString(var Data : String; Stelle : Integer = -1);
var
  sLinks  : String;
  sRechts : String;
  sStelle : Char;
begin
  if (Stelle = -1then Stelle := Length(Data);
  if (Stelle = 0then begin
    Data := 'A' + Data;
    Exit;
  end;
  sLinks  := Copy(Data,  1, Stelle - 1);
  sStelle := Copy(Data, Stelle, 1);
  sRechts := Copy(Data, Stelle+1, Length(Data));
  if (sStelle >= 'Z'then begin
    sStelle := 'A';
    Data    := sLinks + sStelle + sRechts;
    IncString(Data, Stelle - 1);
  end else begin
    sStelle := CHAR(ORD(sStelle) + 1)
    Data    := sLinks + sStelle + sRechts;
  end;
end;

// oder

procedure IncString(var Data : String);
var
  cArray  : array[0..255of char;
  iLoop   : Integer;
begin
  StrPCopy(cArray, Data);
  for iLoop := (StrLen(cArray) - 1downto 0 do begin
    if (cArray[iLoop] >= 'Z'then begin
      cArray[iLoop] := 'A';
      if (iLoop > 0then begin
        cArray[iLoop - 1] := CHR(ORD(cArray[iLoop - 1]) + 1);
      end else begin
        raise Exception.Create('Überlauf!');
      end;
    end else begin
      cArray[iLoop] := CHR(ORD(cArray[iLoop]) + 1);
    end;
  end;
  Data := StrPas(cArray);
end;


KidPaddle


Christian S. - Di 03.02.04 18:09

Hi!

So geht es:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);
VAR i,k : Integer;
    temp : String;
begin
  memo1.lines.clear;

  //1000 Zahlen in Buchstaben ausdrücken
  for i:=0 to 999 do
  begin
    k:=i;
    temp := '';

    //"Ziffern" berechnen
    repeat
      //Kann man sich leicht klar machen, wenn man das mal mit dem Dezimalsystem macht (s.u.)
      temp := Chr(k mod 26 + 65) + temp;
      k := k div 26;
    until k = 0;

    //Auffüllen
    while Length(temp) < 4 do temp := 'A' + temp;

    Memo1.Lines.Add(IntToStr(i) + ' : '+temp);
  end;
end;


So, kurz noch zur Erklärung anhand unseres Dezimalsystems. Nehmen wir an, ich möchte aus der Zahl 135 die Ziffern herausbekommen.

Dann ist 135 mod 10 = 5, also die letzte Ziffer.
135 div 10 ergibt 13.
13 mod 10 ergibt 3, also die vorletzte Ziffer.
13 div 10 ergibt 1.
1 mod 10 ergibt 1, also die erste Ziffer.

Und so funktioniert es hier auch, nur das hier die Basis 26 verwendet wird und aufgrund des Zeichensatzes eine Verschiebung um 65 hinzukommt.

Mfg
Peter


blackbirdXXX - Di 03.02.04 18:25

@Peter Lustig. Das funzt. Aber was ist wenn ich z.B.: Die "Zahl" ADFE habe und nun bis ADGA zählen will? Wie kann ich das machen?


KidPaddle - Di 03.02.04 18:27

Sorry, war auf dem falschen Gedankenweg. Meine Funktionen zählen nur einen beliebigen String hoch.

KidPaddle


Christian S. - Di 03.02.04 18:34

Hallo!

@blackBirdXXX:
Du musst den Anfang der Funktion so abändern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
VAR i,k : Integer;
    temp : String;
    start, stopp : String;
    iStart, iStopp : Integer;
begin
  start := 'ADFE';
  stopp := 'ADGA';
  iStart:=0; iStopp:=0;

  k := Round(intpower(26, Length(start)-1));
  for i:= 1 TO Length(start) do
  begin
    iStart := iStart + (Ord(start[i])-65)*k;
    k := k div 26;
  end;

  k := Round(intpower(26, Length(stopp)-1));
  for i:= 1 TO Length(stopp) do
  begin
    iStopp := iStopp + (Ord(stopp[i])-65)*k;
    k := k div 26;
  end;

  memo1.lines.clear;

  for i:=iStart to iStopp do


Dort berechne ich einfach aus den Buchstaben wieder die Zahlenwerte in Dezimaldarstellung.

MfG
Peter


blackbirdXXX - Di 03.02.04 19:22

Danke. Hat mir sehr geholfen.