Forum: PC-Programmierung C Programm zum Einlesen max.16 stelliger Dualzahl und Ausgabe in Dezimalzahl


von Marcel (Gast)


Lesenswert?

Hallo,

ich bin mit einer Aufgabe am verzweifeln, ich soll eine max. 16stellige 
Dualzahl per getchar einlesen und als Dezimalzahl ausgeben, ich habe 
auch schon ein Proramm nur läüft es noch nicht so richtig, vllt kann mir 
ja einer helfen:

void main (void)     // Start des Hauptprogramms
  {
    unsigned char Binaer[16];     // fuer 16-stellige Binarzahlen

    unsigned int Zahl;            // fuer Dezimalzahl

    /*********************************************************************** 
*****************/
    /*  Initialisierung der seriellen Schnittstelle 0 des CC03ers 
*/
    /*  Schnittstellenparameter: 9600Baud, 8 Datenbit, 1 Stopp-Bit 
asynchroner Betrieb      */
    /*********************************************************************** 
*****************/

    SCON=0x52;
    TMOD |=0x20;
    TH1=0xfd;
    TR1=1;
    TI=1;

/* Bildschirm löschen */
    printf("\x1b\x48\x1b\x4a");

/* Begrueßungstext */
    printf("Binaerzahlenumrechnung in eine Dezimalzahl \n\n");



     printf("\n\nBitte eine max. 16 stellige  Binaerzahl eingeben mit 
der Endung b: ");

    do  {

        Binaer[16] = getchar();                 //Dualzahleingabe per 
getchar
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[1] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

        Binaer[16] = getchar();
        putchar(Binaer[16]);
        Binaer[0] =  Binaer[16] - 0x30;

    Zahl = Binaer[0]  * 32768 + 
//Umrechnung
           Binaer[1]  * 16384 +
           Binaer[2]  * 8192 +
           Binaer[3]  * 4096 +
           Binaer[4]  * 2048 +
           Binaer[5]  * 1024 +
           Binaer[6]  * 512 +
           Binaer[7]  * 256 +
           Binaer[8]  * 128 +
           Binaer[9]  * 64 +
           Binaer[10] * 32 +
           Binaer[11] * 16 +
           Binaer[12] * 8 +
           Binaer[13] * 4 +
           Binaer[14] * 2 +
           Binaer[15] * 1;



   }
    while(!(Binaer[16]=='b'));



    // Hier geht´s weiter nach der Schleife
    printf("\n\n   Die Dezimalzahl lautet: %u !",Zahl);



    while (1);                  // Endlosschleife zum ordnungsgemäßen 
Abschluß des Programms
  }                             // Ende des Hauptprogramms, d.h. Ende 
des gesamten Programms

: Verschoben durch Moderator
von Georg (Gast)


Lesenswert?

Marcel schrieb:
> Binaer[0] =  Binaer[16] - 0x30;

Das machst du 15 mal. Jedesmal wird die vorherige Eingabe gelöscht.

Georg

von H.Joachim S. (crazyhorse)


Lesenswert?

Hm, was passiert denn so, wenn jemand ausbosheit oder Dusseligkeit was 
anderes als 0 und 1 drückt :-)

Solche Eingabefehler gehören abgefangen.

Ansonsten ist dein Programm viel zu lang.
Du kannst einfach eine 16bit-Zahl nehmen und in einer Schleife bei einer 
ankommenden 1 incrementieren, bei 0 nicht und das ganze dann um eine 
Stelle nach links schieben. Am Ende hast du direkt die Zahl, die du mit 
printf () ausgeben kannst.

von Jens (Gast)


Lesenswert?

Hallo Marcel,

beim Cut'n'Paste der Zuweisungen die Indices nicht geändert...Oder ein 
Verständnisproblem 'Array-Indizierung'?

Dein Programm funktioniert allerdings nur für eine GENAU 16stellige Zahl 
und die Abbruchbedingung für 'b' funktioniert so auch nicht.

Hier mal die Skizze für etwas Kompakteres:

zahl = 0;

while ( (c = getchar()) == '0' || c == '1' ) {
  zahl = zahl * 2 + (c-'0');
}

Mach' was draus...

Jens

von Stefan F. (Gast)


Lesenswert?

Ich würde Dir empfehlen, das mit einer Wiederholschleife und 
Schiebe-Operationen zu machen. Etwa so:
1
uint16_t zahl=0;
2
for (uint8_t i=0; i<16; i++)
3
{
4
    char c=getchar();
5
    if (c=='1')
6
    {
7
        zahl=(zahl<<1)+1;
8
    }
9
    else if (c=='0')
10
    {
11
        zahl=(zahl<<1);
12
    }
13
    else if (c=='b')
14
    {
15
        break;
16
    }
17
    else  
18
    {
19
       printf("Eingabefehler!\n");
20
       break;
21
    }
22
}
23
printf("Die Zahl lautet: %d\n",zahl);

von H.Joachim S. (crazyhorse)


Lesenswert?

Bis auf %d sieht das richtig aus.

von W.S. (Gast)


Lesenswert?

Marcel schrieb:
> ich bin mit einer Aufgabe am verzweifeln, ich soll eine max. 16stellige
> Dualzahl per getchar einlesen und als Dezimalzahl ausgeben, ich habe
> auch schon ein Proramm nur läüft es noch nicht so richtig, vllt kann mir
> ja einer helfen:

Natürlich könnte fast jeder dir die fertige Lösung hinschreiben, aber 
was würdest du draus lernen?

Also denk mal nach, wie man so etwas auf eine einigermaßen kluge Weise 
tun kann:

Zuerst kommt das Lesen der Aufgabenstellung, insbesondere "eine max. 
16stellige". Das sagt dir, daß es auch eine 15 oder 3 oder nullstellige 
Zahl sein darf.

Als nächstes solltest du dir nen Gedanken machen, ob dein Input nun 
bigendian odeer littleendian daherkommt, also ob das höchstwertige Bit 
zuerst oder zuletzt kommt. Danach richtet sich nämlich dein Algorithmus.

Dann denk dran, wie man seriell daherkommende Bits parallel macht, mein 
Tip: per Schieberegister: mit jedem neuen Bit einmal schieben und bit an 
die so geschaffene Leerstelle einsetzen.

Schließlich brauchst du eine Ende-Erkennung, also ein Zeichen von deinem 
Input, das dir anzeigt, daß nun deine Zahl komplett ist.

Alles Klaro?

W.S.

von Stefan F. (Gast)


Lesenswert?

> Bis auf %d sieht das richtig aus.

Ich zittiere aus

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1

diouxX
The int (or appropriate variant) argument is converted to signed decimal 
(d and i), unsigned octal (o), unsigned decimal (u), or unsigned 
hexadecimal (x and X) notation.

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Marcel schrieb:
> unsigned char Binaer[16];     // fuer 16-stellige Binarzahlen
> ...
>         Binaer[16] = getchar();                 //Dualzahleingabe per
und dann vermeide am besten noch, außerhalb deines Arrays zu schreiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.