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 ▲ |
| |
| | | | - Seite 2 - |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | - Seite 4 - |
| 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 ▲ |
| | |
| | Julian Schmidt | Ich steh gerade mächtig auf den Schlauch! Mir fehlt wahrscheinlich für diese Aufgabe sehr viel (Grund-)Wissen zu Zahlensystemen? Ist Basis 10 die normale Basis eines Dezimalsystems? Was ist Basis 26 für ein Zahlensystem? Was für Rechenschritte erfolgen genau beim umrechnen von Dezimal zu Basis 26? Hat die Basis was mit (Zehner-)Potenzen zu tun? |
| | | | |
| | | Wenn etwas bereits auf Seite 1 einer Google-Suchergebnisliste steht dann ist das Nachfragen inwiefern kein reiner Zeitvertreib?
Bau uns doch mal ein paar XProfanfunktionen die das tun was z.B. hier bebeispielt ist: [...] |
| | | | |
| | Julian Schmidt | Na schön, hier schonmal eine Funktion.... KompilierenMarkierenSeparieren Wie man zur umkehrten Funktion kommt habe ich nicht so ganz verstanden. Hier der Wikipedia-Artikel hierzu...[...] Wie kommt man dann zur entsprechenden Potenz? |
| | | | |
| | Nico Madysa | Ich habe bereits überlegt, ob es nicht einfach ein Umrechnen in eine andere Zahlenbasis ist. Habe dann aber aufgehört, weil das Fehlen einer Null mir zu viele Probleme bereitet hat. Beispiel: Nehmen wir an, A=1. Dann folgt, dass Z=26 ist. Also ist AA=27. Die erste zweistellige Zahl in einem gewöhnlichen Zahlensystem, hat aber nie zwei gleiche Ziffern, siehe: 10. Eins und Null. Die Logik ist in etwa die, als würde man nach der 9 mit der 11 weitermachen. Nehmen wir an, A=0. Dann folgt, dass Z=25 ist. Also ist 26=AA. Aber A=0, also ist AA=A=AAAAAAAA=0. Man kann diese alphabetische Nummerierung folglich nicht einfach mit einem Zahlensystem gleichsetzen.
Die Lösung mag viel einfacher sein, aber, wie das bei mir so ist, ich komme nicht drauf.
Ich melde mich wieder, wenn ich eine Lösung habe oder noch einen dummen Kommentar ablassen muss. |
| | | | |
| | Jörg Sellmeyer | So müßte die Zahlenreihe aussehen: KompilierenMarkierenSeparieren Die zweie Reihe fängt sofort mit BA an. AA entspricht 00 und AB, AC ist dann 01, 02... |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 13.10.2011 ▲ |
| |
| | Jörg Sellmeyer | So - das hat mir doch keine Ruhe gelassen: Hier ist mein Ergebnis: KompilierenMarkierenSeparierenDef $Werte "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Def $Alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Proc Umwandeln
Parameters Zahl&,Basis%
Declare Ergebnis&,Rest&,Wert$
Repeat
Ergebnis& = Zahl& \ Basis%
Rest& = Zahl& Mod Basis%
If Basis% = 26
Wert$ = SubStr$($Alphabet,Rest&+1) + Wert$
Else
Wert$ = SubStr$($Werte,Rest&+1) + Wert$
EndIf
Zahl& = Ergebnis&
Case Rest& = 0:Rest& = Ergebnis&
Until Rest& = 0
'hier sind noch zuviele Bedingungen, die man besser oben mathematisch abfangen könnte
Case Left$(Wert$,1)="0":Wert$=Del$(Wert$,1,1)
Case Wert$ = "":Wert$ = "0"
Case Left$(Wert$,1)="A":Wert$=Del$(Wert$,1,1)
Case Wert$ = "":Wert$ = "A"
Return Wert$
EndProc
Set("NumWidth",5)
'WhileLoop 0,500
'AddString Str$(&Loop) + " = " + Umwandeln(&Loop,26)
'Wend
Randomize
Declare Input&
WhileLoop 0,500
Input& = Rnd(100000)
AddString Str$(Input&) + " = " + Umwandeln(Input&,26)
Wend
ListBox$("Ergebnis",2)
Kann nebenbei auch noch als Konverter für beliebige Zahl/Basis-Konstellationen bis 36 verwendet werden. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 16.10.2011 ▲ |
| |
| | Julian Schmidt | Sehr schön, nur leider überspringt er die jeweiligen "A-Werte" Z.B. kommt nach "Z", "BA". "AA" wäre der von mir gewünschte Wert. |
| | | | |
| | Jörg Sellmeyer | Hab ich ja weiter ob schon geschrieben: AA = 00 AB = 01 AC = 02 Im Dezimalsystem schreibst Du auch nicht 00,01,02,03... und dann 10,11,12... Du kannst den Code anpassen, so daß bei "einstelligen" Werten das A vorangestellt wird. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 16.10.2011 ▲ |
| |
| | Julian Schmidt | Was mein du mit einstelligen Werten? Etwa wenn der Rückgabe-Wert zwischen A-Z, 0-25 liegt? Dann wäre zwischen ZZ und BA wieder das Problem das AA fehlt. Außerdem würde die erste Reihe A-Z fehlen. |
| | | | |
| | Nico Madysa | @Jörg: Habe mir deinen Code nicht genau angesehen (müsste eigentlich schon seit zwei Stunden im Bett sein ), aber was ist mit AAA? Das ist ja das Buchstabenäquivalent zu "000", handelst du das auch ab?
Ich fürchte fast, dass es hier keinen Trick gibt, sondern die offensichtliche Methode die beste ist. |
| | | | |
| | Jörg Sellmeyer | Es kommt darauf an, was man will. Wenn man Zahlen in Buchstaben umwandeln will und ein Äquivalent zum hexadezimalen oder octalen Zahlensystem haben will, ergibt die Kombination AA, AAA, AAAA, ... keinen Sinn. Zumindest nicht, wenn das A als Null herhalten soll. Wenn man A (oder Z - je nach Null) als Mehrfachkombination haben will, ist es nicht mehr: "Zahlen in Buchstaben konvertieren", sondern: "Buchstabenkombinationen machen".
Und zum 3. Mal: AA fehlt nicht, sondern wird nicht dargestellt, da die Kombination "00" im Dezimalsystem schlicht nicht vorkommt. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 17.10.2011 ▲ |
| |
| | Julian Schmidt | Jörg Sellmeyer (17.10.11)
Wenn man A (oder Z - je nach Null) als Mehrfachkombination haben will, ist es nicht mehr: "Zahlen in Buchstaben konvertieren", sondern: "Buchstabenkombinationen machen".
Dann heißt es eben "Zahlen zu Buchstabenkombinationen konvertieren" aber ich habe schon seit Themenbeginn vorgegeben, wie die Buchstabe folge sein soll und das "AA" definitiv enthalten sein sollte:
Julian57 (08.10.11)
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...
Jörg Sellmeyer (17.10.11)
Und zum 3. Mal: AA fehlt nicht, sondern wird nicht dargestellt, da die Kombination "00" im Dezimalsystem schlicht nicht vorkommt.
Was kann man machen das AA dennoch vorkommt? |
| | | | |
|
AntwortenThemenoptionen | 27.300 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |