Forum | | | | - Seite 1 - |
| Julian Schmidt | Hallo, ich versuche gerade Zahlen in eine Buchstabenreihe zu konvertieren. Diese sollen ein ähnliches Format haben wie in Excel.
A,B,C,D,E... AA,AB,AC,AD,AE... BA,BB,BC,BE... ZA,ZB,ZC... AAA,AAB... ABA,ABB... ZZY, ZZZ... AAAA, AAAB... Das es bis auf zwei Buchstabenreihen funktioniert habe ich bereits hingekommen. Mir fehlt aber irgendwie ein Ansatz wie man das weiter hoch rechnen kann. Ich bräuchte auch eine Gegen-Funktion.
cls
var lbox&=Create("ListBox", %hwnd, 0, 0, 0, width(%hwnd), height(%hwnd))
whileloop 26*30
AddString(lbox&,LetterOfNumber(&loop,1))
Endwhile
while 1
waitinput
case iskey(27) : end
Settext %hwnd,Str$(GetCurSel(lbox&))+" - "+GetString$(lbox&,GetCurSel(lbox&))
Endwhile
Proc LetterOfNumber
Parameters number%,grossschreibung%
case grossschreibung%=1 : var alphabet$="A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
case grossschreibung%<>1 : var alphabet$="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
declare text$,ausnahme%
while number%<>0
if number%<27
text$=text$+SubStr$(alphabet$,number%,",")
number%=0
else
whileloop Round(number%/26,0)
if number%=(26*&loop)
text$=SubStr$(alphabet$,IF(Val(SubStr$(Str$(number%/26),1,"."))-1>0,Val(SubStr$(Str$(number%/26),1,"."))-1,1),",")+SubStr$(alphabet$,26,",")
ausnahme%=1
Endif
Endwhile
case ausnahme%<>1 : text$=SubStr$(alphabet$,Val(SubStr$(Str$(number%/26),1,".")),",")+text$
number%=number%-(26*Val(SubStr$(Str$(number%/26),1,".")))
Endif
Endwhile
Return text$
EndProc
LG
Julian57 |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...] | 08.10.2011 ▲ |
| |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | Jörg Sellmeyer | Es hat mir keine Ruhe gelassen und ich hab noch weitergetüftelt. Jetzt hab ich's raus und es ist letztlich unkomplizierter als anfangs erwartet.
'und umgekehrt
'Jörg Selllmeyer 2011
'zur freien Verwendung
'hier bekommt man sehr gut erklärt, wie das Umrechnen von Zahlen in eine andere Basis funktioniert:
'https://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
'Die Schwierigkeit hierbei, ist die fehlende Null. Alle Nullstellen müssen abgefangen werden, die
'aktuelle Stelle um eins verringert und die folgende Stelle ebenfalls um eins verringert werden.
'Der Wert A000 wird dann also ohne Nullen zu YYZ. C000 wird zu BYYZ
Proc Nr2ABC
Parameters Zahl!
Declare Wert$,Rest%
While Zahl! > 0
Rest% = Zahl! Mod 26
Zahl! = Zahl! \ 26
If Rest% = 0
'hier werden die Nullstellen abgefangen und umgewandelt
Zahl! = Zahl! -1
Rest% = 26
EndIf
Case Rest% > 0:Wert$ = Chr$(Rest% + 64) + Wert$
Wend
Return Wert$
EndProc
Proc ABC2Nr
Parameters Text$
Declare Zahl!,Summe!,B$
Text$ = Upper$(Text$)
WhileLoop Len(Text$),1,-1
B$ = SubStr$(Text$,-&Loop)
Zahl! = (Ord(B$)-64) * 26^(&Loop-1)
Summe! = Summe! + Zahl!
Wend
Return Int(Summe!)
EndProc
Cls
WindowTitle "Zahlen in Buchstaben umwandeln und umgekehrt"
Print "LQSVOFKGQM =", ABC2Nr("LQSVOFKGQM")
Print "AAAAAA =", ABC2Nr("AAAAAA")
Print "ABCDEFGH =", ABC2Nr("ABCDEFGH")
Print
Print "XPROFAN macht Spass =", ABC2Nr("XPROFAN"),ABC2Nr("macht"),ABC2Nr("Spass")
Print
Declare s$
Randomize
WhileLoop 10
s$ = Chr$(Rnd(26) + 65) + s$
Wend
Print s$ + " =",ABC2Nr(s$)
WaitInput
Cls
Randomize
WhileLoop 0,780,1
Print Nr2ABC(&Loop),
Wend
WaitInput
Cls
WhileLoop 00,480,1
Print Nr2ABC(&Loop + Rnd(345676)),
Wend
WaitInput
Hier ist noch ein kleines Programm, bei dem man ein bischen herumexperimentieren kann:
$H windows.ph
Def DelLast(2) Mid$(@$(1),1,(Len(@$(1)) - @&(2)))
'hier kann man schön nachlesen, wie so eine Umrechnung funktioniert:
'https://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
Proc Nr2ABC
Parameters Zahl!
Declare Wert$,Rest%
While Zahl! > 0
Rest% = Zahl! Mod 26
Zahl! = Zahl! \ 26
If Rest% = 0
Zahl! = Zahl! -1
Rest% = 26
EndIf
Case Rest% > 0:Wert$ = Chr$(Rest% + 64) + Wert$
Wend
Return Wert$
EndProc
Proc ABC2Nr
Parameters Text$
Declare Zahl!,Summe!,B$
WhileLoop Len(Text$),1,-1
B$ = SubStr$(Text$,&Loop)
Zahl! = Chr$(B$) * 26^(&Loop-1)
Summe! = Summe! + Zahl!
Wend
Return Summe!
EndProc
SubProc Create.TextR
Return @Control("STATIC",@$(2),$50000002,@%(3),@%(4), \
@%(5),@%(6),@%(1),101, %hInstance)
EndProc
Proc Text_setzen
Parameters cb&,txt&,txt1&
Declare Text$,Ergebnis!
Text$ = GetText$(txt&)
SetText txt1&,Str$((GetCurSel(cb&)) * Val(Text$))
Clear Text$
WhileLoop 0,Stellen%-1
Ergebnis! = Val(GetText$(txt1&[&Loop])) + Ergebnis!
Text$ = Text$ + GetText$(cb&[&Loop])
Wend
SetText txt_Ergebnis&,Str$(Ergebnis!)
SetText txt_Alphabet&,Text$
SetText txt_Nr2ABC&,Nr2ABC(Ergebnis!)
EndProc
Proc Button_Aktion
Parameters btn&
If GetText$(btn&) = "Null setzen"
SendMessage(cb&[focus%],$014E,0,0)
Text_setzen(cb&[focus%],txt&[focus%],txt1&[focus%])
SetText btn&,"Zufall"
Else
SendMessage(cb&[focus%],$014E,Rnd(26),0)
Text_setzen(cb&[focus%],txt&[focus%],txt1&[focus%])
SetText btn&,"Null setzen"
EndIf
EndProc
Proc Alle_Null
Parameters btn&
If GetText$(btn&) = "alle Null setzen"
WhileLoop 0,Stellen%-1
SendMessage(cb&[&Loop],$014E,0,0)
Text_setzen(cb&[&Loop],txt&[&Loop],txt1&[&Loop])
SetText btn&[&Loop],"Zufall"
Wend
SetText btn&,"alle Zufall"
Else
WhileLoop 0,Stellen%-1
SendMessage(cb&[&Loop],$014E,Rnd(26),0)
Text_setzen(cb&[&Loop],txt&[&Loop],txt1&[&Loop])
SetText btn&[&Loop],"Null setzen"
Wend
SetText btn&,"alle Null setzen"
EndIf
EndProc
Declare Stellen%
Stellen% = 10
Declare cb&[Stellen%],txt&[Stellen%],txt1&[Stellen%],A$,x%,b%,focushdl&,focus%,Ergebnis&
Declare btn&[Stellen% + 1]
b% = 118
x% = 120
WindowStyle 8 | 24 | 512
Window Stellen% * (b% + 24),300
SetDialogFont ~GetStockObject($11)
WhileLoop 26
a$ = a$ + Chr$(64 + &loop) + "|"
Wend
a$ = " |" + DelLast(a$,1)
MoveStrToList(a$,"|")
WhileLoop 0,Stellen%-1
cb&[&Loop] = Create("ChoiceBox",%hwnd,0,5 + &Loop * x%,40,b%,160)
Create("Tooltip",%hwnd,cb&[&Loop],"26^" + Str$(Stellen%-1 - &Loop))
MoveListToHandle(cb&[&Loop])
SendMessage(cb&[&Loop],$014E,0,0)
txt&[&Loop] = Create("TextR",%hwnd,"",5 + &Loop * x%,10,b%,20)
txt1&[&Loop] = Create("TextR",%hwnd,"",5 + &Loop * x%,80,b%,20)
btn&[&Loop] = Create("Button",%hwnd,"Zufall",5 + &Loop * x%,110,b%,20)
Case &Loop = Stellen% - 1:btn&[&Loop + 1] = Create("Button",%hwnd,"Zufall",5 + (&Loop + 1) * x%,110,b%,20)
Wend
Var txt_Alphabet& = Create("TextR",%hwnd,"",5 + Stellen% * x%,40,b% + Stellen%,20)
Var txt_Ergebnis& = Create("TextR",%hwnd,"",5 + Stellen% * x%,80,b%,20)
Var txt_Nr2ABC& = Create("TextR",%hwnd,"",5 + Stellen% * x%,140,b%,20)
Set("Decimals",0)
WhileLoop 0,Stellen%-1
SetText txt&[Stellen%-1 - &Loop],Str$(26^&Loop)
Wend
Randomize
While 1
WaitInput
focushdl& = %getfocus
WhileLoop 0,Stellen%-1
Case focushdl& = cb&[&Loop]:focus% = &Loop
If focushdl& = btn&[&Loop]
focus% = &Loop
EndIf
Wend
If %key = 2
Break
ElseIf GetFocus(cb&[focus%])
Case GetCurSel(cb&[focus%]) > -1:Text_setzen(cb&[focus%],txt&[focus%],txt1&[focus%])
ElseIf Clicked(btn&[focus%])
Button_Aktion(btn&[focus%])
ElseIf Clicked(btn&[Stellen%])
Alle_Null(btn&[Stellen%])
ElseIf %mousepressed = 2
CreateMenu
AppendMenu 100,"Summe kopieren"
AppendMenu 101,"Buchstaben kopieren"
TrackMenu %mousex,%mousey
If MenuItem(100)
ClearClip
PutClip GetText$(txt_Ergebnis&)
ElseIf MenuItem(101)
ClearClip
PutClip GetText$(txt_Alphabet&)
EndIf
EndIf
Wend
Hier ist noch eine Auflistung:
Proc Nr2ABC
Parameters Zahl!
Declare Wert$,Rest%
While Zahl! > 0
Rest% = Zahl! Mod 26
Zahl! = Zahl! \ 26
If Rest% = 0
Zahl! = Zahl! -1
Rest% = 26
EndIf
Case Rest% > 0:Wert$ = Chr$(Rest% + 64) + Wert$
Wend
Return Wert$
EndProc
Cls
ShowMax
Declare Stellen%[6],Wert$[6],n%,a$,b$,OrdNr&,Header$,s$
Clear Stellen%[]
OrdNr& = 1
Var b% = %maxx \ 27 -1
WhileLoop 26
s$ = s$ + Chr$(64 + &loop) + ";1;" + Str$(b%) + ";"
Wend
s$ = ";0;" + Str$(b%) + ";" + s$
Var l& = Create("GridBox",%hwnd,s$,0,2,2,Width(%hwnd)-4,Height(%hwnd)-4)
WhileLoop 26^2
WhileLoop 26
B$ = B$ + Nr2ABC(OrdNr&) + "|"
Inc OrdNr&
Wend
AddString(l&,Str$(OrdNr&-26) + "|" + b$)
Clear b$
WindowTitle Str$(OrdNr&) + " Geduld - es geht bis 26^3 (" + Str$(Int(26^3)) + ")"
Wend
WindowTitle Str$(OrdNr&) + " Geduld - es geht bis 26^3 (" + Str$(Int(26^3)) + ") fertig!"
While 1
WaitInput
Wend
|
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 23.10.2011 ▲ |
| | |
| | | Sowas [...] ?
A B C D AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD AAA AAB AAC AAD ABA ABB ABC ABD ACA ACB ACC ACD ADA ADB ADC ADD BAA BAB BAC BAD BBA BBB BBC BBD BCA BCB BCC BCD BDA BDB BDC BDD CAA CAB CAC CAD CBA CBB CBC CBD CCA CCB CCC CCD CDA CDB CDC CDD DAA DAB DAC DAD DBA DBB DBC DBD DCA DCB DCC DCD DDA DDB DDC DDD AAAA |
| | | | |
| | Julian Schmidt | Ja, genau soetwas? Gibts dazu noch eine Gegenfunktion? |
| | | | |
| | | Bestimmt.
Müsstest halt mit Basis len(zaehleMit$) rechnen -
könntest aber auch einfach in eine Liste zählen und dann hättest Direktzugriff statt Rechnerei. |
| | | | |
| | Julian Schmidt | Meine Variante rechnet deutlich schneller als IF's. ^^ Im Beispiel verbrauchte IF's Variante 412MS und meine Variante 8MS. Das ist das Fünfzig-fache. KompilierenMarkierenSeparierencls
var time%=&GetTickCount
print "Ergebnis Variante IF:"
print "702 = "+LetterOfNumber2(702,1)
print "Rechenzeit: "+Str$(&GetTickCount-time%)+"MS"
print ""
time%=&GetTickCount
print "Ergebnis Variante Julian:"
print "702 = "+LetterOfNumber1(702,1)
print "Rechenzeit: "+Str$(&GetTickCount-time%)+"MS"
waitinput
Proc LetterOfNumber1
Parameters number%,grossschreibung%
case grossschreibung%=1 : var alphabet$="A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
case grossschreibung%<>1 : var alphabet$="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
declare text$,ausnahme%
while number%<>0
if number%<27
text$=text$+SubStr$(alphabet$,number%,",")
number%=0
else
whileloop Round(number%/26,0)
if number%=(26*&loop)
text$=SubStr$(alphabet$,IF(Val(SubStr$(Str$(number%/26),1,"."))-1>0,Val(SubStr$(Str$(number%/26),1,"."))-1,1),",")+SubStr$(alphabet$,26,",")
ausnahme%=1
Endif
Endwhile
case ausnahme%<>1 : text$=SubStr$(alphabet$,Val(SubStr$(Str$(number%/26),1,".")),",")+text$
number%=number%-(26*Val(SubStr$(Str$(number%/26),1,".")))
Endif
Endwhile
Return text$
EndProc
Proc LetterOfNumber2
Parameters number%,grossschreibung%
declare zaehler$
case grossschreibung%=1 : var alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
case grossschreibung%<>1 : var alphabet$="abcdefghijklmnopqrstuvwxyz"
whileLoop number%
zaehler$=zaehleHoch(zaehler$,alphabet$)
Endwhile
Return zaehler$
EndProc
proc zaehleHoch
parameters s$,base$,p&
case %pCount<3 : p&=len(s$)
var chp&=instr(mid$(s$,p&,1),base$)
case chp&=len(base$) : return zaehleHoch(mid$(s$,1,p&-1)+left$(base$,1)+mid$(s$,p&+1,len(s$)-p&),base$,p&-1)
return mid$(s$,1,p&-1)+mid$(base$,chp&+1,1)+mid$(s$,p&+1,len(s$)-p&)
endProc
Kann man IF's Variante verschnellern, oder meine Vervollständigen das sie größere Zahlen in Buchstaben(bis zu unendlich Stellen, Zahlen>702;ZZ) umformt? |
| | | | |
| | Julian Schmidt | [OFFTOPIC]Warum antwortet niemand?[/OFFTOPIC] |
| | | | |
| | | Probiere mal Sleep 0 -
ist noch schneller und erledigt die Aufgabe ebenso wenig. |
| | | | |
| | Julian Schmidt | If, du Scherzkeks |
| | | | |
| | Julian Schmidt | Das rechnen sollte relativ schnell gehen! Fällt euch noch eine schnellere Möglichkeit ein außer dem selbst errechnen? Hochrechnen dauert eindeutig zu lange!
Diese Funktion sollte aber auch größere Zahlen und Buchstaben verarbeiten können. Bei meinen Funktionen ist Schluss bei AAA und 703. Mir fehlt eine Strategie wie man dieses Limit in die Höhe, ins Unendliche treiben kann. Hier mal mein Quelltext: KompilierenMarkierenSeparierencls
AppendMenuBar 101,"NumberOfLetter"
AppendMenuBar 102,"LetterOfNumber"
declare text$
var lbox&=Create("ListBox", %hwnd, 0, 0, 0, width(%hwnd), height(%hwnd))
whileloop 26*30
AddString(lbox&,LetterOfNumber(&loop,1))
Settext %hwnd,Str$(GetCurSel(lbox&))+" - "+GetString$(lbox&,GetCurSel(lbox&))
if menuitem(101)
text$=Input$("Letter?", "NumberOfLetter", "A")
MessageBox(text$+" = "+Str$(NumberOfLetter(text$)),"NumberOfLetter",64)
elseif menuitem(102)
text$=Input$("Number?", "LetterOfNumber", "1")
MessageBox(text$+" = "+LetterOfNumber(Val(text$),1),"LetterOfNumber",64)
Endif
SetMenuItem 0
Endwhile
while 1
waitinput
case iskey(27) : end
Settext %hwnd,Str$(GetCurSel(lbox&))+" - "+GetString$(lbox&,GetCurSel(lbox&))
if menuitem(101)
text$=Input$("Letter?", "NumberOfLetter", "A")
MessageBox(text$+" = "+Str$(NumberOfLetter(text$)),"NumberOfLetter",64)
elseif menuitem(102)
text$=Input$("Number?", "LetterOfNumber", "1")
MessageBox(text$+" = "+LetterOfNumber(Val(text$),1),"LetterOfNumber",64)
Endif
Endwhile
Proc LetterOfNumber
Parameters number%,grossschreibung%
case grossschreibung%=1 : var alphabet$="A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
case grossschreibung%<>1 : var alphabet$="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
declare text$,ausnahme%
while number%<>0
if number%<27
text$=text$+SubStr$(alphabet$,number%,",")
number%=0
else
whileloop Round(number%/26,0)
if number%=(26*&loop)
text$=SubStr$(alphabet$,IF(Val(SubStr$(Str$(number%/26),1,"."))-1>0,Val(SubStr$(Str$(number%/26),1,"."))-1,1),",")+SubStr$(alphabet$,26,",")
ausnahme%=1
Endif
Endwhile
case ausnahme%<>1 : text$=SubStr$(alphabet$,Val(SubStr$(Str$(number%/26),1,".")),",")+text$
number%=number%-(26*Val(SubStr$(Str$(number%/26),1,".")))
Endif
Endwhile
Return text$
EndProc
Proc NumberOfLetter
Parameters Number$
declare i%,alphabet$
alphabet$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
whileloop Len(Number$),1,-1
i%=i%+(InStr(Left$(Upper$(Number$),1),alphabet$)*(26*(&loop-1)))+IF(Len(Number$)=1,InStr(Left$(Upper$(Number$),1),alphabet$),0)
Number$=Del$(Number$,1,1)
Endwhile
Return i%
EndProc
Lösungsansätze, Strategien? |
| | | | |
| | | Grmpfzbl! Ich schrup doch: mit Basis len(zaehleMit$) rechnen -
wie hier z.B.: [...]
Von Dezimal (Basis 10) mit Wert 88 zu Basis 26 ergibt Wert 3A -
3A müsstest dann wiederum als String interpretieren wobei 3 Buchstabe C wäre und das A wäre das J - ergo: CJ.
Zurück genauso einfach CJ dann wieder als String betrachtet in 3A konvertiert als Basis 26 nach Basis 10 gerechnet ergibt 88.
Wenn Du das dann hinbekommen hast und es dann immer noch zu langsam ist dann konvertiere ich Dir das auch nach asm in eine nProc. |
| | | | |
| | Julian Schmidt | iF (12.10.11)
3A müsstest dann wiederum als String interpretieren wobei 3 Buchstabe C wäre und das A wäre das J - ergo: CJ.
Warum wäre das A das J? Was wäre dann zum Beispiel das B, ein K? Oder das Z ein I? Also jeder Buchstabe um 9 Stellen versetzt? In was für ein Zahlensystem wird das den generell konvertiert? |
| | | | |
| | | Einfach linear:
123456789 10 123456789 A ABCDEFGHI J |
| | | | |
|
AntwortenThemenoptionen | 27.292 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |