Umrechnung von Dezimal nach beliebieges Zahlensystem zwischen 2-9



  • Vielen Dank für die Bearbeitung!

    Ich schätze mal du sprichst diese Stelle an:

    while (basis < 2, basis > 9);

    Wenn ich hier ein && verwende, lässt er mir doch alle Zahlen durchgehen, meine Intention war genau diese, schau erst links und dann rechts, so sichere ich mich doch ab das die Zahl nicht kleiner als 2 und größer als 9 ist.



  • Das && ist das logische UND, was in logischen Verknüpfungen durchaus Sinn macht.

    Und lies nochmal deine eigene Aussage durch:

    redflag schrieb:

    kleiner als 2 und größer als 9 ist.

    Mann muss da zwar ein bisschen mit Negierungen aufpassen, damit man nicht mit && und || durcheinander kommt.

    Nebenbei: Weißt du, wie der Kommaoperator (den hast du benutzt) überhaupt funktioniert?



  • Erst wird der linke Wert ausgewertet und anschließend der rechte.

    Mit || komme ich nun zurecht, die Zahl wird solange abgefragt bis der Wert in Ordnung ist.

    Jetzt kommt die Rechnung an sich:

    1
    
     do {
     //den Rest der Division ablegen
        reste[position] = zahl % basis;
    //zur nächsten Position gehen
        position++;
    //durch 2 teilen und wieder zuweisen
        zahl = zahl / basis;
    

    Dezimalwert in meinem Beispiel ist 18:

    Das Ergebnis:

    0000 0000 0000 0020

    An sich wäre das doch korrekt, weil 0*9^0 + 2*9^1 = 18 ist.



  • redflag schrieb:

    Erst wird der linke Wert ausgewertet und anschließend der rechte.

    und welcher Wert wird für die Auswertung genommen?

    1810 und 209 haben denselben Wert (falls das deine Frage war)

    Mach eine Funktion daraus und rufe diese in eine Schleife auf.
    Dann siehst du schon, ob da ungewöhnliche Werte dabei sind.



  • Der letzte Wert, da ja nichts gespeichert wird, allerdings ändert sich der Wert in meiner Abfrage doch nicht, der bleibt gleich.

    Ich überlege mal ein wenig.



  • Folgender Algorithmus liegt der Aufgabe zu Grunde:

    Wir arbeiten die Ziffern in einer Schleife von rechts nach links durch. Dabei multiplizieren Sie den jeweiligen Wert der Ziffer mit dem Stellenwert und halten den Wert in einem Zwischenergebnis fest. Anschließend verdoppeln Sie den Stellenwert und machen mit der nächsten Ziffer weiter. Das wiederholen Sie, bis Sie alle Ziffern verarbeitet haben.

    Die Ausgabe soll natürlich nicht binär erfolgen, das hätte ich vielleicht noch erwähnen bzw. bedenken sollen.

    Über ein Programm Gerüst, oder ein paar gedankliche Einschübe würde ich mich sehr freuen. Mir geht es hier wirklich um das Verständnis, nicht um ein Ergebnis ab zugreifen.



  • Möchtest du wissen, wo du in deinem Code die Basis einsetzen musst?

    Dein Programm gibt die Binärdrstellung (Basis 2) aus.
    Und die 2 kommt nicht sehr häufig in deinem Code vor.



  • Grundsätzlich hätte ich Interesse an einem Code Beispiel für mein Problem. Den Code den ich ausgangs geschrieben habe, soll ja entsprechend erweitert werden, das die Umrechnung nicht nur von dezimal nach binär klappt.

    Von der binären Schreibweise, soll ich mich ja komplett entfernen.

    Der Algorithmus ist letztendlich die Grundlage für das Programm. Mit Algorithmus und dem Code Gerüst, muss halt ein neuer Code her, für den mir so spontan kein Lösungsansatz einfallen möchte.

    Umgangssprachlich gesehen soll folgendes passieren.

    Lies den Dezimalwert ein: Beispiel 12
    In welches Zahlensystem soll umgewandelt werden? Beispiel Oktalsystem

    Jetzt Multiplizier die Werte von rechts nach links mit dem Stellenwert und speichere das Zwischenergebnis. Nimm den nächsten Wert, verdoppel den Stellwert und multipliziere usw, bis keine Ziffer mehr Überbleibt.

    Hier in dem Fall 2*8^0 1*8^1



  • DirkB schrieb:

    Dein Programm gibt die Binärdrstellung (Basis 2) aus.
    Und die 2 kommt nicht sehr häufig in deinem Code vor.

    Dann ersetze die 2en in deinem Code durch basis



  • Ein bisschen Rekursion hilft oftmals:

    #include <stdio.h>
    #include <string.h>
    
    char *rek(unsigned long long z, char*s, int b)
    {
      if (z >= b) rek(z / b, s, b);
      return strncat(s, &"0123456789ABCDEF"[z%b], 1);
    }
    
    int main()
    {
      for (int b = 2; b <= 16; ++b)
        puts(rek(1234567890, (char[100]){ 0 }, b));
    }
    

    http://ideone.com/Bvhulf

    Für negative Werte musst du noch eine einfache Ergänzung machen.


Anmelden zum Antworten