Seite 1 von 1

Zahlensysteme

Verfasst: 29.06.2006 13:22
von Olaf
8)
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

Verfasst: 23.07.2006 13:18
von Konne
Wow

Verfasst: 23.07.2006 13:52
von pankgraf
Sehr gute Arbeit!
Da kann ich nur hoffen, du bleibst PB für sehr lange Zeit treu.
Gute C-Programmierer gibt es wie Sand am Meer. Hier hast du die Chance, bald zu den ganz Großen zu gehören.