Autor Beitrag
Chatfix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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.

ausblenden 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.

ausblenden Quelltext
1:
2:
3:
AA
AB
AC


oder

ausblenden Quelltext
1:
2:
3:
AAAA
AAAB
AAAC


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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mo 11.06.07 12:53 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 11.06.07 13:12 
user profile iconChatfix hat folgendes geschrieben:
Leider hat meine Suche im Internet nicht viel dazu ergeben.
[...]
ausblenden 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? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Chatfix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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);   // Damit A=1
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 11.06.07 14:29 
Moin!

Mein Vorschlag: ;)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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 :D

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 11.06.07 14:50 
Hallo,

kleine Veränderung zu user profile iconNarses Code, Verbesserung??
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 11.06.07 15:04 
Moin!

user profile iconLannes hat folgendes geschrieben:
kleine Veränderung zu user profile iconNarses Code, Verbesserung??

Yip! :zustimm:

(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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 11.06.07 15:06 
Ich bins nochmal :D
Jetzt sollte es wie im ersten Post gewünscht funzen! (man muss abr leider noch math in die uses-Klausel einbinden)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: Mo 11.06.07 19:39 
Darf ich dir vorschlagen, dass du deinen Logarithmus-Workaround mit dem richtigen Logarithmus ersetzt?

Aus
ausblenden Delphi-Quelltext
1:
2:
3:
4:
digits := 0;
repeat
  inc(digits);
until (power(26,digits)) >= max;

wird dann
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 11.06.07 20:59 
user profile iconderDoc hat folgendes geschrieben:
Darf ich dir vorschlagen, dass du deinen Logarithmus-Workaround mit dem richtigen Logarithmus ersetzt?

nö, hast du ja schon gemacht :wink:

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Chatfix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: Di 12.06.07 15:16 
Sehr vielen Dank!

Ich nutze jetzt folgende Funktion

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 12.06.07 16:45 
user profile iconChatfix 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: 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