Dezimal zu Dualzahl umwandeln

Sariya

Grünschnabel
Hallo könntet ihr mir bitte bei der Aufgabe helfen.
Schreiben Sie ein C-Programm, das eine eingegebene positive ganze Zahl inklusive der 0 in eine 8-Bit Dualzahl umwandelt. Geben Sie eine Fehlermeldung aus, falls die eingegebene Zahl zu groß ist. Die Ausgabe des Programms sollte in etwa so aussehen: Programm Dualzahl Geben Sie bitte eine ganze Zahl ein: 3 Ausgabe im Dualsystem: 00000011

ich habe versucht aber hab es nicht geschafft. Das was ich gemacht habe:


1 #include <stdio.h>
2
3 int main() {
4 int c,i,dez,rest,zahl_neu;
5
6 printf("Programm Dualzahl\n");
7 printf("Geben Sie bitte eine Dezimalzahl ein:\n");
8 scanf("%d", &dez);
9
10 printf("Ausgabe im Dualsystem:\n");
11 do {
12 rest = dez % 2; //in rest wird 0 oder 1 gespeichert
13 zahl_neu = dez / 2; //zahl_neu wird als Ganzzahl dividiert
14 dez = zahl_neu; //und als neueDezimalzahl zugewiesen
15 }
16
17 while (zahl_neu != 0); // Dividiere solange, solange die dez-Zahl >
18
19 return 0;
20 }
 
Hallo Sariya,
im Grunde hast du es schon. In deiner Schleife berechnest du die Bits wie man es per Hand macht beginnend von rechts. Du hast lediglich die Ausgabe vergessen. Der Lesbarkeit halber habe ich mir erlaubt, die Formatierung etwas anzupassen.

Dein Code:
C:
#include <stdio.h>
#include <stdio.h>

int main() {
    int c, i, dez, rest, zahl_neu;

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rest = dez % 2;            //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
    } while (zahl_neu != 0);    // Dividiere solange, solange die dez-Zahl >

    return 0;
}

Alles was du brauchst, ist die Ausgabe des Characters (Zeile 15) für jede Iteration.
C:
#include <stdio.h>

int main() {
    int c, i, dez, rest, zahl_neu;

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rest = dez % 2;            //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
        printf("%d", rest);        //berechneter Rest wird ausgegeben
    } while (zahl_neu != 0);        // Dividiere solange, solange die dez-Zahl > 0 ist

    return 0;
}

Da du die Bits von rechts an berechnest, aber von links an ausgibst, erfolgt die Ausgabe verkehrt herum. Um das zu korrigieren könntest du sie in ein Array schreiben und dieses in umgekehrter Reihenfolge ausgeben.

C:
#include <stdio.h>

int main() {
    int i = 0, dez = 0, zahl_neu = 0, rests[] = {0,0,0,0,0,0,0,0};

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rests[i] = dez % 2;        //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
        i++;
    } while (zahl_neu > 0);        // Dividiere solange, solange die dez-Zahl > 0 ist

    //Ausgabe rückwärts
    for (i = 7; i >= 0; i--)
    {
        printf("%d", rests[i]);
    }
    printf("\n");

    return 0;
}


Ein paar schönheitstechnische Tipps zu gutem Stil:

Denk bei der Verwendung eines Arrays immer daran, es zuvor zu initialisieren, da deine Schleife nicht garantiert, alle Elemente des Arrays zu überschreiben. Auch die anderen Variablen sollten zuvor initialisiert werden. Das gilt insbesondere für die Variablen, auf die du hinterher mit scanf einliest. Angenommen die Eingabe schlägt fehl, beispielsweise weil jemand nicht das vorgegebene Format befolgt hat, bricht scanf einfach ab. Die bis dahin noch nicht beschriebenen Variablen werden auch nicht mehr beschrieben. Für solche Fälle wählt man dafür Werte, mit denen man möglichst gut umgehen kann. Üblicherweise ist das 0. Den Fall, dass hinterher eine 0 darauf ist, muss man dann je nach Situation auch behandeln. Selbst wenn man den Fall im Code nicht behandelt, ist der Umstand wenigstens beim Debuggen häufig sehr wertvoll, wenn man an der verbliebenen 0 bemerkt, dass die Eingabe fehlgeschlagen ist. In einem Fall, in dem sich ein zufälliger Wert in der Variable befindet, den man nicht beabsichtigt oder berücksichtigt hat, ergibt sich ein sogenanntes undefiniertes Verhalten - oder in Englisch: Undefined Behavior. Das gilt es zu vermeiden.

Außerdem empfiehlt es sich, für Schleifeniterationen als Abbruchbedingung immer etwas zu nehmen, das eine höhere Erfolgswahrscheinlichkeit hat. Statt != verwendet man für while-Schleifen eher >, solang es den selben Zweck erfüllt. Natürlich macht die Verwendung rein logisch betrachtet hier keinen Unterschied. Der Grund liegt darin, dass in speziellen Anwendungssituationen auch die Hardware beeinflusst werden kann. Wenn nun beispielsweise durch einen äußeren Umstand ein Bit plötzlich wechselt und dabei zufällig genau die 0 übersprungen wird, würde dein Algorithmus zu viele Iterationen durchlaufen und dabei auf einen Teil des Arrays zugreifen, den es nicht gibt. Unter den meisten Systemen würde diese Ausnahme als Speicherzugriffsfehler gehandhabt und dein Programm beendet. Im besten Fall bekommst du "nur" zufällige Werte, die gerade irgendwo im Speicher standen.

Gruß,
Neonof
 
Zuletzt bearbeitet:
Hallo Sariya,
im Grunde hast du es schon. In deiner Schleife berechnest du die Bits wie man es per Hand macht beginnend von rechts. Du hast lediglich die Ausgabe vergessen. Der Lesbarkeit halber habe ich mir erlaubt, die Formatierung etwas anzupassen.

Dein Code:
C:
#include <stdio.h>
#include <stdio.h>

int main() {
    int c, i, dez, rest, zahl_neu;

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rest = dez % 2;            //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
    } while (zahl_neu != 0);    // Dividiere solange, solange die dez-Zahl >

    return 0;
}

Alles was du brauchst, ist die Ausgabe des Characters (Zeile 15) für jede Iteration.
C:
#include <stdio.h>

int main() {
    int c, i, dez, rest, zahl_neu;

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rest = dez % 2;            //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
        printf("%d", rest);        //berechneter Rest wird ausgegeben
    } while (zahl_neu != 0);        // Dividiere solange, solange die dez-Zahl > 0 ist

    return 0;
}

Da du die Bits von rechts an berechnest, aber von links an ausgibst, erfolgt die Ausgabe verkehrt herum. Um das zu korrigieren könntest du sie in ein Array schreiben und dieses in umgekehrter Reihenfolge ausgeben.

C:
#include <stdio.h>

int main() {
    int i = 0, dez = 0, zahl_neu = 0, rests[] = {0,0,0,0,0,0,0,0};

    printf("Programm Dualzahl\n");
    printf("Geben Sie bitte eine Dezimalzahl ein:\n");
    scanf("%d", &dez);

    printf("Ausgabe im Dualsystem:\n");
    do {
        rests[i] = dez % 2;        //in rest wird 0 oder 1 gespeichert
        zahl_neu = dez / 2;        //zahl_neu wird als Ganzzahl dividiert
        dez = zahl_neu;            //und als neueDezimalzahl zugewiesen
        i++;
    } while (zahl_neu > 0);        // Dividiere solange, solange die dez-Zahl > 0 ist

    //Ausgabe rückwärts
    for (i = 7; i >= 0; i--)
    {
        printf("%d", rests[i]);
    }
    printf("\n");

    return 0;
}


Ein paar schönheitstechnische Tipps zu gutem Stil:

Denk bei der Verwendung eines Arrays immer daran, es zuvor zu initialisieren, da deine Schleife nicht garantiert, alle Elemente des Arrays zu überschreiben. Auch die anderen Variablen sollten zuvor initialisiert werden. Das gilt insbesondere für die Variablen, auf die du hinterher mit scanf einliest. Angenommen die Eingabe schlägt fehl, beispielsweise weil jemand nicht das vorgegebene Format befolgt hat, bricht scanf einfach ab. Die bis dahin noch nicht beschriebenen Werte werden auch nicht mehr beschrieben. Für solche Fälle wählt man dafür Werte, mit denen man möglichst gut umgehen kann. Üblicherweise ist das 0. Den Fall, dass hinterher eine 0 darauf ist, muss man dann je nach Situation auch behandeln. Selbst wenn man den Fall im Code nicht behandelt, ist der Umstand wenigstens beim Debuggen häufig sehr wertvoll, wenn man an der verbliebenen 0 bemerkt, dass die Eingabe fehlgeschlagen ist. In einem Fall, in dem sich ein zufälliger Wert in der Variable befindet, den man nicht beabsichtigt oder berücksichtigt hat, ergibt sich ein sogenanntes undefiniertes Verhalten - oder in Englisch: Undefined Behavior. Das gilt es zu vermeiden.

Außerdem empfiehlt es sich, für Schleifeniterationen als Abbruchbedingung immer etwas zu nehmen, das eine höhere Erfolgswahrscheinlichkeit hat. Statt != verwendet man für while-Schleifen eher >, solang es den selben Zweck erfüllt. Natürlich macht die Verwendung rein logisch betrachtet hier keinen Unterschied. Der Grund liegt darin, dass in speziellen Anwendungssituationen auch die Hardware beeinflusst werden kann. Wenn nun beispielsweise durch einen äußeren Umstand ein Bit plötzlich wechselt und dabei zufällig genau die 0 übersprungen wird, würde dein Algorithmus zu viele Iterationen durchlaufen und dabei auf einen Teil des Arrays zugreifen, den es nicht gibt. Unter den meisten Systemen würde diese Ausnahme als Speicherzugriffsfehler gehandhabt und dein Programm beendet. Im besten Fall bekommst du "nur" zufällige Werte, die gerade irgendwo im Speicher standen.

Gruß,
Neonof
Vielen dank Neonof das war sehr sehr hilfreich :D
 
Zurück