Anfängerfrage zu Dezimal>Dual Wanlder

wee84

Grünschnabel
Hallo Leute,

ich bin neu hier und habe gleich mal eine Frage an die jenigen mit schon etwas
mehr Erfahrung.
Vor zwei Wochen gings bei mir los mit der C Programmierung, allerdings ist mein
Unterrichtsmaterial sehr spärlich und ich muss viel im Netz nachsehen.

Ich sitze nun über den Übungen und bin bis jetzt ganz gut durch gekommen, doch
jetzt hänge ich.

Es geht um einen ganz einfachen Dezimal Dual Wandler:

#include<stdio.h>
main()
{

int var1, var2=2, var3;
printf("Dezimalzahl eingeben:");
scanf("%d",&var1);
printf("Sie haben %d eingegeben\n",var1);

while(var1>=1)
{
var3=var1%var2;
printf("%d",var3);
var1=var1/var2;
}
printf("\n");
printf("Leserichtung <---|\n");
system("pause");
}


Gibt es denn eine gute Lösung die Darstellung der Dualzahl gleich richtig herum auszuführen?!
Habt Verständnis, wie gesagt sind erst 4-5 Schulstunden dabei...


Gruß wee84
 
Hi!

Lösungen gibt es einige... Auf jeden Fall ist es am einfachsten, die errechneten Binärziffern zwischenzuspeichern. Dabei empfiehlt sich natürlich ein Array, und zwar eines das wir "von hinten" befüllen. Da es in C keinen kleineren Datentyp als char gibt, speichern wir auch nicht die binären Ziffern selbst sondern nehmen gleich darstellbare Zeichen ('1' und '0'):
C:
#include <stdio.h>

int
main(void)
{
    int pos;
    unsigned int in;
    char out[33];

    printf("Dezimalzahl: ");

    scanf("%d", &in);
    out[32] = '\0';

    for(pos=32; in; in>>=1)
    {
        out[--pos] = in&1? '1': '0';
    }

    puts(&(out[pos]));
    return 0;
}
In Zeile 8 wird das Array definiert. Die Länge von 33 ergibt sich aus der üblichen Anzahl von Bits für integer-Werte auf 32-Bit Systemen +1 (für das terminierende '\0', siehe Zeile 13).
In der for-Schleife wird das Array dann nach und nach befüllt, von hinten nach vorn, um dann in Zeile 20 ausgegeben zu werden. Hier reicht es nicht, puts(out); zu schreiben, da wir nicht davon ausgehen können dass pos = 0 ist.
Wie Du siehst habe ich auch die Berechnung etwas verändert: Ich prüfe hier einfach immer das Bit an Position 0 (Zeile 17) und verschiebe anschließend alle Bits nach rechts (in>>=1, Zeile 15).

Natürlich ist Deine Methode auch OK. Wenn Du die for-Schleife in meinem Beispiel durch das Folgende ersetzt, hast Du wieder die ursprüngliche Variante plus korrigierte Leserichtung:
C:
do
{   out[--pos] = in%2? '1': '0';
}
while(in /= 2);

Ich hoffe ich hab' Dich nach den paar Schulstunden nicht erschlagen :p
Sieh' Dir einfach die Links oben an, dann Dürfte der Kram verständlicher werden.

Gruß
Enum
 
Super vielen Dank,
auch wenn ich das jetzt erstma verdauen und verarbeiten muss :).
Ich glaube da war der Aufgabensteller etwas voreilig, das mit den Arrays
ist was ganz neues für mich.

Aber trotzdem nochmal vielen Dank damit lässt sich was anfangen!


Gruß wee84
 
Zurück