Zahlensysteme, HEX, DUAL, 3er ... DEZIMAL ...

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
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Zahlensysteme, HEX, DUAL, 3er ... DEZIMAL ...

Beitrag von Xaby »

Eine einfache Methode, verständlich und übersichtlich:

Code: Alles auswählen

Procedure.q ValX(S$, Basis.b)
  Hex$="123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; Null weglassen
 ; S$=UCase(S$) ; Nachtrag, damit auch kleine Buchstaben als große erkannt werden
  m.l=Len(S$)
  i.l=0
  q.q
  q=0 
  While Not(i=m)
    Dings= Pow(Basis,i)
    i+1
    q=q+FindString(Hex$,Left(Right(S$,i),1),1)*Dings ; direkt * Pow(Basis, i-1) ist nicht möglich
  Wend 
  ProcedureReturn q
EndProcedure


Procedure.s StrX(Zahl.q,Basis.b)
  k.s="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  F.s="0" 
  
  If Zahl=0
    F="0"
  Else
    F = "";
  EndIf  
  While Zahl <> 0 
    F = Mid(k ,(Zahl % Basis)+1,1)+F;
    Zahl = Zahl / Basis;
  Wend;
  
  ProcedureReturn F 
EndProcedure

;/ Beispiele:
Debug ValX("11111111",2)
Debug ValX("FF",16)
Debug StrX(255,2)
Debug StrX(255,16)
Debug ValX("10",10)
Debug StrX(10,10)
Weitere Links zu anderen Methoden:
http://www.purebasic.fr/german/viewtopi ... lensysteme

http://www.purebasic.fr/german/viewtopi ... lensysteme

Hoffe, es nützt wem. Wenn man die Strings "01523456 ..."
ändert, kann man damit theorethisch auch verschlüsseln :mrgreen:

q=q+FindString(Hex$,Left(Right(S$,i),1),1) * Pow(Basis,i-1)

Code: Alles auswählen

While Not(i=m)

    i+1
    q=q+FindString(Hex$,Left(Right(S$,i),1),1)*Pow(Basis,i-1)
  Wend 

Begehe ich da einen Fehler, oder liegt der Fehler wo anders?

Code: Alles auswählen

  While Not(i=m)
    i+1
    Dings.q= Pow(Basis,i-1) 
    q=q+FindString(Hex$,Left(Right(S$,i),1),1)*Dings ; direkt * Pow(Basis, i-1) ist nicht möglich 
  Wend 
Wieso kann ich Dings.q nicht einfach mit Pow(Basis,i-1) ersetzen?

:allright:
Zuletzt geändert von Xaby am 24.05.2007 19:12, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

was für ein fehler tritt denn da auf?

möglicherweise liegt es daran, dass der rückgabewert von Pow kein Integer ist....?

außerdem finde ich die gesamte herangehensweise äußerst kompliziert.

ich würde nicht mit nem vorgabe-string arbeiten, sondern mit dem ASCII-wert des jeweiligen zeichens.

Code: Alles auswählen

Wert = Asc( Zeichen$ ) - 48
If Wert > 15 : Wert - 7 : EndIf

;-----

If Wert > 9 : Wert + 7 : EndIf
Zeichen$ = Chr(Wert + 48)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ändere doch den Code und dann versuch es im Debug-Modus zu starten. Dann bekommst du hoffentlich den gleichen Fehler, sonst muss ich mir einen neuen Rechner kaufen.

Die ASCII-Tabelle hab ich mit Absicht nicht genommen, damit man individuell und schön übersichtlich sein eigenes Zahlensystem generieren kann.

Mit einer kleinen Abwandlung kann man das sicherlich auch für römische Zahlen machen.

Der Code soll auch für Anfänger sein, die wenig zu lesen haben und sich bildlich vorstellen können, wie die Position im String immer um eins weiter rutscht, und dort dann überprüft wird, welches der Zeichen genutzt wird.

Mein Code hat wirklich den Vorteil, dass man nicht mit Null anfangen muss und das letzte Zeichen kein Z zu sein braucht.

Man kann auch Sonderzeichen nehmen und muss die nicht alle im Code berücksichtigen.

Und man findet Fehler schneller.

Gut, damit etwas korekt läuft muss vielleicht noch ein UCASE()
am Anfang bei ValStr() hin, damit der Nutzer auch kleine Buchstaben eingeben kann.
Aber das fehlt bei dir ja auch

Lässt man es weg und erweitert den String um die kleinen Buchstaben, hat man ein erweitertes Zahlensystem mit Unterscheidung zwischen großen und kleinen Buchstaben.
:mrgreen:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Tip:
Du solltest in beiden Proceduren 10 als Basis-Optimal-Wert angeben.

/EDIT:

Bug: Negative Zahlen sind nicht möglich!!!
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Das ist kein BUG!

Es gibt nur positive ganze Zahlen, also natürliche Zahlen.

Wenn jemand -128 darstellen will, dann wäre das doch

(255-128) nach HEX oder?

>>Du solltest in beiden Proceduren 10 als Basis-Optimal-Wert angeben.

Nee, das ist unsinn.

Wenn man eine normale Zahl in einem ZehnerSystem dargestellt haben will kann man doch Str() benutzen.
Ich denke bei beiden wäre es sinnvoller 16 als Basis zu nehmen.



Zu den negativen Zahlen. ...
wie hättest es denn gern?
Hexerdezimale gibt es nur positive. Und Nullen und einsen sind auch immer positiv.

Im ZehnerSystem hast du Str() oder du trennst das Vorzeichen vorher ab.

Denn bei vorzeichenbehafteten Zahlen muss man auch noch wissen, wie sie kodiert sind. Und da machen Motorola und Intel das anders.
Und wenn man will, kann man es auch selbst festlegen.

Es ist also kein BUG.

Wenn du ValX("11111111",2) ein gibst, kann das auch -128 sein.
Falls du das meinst.

Grundsätzlich gibt es keine negativen Zahlen /:-> Genauso wie es keine negativen Längen gibt. Es kann auch keine negative Anzahl an Äpfeln im Kühlschrank liegen. Und wenn doch, dann hat jemand festgelegt, wie viele rausgenommen worden sind.

Ist es das, was dich stört?:

Code: Alles auswählen

Debug StrX(ValX("1000",10)-ValX("1280",10),10)
Debug Str(Val("1000")-Val("1280"))
:oops:
Antwort:

Code: Alles auswählen

Debug "-"+StrX(ValX("1280",10)-ValX("1000",10),10)
negative Zahlen braucht die Welt nicht, ging doch bis zur dritten Klasse auch ohne :mrgreen:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich wollte es nur mit dem PureBasic-Str überschreiben und da geht das ganze:

Code: Alles auswählen

Debug Str(-1)
Debug StrX(-1, 10)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wie gesagt, für das ZehnerSystem ist es nicht gedacht.
Da müsste man dann vielleicht als FLAG, wenn du es wünschst die 10 setzen und dann in der ersten Zeile:

WENN Basis=10, DANN ProcedureReturn Str(Zahl)

Ich muss ja das RAD nicht neu erfinden :?


Auf Wunsch eines einzelnen Herren:

Code: Alles auswählen

Procedure.s StrX(Zahl.q,Basis.b=10)
  k.s="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  F.s="0"
  Z.s="" 
  If Zahl<>0
    F = "";
    If Zahl<0
    Zahl*(-1)
    Z.s="-"
    EndIf  
    
  While Zahl <> 0 
    F = Mid(k ,(Zahl % Basis)+1,1)+F;
    Zahl = Zahl / Basis;
  Wend;
  
  EndIf  
  
  ProcedureReturn Z+F 
EndProcedure
:mrgreen:

Haste natürlich recht.

Du kannst dann immer StrX() benutzen. Hat auch seine Vorteile.
Kann dir aber nicht sagen, wie viel langsamer meine Methode gegenüber Str() im ZehnderSystem ist. (deshalb rate ich davon eher ab)
Aber merkt man vielleicht gar nicht, wenn man es nicht zu oft benutzt :D
Kinder an die Macht http://scratch.mit.edu/
Antworten