Umrechnung von Dezimal nach beliebieges Zahlensystem zwischen 2-9



  • Hallo zusammen,

    ich möchte einen Dezimalwert via C++ Programm in ein beliebiges Zahlensystem umwandeln (zwischen 2-9).

    Grundlage hierfür ist folgender Code:

    #include <iostream>
    
    using namespace std;
    
        int main()
    {
        int zahl, position = 0;
    
    //das Feld zum Speichern der Reste
        int reste[16];
    
    //Das Feld wird mit 0 besetzt
        for (int index = 0; index < 16; index++)
            reste[index] = 0;
    
    //den Wert einlesen
    do {
    //bitte in einer Zeile eingeben
        cout << "Geben Sie den Wert ein, der umgerechnetwerden soll (max.65535): ";
            cin >> zahl;
        }while (zahl > 65535);
    
    //die Schleife
    do {
    //den Rest der Division ablegen
        reste[position] = zahl % 2;
    //zur nächsten Position gehen
        position++;
    //durch 2 teilen und wieder zuweisen
        zahl = zahl / 2;
    }   while (zahl != 0);
    //die "Reste" von hinten nach vorne ausgeben
        for (int index = 15; index >= 0; index--) {
            cout << reste[index];
    //alle vier Stellen fügen wir eine Leerstelle ein
        if (index % 4 == 0)
            cout << " ";
    }
        return 0;
    }
    

    Wenn ich jetzt die Basis selbst auswählen möchte gebe ich meines Erachtens folgendes mit :

    // die Basis
        int basis;
    
    do {
            cout << "Geben Sie die Basis an, nach der die Umrechnung folgen soll (min.2/max.9): ";
            cin >> basis;
        }while (basis < 2, basis > 9);
    

    Was meint ihr dazu ?

    Viele Grüße

    redflag

    ~
    edit durch SeppJ: Codetags.~


  • Mod

    Wie man seinen Beitrag lesbar formatiert
    Da du als unregistrierter Nutzer deinen Beitrag nicht mehr ändern kannst, habe ich das mal gemacht. Beim nächsten Mal aber bitte die Vorschau benutzen und selber dran denken!

    redflag schrieb:

    Was meint ihr dazu ?

    Ich habe keine starke Meinung zu dem Thema. Ersthaft: Was möchtest du wissen? Je konkreter deine Fragen, desto besser die Antworten.

    PS: Ein Komma hat in C++ eine andere Bedeutung, als du anscheinend denkst. Weder bedeutet es UND, noch bedeutet es ODER. Es bedeutet "mache erst das links und dann das rechts und nimm dann den Wert von rechts". Logisches ODER wäre or oder || . Logisches UND wäre and oder && .



  • 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