Autor Beitrag
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Di 03.02.04 17:44 
Ich habe ein kleines Problem. Ich würde gerne Strings "hochzählen". Das heißt:
ausblenden 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.

_________________
Klein, schwarz und ärgert Techniker? Jumper!


Zuletzt bearbeitet von blackbirdXXX am Di 03.02.04 19:23, insgesamt 1-mal bearbeitet
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Di 03.02.04 18:08 
So aus dem Stehgreif und ohne Prüfung:

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 03.02.04 18:09 
Hi!

So geht es:
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
blackbirdXXX Threadstarter

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: 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?

_________________
Klein, schwarz und ärgert Techniker? Jumper!
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Di 03.02.04 18:27 
Sorry, war auf dem falschen Gedankenweg. Meine Funktionen zählen nur einen beliebigen String hoch.

KidPaddle
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 03.02.04 18:34 
Hallo!

@blackBirdXXX:
Du musst den Anfang der Funktion so abändern:
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
blackbirdXXX Threadstarter

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Di 03.02.04 19:22 
Danke. Hat mir sehr geholfen.

_________________
Klein, schwarz und ärgert Techniker? Jumper!