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 = -1) then Stelle := Length(Data); if (Stelle = 0) then 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;
procedure IncString(var Data : String); var cArray : array[0..255] of char; iLoop : Integer; begin StrPCopy(cArray, Data); for iLoop := (StrLen(cArray) - 1) downto 0 do begin if (cArray[iLoop] >= 'Z') then begin cArray[iLoop] := 'A'; if (iLoop > 0) then 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;
for i:=0 to 999 do begin k:=i; temp := '';
repeat temp := Chr(k mod 26 + 65) + temp; k := k div 26; until k = 0;
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!