| Autor |
Beitrag |
Chatfix
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mo 11.06.07 12:09
Hallo,
für eine neue Funktion in meinem FileRenamer brauche ich mal einen Denkanstoss. Leider hat meine Suche im Internet nicht viel dazu ergeben.
Ich habe schon mit Schleifen versucht, aber irgendwie schaff ich das nur wenn ich sie manuell begrenze.
Die Nummerierung soll wie folgt aussehen.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| AAA AAB AAC ... ABA ABB ABC ... BAA BAB BAC ... ZZZ |
Die Schwierigkeit liegt darin das die Anzahl der Stellen variieren (je nach dem wieviele Anzahl an Nummern man brauch).
Bei weniger als 26 Nummern brauch man einen Buchstaben. Bei mehr als 26 und weniger als 676 benötigt man zwei Buchstaben usw.
Also z.b.
Quelltext
oder
Quelltext
Hat einer eine Idee wie ich das Lösen könnte?
Es muss auch nciht unbedingt eine Komplette Liste erzeugt werden, mir würde es auch reichen eine bestimmte Nummer zu erzeugen.
So in der Art:
Delphi-Quelltext 1: 2: 3: 4: 5:
| GetCharIndex(Nummer: Integer, Gesamt: Integer);
GetCharIndex(28, 100) -> BB GetCharIndex(3, 100) -> AC GetCharIndex(3, 10) -> C |
So in der Art...
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Mo 11.06.07 12:53
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function LetterDigits (z : Integer) : String; begin Result := ''; while (z div 26) > 0 do begin Result := Result + chr(z div 26 + 64); z := z -26 * (z div 26); end; if z mod 26 <> 0 then Result := Result + chr(z mod 26 + 64); end; |
Nicht getestet, aber so ähnlich sollte es gehen !
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Mo 11.06.07 13:10
Das ist doch offensichtlich mit einem Logarithmus einfach zu lösen.
Angenommen du hast 100 Dateien, dann nimmst du den Logarithmus von 100 zur Basis 26 und erhöhst auf die nächsthöhere natürliche Zahl.
log26 100 = 1,4134541847506568514601793082003 => Nächsthöhere natürliche Zahl 2
log26 800 = 2,0516923454107463122787426606599 => 3 (s.o.)
Dadurch weißt du wieviele Buchstaben du brauchen wirst.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mo 11.06.07 13:10
OK, ich werde mal versuchen deine Funktion zu erweitern.
Zur Zeit klappts noch nicht ganz. Ansich ganz gut, aber gerade das teilweise Buchstaben doppelt ausgegeben werden ist nicht so gut.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| A B C ... Z A AA AB .. B BA BB |
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.06.07 13:12
Chatfix hat folgendes geschrieben: | Leider hat meine Suche im Internet nicht viel dazu ergeben.
[...]
Delphi-Quelltext 1: 2: 3: 4: 5:
| GetCharIndex(Nummer: Integer, Gesamt: Integer);
GetCharIndex(28, 100) -> BB GetCharIndex(3, 100) -> AC GetCharIndex(3, 10) -> C | |
Ist das nicht praktisch Umrechnen in base26 mit dem Alphabet als Ziffern?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mo 11.06.07 13:24
Wie würde das Umrechnen in Base26 funktionieren?
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.06.07 13:45
Moin!
Genauso wie das Wandeln ins z.B. Hexadezimalsystem, nur eben zur Basis 26 und mit 0=A, 1=B, etc. und führende Nullen sind bei dir führende As (also auch Null, aber eben in deinem Zahlensystem).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 11.06.07 14:14
Hab mal unter zuhilfenahme von de.wikipedia.org/wik...ahlen_in_Oktalzahlen die Funktion von Chrisw ein wenig umgebaut:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function DecTo26 (z : Integer) : String; begin Result := ''; repeat Result := chr(round(frac(z / 26)*26+65))+result; z := (z div 26); until (z <= 0); end; |
Die Funktion beginnt bei 0=A, das ist wichtig weil 26 ja = 10 bzw. BA ist.
Das Problem, dass du gerne hättest das immer die gleiche Anzahl Buchstaben angezeigt wird habe ich noch nicht gelöst.
// Edit: jetzt müsste alles stimmen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function DecTo26 (z : Integer; digits:Integer=0) : String; var n: Integer; begin dec(z); Result := ''; repeat Result := chr(round(frac(z / 26)*26+65))+result; z := (z div 26); until (z <= 0); if (digits > length(result)) then for n := 1 to (digits-length(result)) do result := 'A'+result; end; |
Man kann jetzt optional die Anzahl der Stellen angeben, z.B. 3, so dass 1=AAA ergibt. Die Zählweise beginnt jetzt bei 1=A, kann aber leicht geändert werden (siehe Quelltext)
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Zuletzt bearbeitet von Tilman am Mo 11.06.07 14:24, insgesamt 1-mal bearbeitet
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mo 11.06.07 14:23
Erstenmal vielen Dank.
Ich habe auch versucht mir Wikipedia die Umrechnung zu schreiben, aber du warst schneller und es funktioniert super, vielen Dank!
Jetzt hab ich erstmal wieder eine Grundlage um weiter zu machen 
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.06.07 14:29
Moin!
Mein Vorschlag:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function DecToBase26(z: Integer; const Size: Integer = 0): String; begin Result := ''; repeat Result := Chr((z mod 26) +65) +Result; z := z div 26; until (z = 0); if (Size > 0) then while (Length(Result) < Size) do Result := 'A' +Result; end; |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 11.06.07 14:35
Naja, meinem Verkopften Round-Frac-/ gegenüber würd ich denn auch deine Funktion bevorzugen ^^ aber Funktionell sind beide wohl gleichwertig 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 11.06.07 14:50
Hallo,
kleine Veränderung zu Narses Code, Verbesserung??
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function DecToBase26(z: Integer; const Size: Integer = 0): String; begin Result := ''; repeat Result := Chr((z mod 26) +65) +Result; z := z div 26; until (z = 0); Result := StringOfChar('A',Size-Length(Result)) + Result; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.06.07 15:04
Moin!
Lannes hat folgendes geschrieben: | kleine Veränderung zu Narses Code, Verbesserung?? |
Yip!
(ist aus Speicherverbrauchsgründen definitiv besser; hatte es aber bei vermuteten "kleinen" Stringlängen nicht als soo kritisch eingestuft)
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 11.06.07 15:06
Ich bins nochmal
Jetzt sollte es wie im ersten Post gewünscht funzen! (man muss abr leider noch math in die uses-Klausel einbinden)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function DecToBase26(z: Integer; Max: Integer = 0): String; var digits: Integer; begin digits := 0; repeat inc(digits); until (power(26,digits)) >= max;
dec(z); Result := ''; repeat Result := Chr((z mod 26) +65) +Result; z := z div 26; until (z = 0); Result := StringOfChar('A',Digits-Length(Result)) + Result; end; |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Mo 11.06.07 19:39
Darf ich dir vorschlagen, dass du deinen Logarithmus-Workaround mit dem richtigen Logarithmus ersetzt?
Aus
Delphi-Quelltext 1: 2: 3: 4:
| digits := 0; repeat inc(digits); until (power(26,digits)) >= max; |
wird dann
Delphi-Quelltext 1:
| Digits := Ceil(LogN(26, Max)); |
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 11.06.07 20:59
derDoc hat folgendes geschrieben: | Darf ich dir vorschlagen, dass du deinen Logarithmus-Workaround mit dem richtigen Logarithmus ersetzt?
|
nö, hast du ja schon gemacht 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mo 11.06.07 21:54
Ich werde mir das morgen anschauen. Vielen Dank nochmal an alle!
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Di 12.06.07 15:16
Sehr vielen Dank!
Ich nutze jetzt folgende Funktion
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function DecToBase26(z: Integer; Max: Integer = 1): String; var Digits: Integer; begin Digits := Ceil(LogN(26, Max)); Dec(z); Result := ''; repeat Result := Chr((z mod 26) + 65) + Result; z := z div 26; until (z = 0); Result := StringOfChar('A', Digits - Length(Result)) + Result; end; |
Ich habe den Default-Wert von Max auf 1 gesetzt, da Null ja nicht geht. Bei Null Elementen die nummeriert werden sollen kommt ja eh keine Nummerierung raus.
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Di 12.06.07 16:45
Chatfix hat folgendes geschrieben: | Sehr vielen Dank!
Ich habe den Default-Wert von Max auf 1 gesetzt, da Null ja nicht geht. Bei Null Elementen die nummeriert werden sollen kommt ja eh keine Nummerierung raus. |
Ich hab jetzt den letzten stand des Quelltextes nicht geprüft, aber ursprünglich hatte ich den default Wert auch nur deshalb auf 0 gesetzt, weil die Funktion dann einfach das korrekte Ergebnis, ohne führende A ("Nullen"), ausgab.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Chatfix 
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: Mi 13.06.07 11:52
Kann man das ganze auch wieder umrechnen?
A = 1
C = 3
AA = 27
usw...
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
|