Hi alle zusammen,
ich sitzt nun schon seit ein paar Tagen dabei aber komm einfach nicht
dahinter ( dezente Programmierschwächen meinerseits ;) ).
Ich soll für die Uni ein Programm schreiben, das eine Zahl z.B. 101
übernimmt und diese in Binary und BCD ausgibt und so darstellt:
Input: 101 - 0000 0000 | 0000 0000 | 0000 0000 | 0110 0101
BCD: 257 - 0000 0000 | 0000 0000 | 0000 0001 | 0000 0001
Binary: 65 - 0000 0000 | 0000 0000 | 0000 0000 | 0100 0001
Die Binary Darstellung ist kein Problem nur wie bekomme ich den BCD Code
dazu und vor allem mit dieser Formatierung??? Bisher gibt er mir immer
nur die 1 aus aber nicht 101
Vielen Dank schon mal
Till
Dann zeig mal dein Programm.
Allgemein:
Du teilst die Zahl durch 10. Der Rest ist deine hinterste Ziffer. Das
Ergebnis teilst du wieder durch zehn, der Rest gibt die nächste Ziffer,
solange bis das Ergebnis kleiner zehn ist. Das ist dann deine vorderste
Ziffer.
Was du allerdings zeigst ist gepacktes BCD, da 2 Ziffern in einem Byte
sind:
101 = 0001 0000 0001
Aber ein bischen was darfst du auch selbst machen :-)
T.R schrieb:> Input: 101> Binary: 65
???
In welchem Format ist denn Input?
Was du binary nennst ist wohl hexadezimal gemeint.
Gib lieber mal die gesamte Aufgabe an, und zeige was du schon selbst
gemacht hast. Wir sind kein Abschreibeverein hier.
Bis jetzt hab ich das hier:
void bcdcode (unsigned int number)
{
unsigned int bitmask = 2147483648;
int count = 0;
int j = 0;
unsigned int bcd;
count = number % 10;
while (bitmask > 0)
{
bcd = count & bitmask;
if (j == 4 || j == 12 ||j == 20 || j == 28)
{
printf(" ");
}
if (j == 8 || j == 16 ||j== 24)
{
printf(" | ");
}
if (bcd)
{
printf("1");
}
else
{
printf("0");
}
bitmask = bitmask >> 1;
j++;
}
printf("\n");
}
Ich weiß ist ein sehr umständlicher Code aber wenigstns läufts einmal.
Das heißt ich muss meine Zahl dann einfach nur wieder %10 damit ich auf
die nächste komme?
T.R schrieb:> count = number % 10;
Das machst du genau ein mal, also erzeugst du nur die letzte Ziffer der
BCD Zahl.
T.R schrieb:> Binary: 65 - 0000 0000 | 0000 0000 | 0000 0000 | 0100 0001
Das ist falsch.
Was willst du erreichen?
Was ist die exakte Aufgabenstellung?
Tipp:
Nimm Papier und Bleistift. Mach dir klar wie eine Zahl abgespeichert
wird, und was eine BCD codierte Zahl überhaupt ist.
Wenn du das auf dem Papier umwandeln kannst dann machs als Software.
Noch ein Tipp
Mache für jede Konvertierung eine eigene Funktion.
Lagere die Ausgabe dann in eine eigene Funktion aus.
Oder habt ihr noch keine Funktionen/Prozeduren mit Parameterübergabe
gemacht?
Funktionen und übergaben haben wir schon "gelernt". Ich hab auch für
jede Konvertierung und die Ausgabe eine eigene Fkt, ich habs nur mit
rein gepackt damit ich besser seh was das programm macht, bzw was es
ausgibt.
In der Angabe steht: Der Input ist einmal als Dualcode betrachtet in den
BCD-Code zu konvertieren (BCD) und einmal als BCD-Code betrachtet in den
Dualcode zu konvertieren (Binary).
Udo Schmitt schrieb:>> Binary: 65 - 0000 0000 | 0000 0000 | 0000 0000 | 0100 0001>> Das ist falsch.> Was willst du erreichen?> Was ist die exakte Aufgabenstellung?
Input) ist einmal als Dualcode betrachtet in den BCD-Code zu
konvertieren (BCD) und einmal als BCD-Code betrachtet in den Dualcode zu
konvertieren (Binary). Die 65 steht auch so in der Angabe.
Wenn ich für jede Zahl die BCD ausgabe mache muss ich aber noch
zusätzlich die vorige Darstellung verschieben oder, ansonsten legt er
mir ja immer alles übereinander und die Werte von den vorigen gehen
verloren.
bcd = bcd << (i * 4);
output = output | bcd;
i++;
T.R schrieb:> Input) ist einmal als Dualcode betrachtet in den BCD-Code zu> konvertieren (BCD) und einmal als BCD-Code betrachtet in den Dualcode zu> konvertieren (Binary)
Moment das ist aber was anderes als das was du am Anfang schreibst.
Eine Zahl vom Dualcode (ich nehme an das ist das gleiche wie "binär
codiert") besteht nur aus '0' und '1'
Das heisst doch du sollst 2 Funktionen schreiben:
Funktion 1 wandelt eine Binärzahl in eine BCD Zahl um
Funktion 2 wandelt eine BCD Zahl in eine Binärzahl um.
Jetzt ist erst mal zu klären in welcher Form die Zahlen vorliegen, bzw
vorliegen sollen.
Ich würde einfach sagen als String also z.B. "10010110" <-> "96"
Sonst macht das eigentlich keinen Sinn oder wir reden aneinander vorbei.
Und ich würde auf jeden Fall die Sache 2-teilen.
Das eine ist die Berechnung der Zahlen, das andere die entsprechende
Ausgabe. Die Ausgabe ist immer gleich
..... 101 - 0000 0000 | 0000 0000 | 0000 0000 | 0110 0101
^ | |
| +-------------------------------------------+
| .... und hier die enstprechende
| Binärdarstellung dazu
|
+---- hier steht eine Dezimalzahl
der Teil ist immer derselbe: von einer Zahl die Dezimalform hinschreiben
und dann die entsprechende Aufdröselung in Bits.
Das hat aber nicht mit BCD oder Binäry zu tun.
Die Frage lautet daher nicht: wie muss die Ausgabe in der Funktion
bcdcode gemacht werden
sondern sie lautet: wie muss die gegebene Zahl auseinander genommen und
statt dessen wieder eine andere Zahl zusammengebaut werden, damit diese
Zahl den entsprechenden BCD Code realisiert.
deine Funktion bcdcode bekommt eine Zahl und sie liefert eine Zahl.
Nämlich zb dann, wenn du 101 in die Funktion hineingibst, dann liefert
sie 257 zurück.
Dass du dann beide Zahlen, 101 und 257, mit derselben Ausgabefunktion
ausgeben kannst, wobei du die Ausgabezeile mit einem anderen Wort
beginnen lässt, ist ein ganz andere Sache, und hat nichts mit Dezimal,
BCD oder Binär zu tun.
Peter Dannegger schrieb:> Ich grübel schon seit Stunden, wie die Aufgabe lautet.
Da ich anscheinend nicht einmal die Angabe richtig verstanden habe.
Das ist alles was wir bekommen haben ( Errorhandling lass ich jetzt
weg):
Einleitung
Lernziel des ersten Übungsbeispiels (Einzelarbeit) ist es, das Prinzip
von Bitmasken und Bitoperationen verstanden zu haben und diese für
einfache Operationen einsetzen zu können.
Aufgabenstellung
Erstellen Sie ein Programm, das als Parameter eine positive Zahl
übernimmt und im Anschluss falls möglich die Zahl vom Dualcode in den
BCD-Code und umgekehrt zu konvertieren. Das Programm soll dabei logisch
in Funktionen gegliedert sein und alle Berechnungen soweit möglich mit
Bitoperationen und Bitmasken errechnen.
Der BCD-Code (Binary Coded Decimal) stellt eine Zahl so dar, dass er für
jede Ziffer (0-9) ein Nibble (4 Bit, ein halbes Byte) verwendet.
Input
Das Programm erwartet als (einzigen) Parameter eine positive Ganzzahl
(unsigned int) im Wertebereich 1 - UINT_MAX (definiert in limits.h), der
erste Werte ist inklusive, der zweite exklusive. Zur Konvertierung des
Parameters soll die Funktion strtoul (aus stdlib.h) verwendet werden,
wobei der zweite Parameter auf NULL und der dritte auf 0 gesetzt werden
muss. Dadurch ist bis auf den Wertebereich keine weitere
Eingabeüberprüfung notwendig.
Berechnung
Die eingegebene Zahl (Input) ist einmal als Dualcode betrachtet in den
BCD-Code zu konvertieren (BCD) und einmal als BCD-Code betrachtet in den
Dualcode zu konvertieren (Binary). Zur Hin- und Rückkonvertierung des
BCD-Codes müssen Sie Bitoperationen und Bitmasken verwenden, um die
unterschiedlichen Bits der Zahl zu berechnen und das Ergebnis bitweise
auszugeben. Nur für die Berechnung von 10er Potenzen und Ziffern im
Dezimalsystem dürfen sie den Multiplikations-, Divisions- und den
Modulo-Operator verwenden.
Output
Das Programm gibt im Anschluss folgenden Text aus:
Input: [Input] - [Bits of Input]\n
BCD: [BCD] - [Bits of BCD]\n
Binary: [Binary] - [Bits of Binary]\n
Hierbei werden die Begriffe in eckigen Klammern durch die entsprechenden
Werte ersetzt:
Für die Werte selbst ([Input], [BCD], [Binary]) ist folgender Format
String zu verwenden: "%10u". Die Bitweise Ausgabe soll jedes Nibble mit
einem Leerzeichen trennen und jedes Byte zusätzlich mit einem vertikalen
Strich |, der ebenfalls von Leerzeichen umgeben ist.