Zahlensysteme

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Zahlensysteme

Beitrag 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
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Wow
pankgraf
Beiträge: 29
Registriert: 10.07.2006 21:36
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Vista, openSuse 11.1, Win2k
Antworten