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
Marcel schrieb: > Binaer[0] = Binaer[16] - 0x30; Das machst du 15 mal. Jedesmal wird die vorherige Eingabe gelöscht. Georg
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.
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
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); |
Bis auf %d sieht das richtig aus.
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.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.