Zahlensysteme
Verfasst: 29.06.2006 13:22

Hier ist ein Code, mit dem man Zahlen z.B. vom 27er-System ins Dezimal(10er-)System umwandeln kann. Es sind auch andere Umwandlungen möglich.
Die Basis des Ausgangs- und des Zielsystems muss zwischen 2 und 36 liegen.
Besonderheit: es werden auch Nachkommastellen ausgegeben.
Momentan arbeite ich an der Perioden-Erkennung.
Code: Alles auswählen
Enumeration
#Window
#Text_Basis1
#InputBasis1
#Text_Zahl1
#InputZahl1
#Text_Basis2
#InputBasis2
#Text_Zahl2
#OutputZahl2
#Start
EndEnumeration
Procedure.s DECf(Value$,Basis,NumberOfDecimals)
Dezimal.f
Vorz$=""
If Mid(Value$,1,1)="-"
Value$=Right(Value$,Len(Value$)-1)
Vorz$="-"
EndIf
start:
Length_Value=Len(Value$)
Komma=FindString(Value$,".",1)
If Komma=0
Value$+"."
Goto start
EndIf
Vorkomma:
For Stelle=1 To Komma-1
Ziffer$=UCase(Mid(Value$,Komma-Stelle,1))
If Asc(Ziffer$)>64 And Asc(Ziffer$)<91
Ziffer=Asc(Ziffer$)-55
Else
Ziffer=Val(Ziffer$)
EndIf
Dezimal+Ziffer*Pow(Basis,Stelle-1)
Next Stelle
Nachkomma:
For Stelle=Komma+1 To Length_Value
Ziffer$=UCase(Mid(Value$,Stelle,1))
If Asc(Ziffer$)>64 And Asc(Ziffer$)<91
Ziffer=Asc(Ziffer$)-55
Else
Ziffer=Val(Ziffer$)
EndIf
Dezimal+Ziffer*Pow(Basis,Komma-Stelle)
Next Stelle
Dezimal$=StrF(Dezimal,NumberOfDecimals)
ProcedureReturn Vorz$+Dezimal$
EndProcedure
Procedure.s Nf(DecValue$,Basis,NumberOfDecimals)
Vorz$=""
If Mid(DecValue$,1,1)="-"
DecValue$=Right(DecValue$,Len(DecValue$)-1)
Vorz$="-"
EndIf
Value.f=ValF(DecValue$)
HighestPot=Int(Log(Value)/Log(Basis))
Pot=HighestPot
Repeat
Ziffer=Int(Value/Pow(Basis,Pot))
Value-Ziffer*Pow(Basis,Pot)
If Pot=-1
Zahl$+"."
EndIf
If Ziffer<10
Zahl$+Str(Ziffer)
Else
Zahl$+Chr(Ziffer+55)
EndIf
If Pot<0
z+1
EndIf
Pot-1
Until z=NumberOfDecimals And Pot<0
ProcedureReturn Vorz$+Zahl$
EndProcedure
Procedure.s NN(Value$,OldBasis,NewBasis,NumberOfDecimals)
ProcedureReturn Nf(DECf(Value$,OldBasis,NumberOfDecimals),NewBasis,NumberOfDecimals)
EndProcedure
OpenWindow(#Window,0,0,300,220,"Zahlensystem - Umwandler",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#Window))
TextGadget(#Text_Basis1,10,10,280,20,"Basis des ersten Systems :")
StringGadget(#InputBasis1,10,27,280,20,"",#PB_String_Numeric)
TextGadget(#Text_Zahl1,10,50,280,20,"Erste Zahl :")
StringGadget(#InputZahl1,10,67,280,20,"",#PB_String_UpperCase)
TextGadget(#Text_Basis2,10,90,280,20,"Basis des zweiten Systems :")
StringGadget(#InputBasis2,10,107,280,20,"",#PB_String_Numeric)
TextGadget(#Text_Zahl2,10,130,280,20,"Zweite Zahl :")
StringGadget(#OutputZahl2,10,147,280,20,"",#PB_String_ReadOnly)
ButtonGadget(#Start,10,187,280,23,"Berechnen")
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Start
OldBasis=Val(GetGadgetText(#InputBasis1))
If OldBasis<2
MessageRequester("ERROR","Basis1 < 2 !")
E=1
ElseIf OldBasis>36
MessageRequester("ERROR","Basis1 > 36 !")
E=1
EndIf
NewBasis=Val(GetGadgetText(#InputBasis2))
If NewBasis<2
MessageRequester("ERROR","Basis2 < 2 !")
E=1
ElseIf NewBasis>36
MessageRequester("ERROR","Basis2 > 36 !")
E=1
EndIf
Value$=GetGadgetText(#InputZahl1)
For Wert=OldBasis To 35
If Wert<10
If FindString(Value$,Str(Wert),1)
E=1
EndIf
Else
If FindString(Value$,Chr(Wert+55),1)
E=1
EndIf
EndIf
If E=1
MessageRequester("ERROR","Eine Ziffer ist grösser als Basis1 !")
Break
EndIf
Next Wert
If E=1
E=0
Continue
EndIf
SetGadgetText(#OutputZahl2,NN(Value$,OldBasis,NewBasis,8))
EndSelect
EndSelect
Until Event=#PB_Event_CloseWindow