C Programm zum Einlesen max.16 stelliger Dualzahl und Ausgabe in Dezimalzahl

Gast #4582521
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
#4582536
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.
Gast #4582539
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
Gast #4582547
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);
Gast #4582824
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren