moin, ich wollte ein Programm schreiben was eine eingegebene Zahl in eine 8 bit Dualzahl umwandelt verstehe aber grad nicht wie ich die Rechnung codieren soll in C und ebenfalls wie ich die Ausgabe umgekehrt mache ? Brauche Tipps bzw. Hilfe bei der Berechnung von binärzahlen in C ! Wie kann ich das mit den simplesten Befehlen machen ?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Gast
#6507603
Verstehst Du denn, wie die Umrechung funktioniert? Könntest Du eine beliebige ganze Dezimalzahl in das Binärsystem umrechnen?
ja
Gast
#6507615
Taw U. schrieb: > Brauche Tipps bzw. Hilfe bei der Berechnung von binärzahlen in C ! Du brauchst Tipps zum grundlegenden Programmieten. drehrn geht einerseits durch Rekursion, eine Funktion die sich selbst aufrift
1 | |
2 | |
3 | |
4 | |
5 | |
oder andererseits durch einen Pufferspeicher
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
oder man dreht gar nicht um sonder produziert gleich richtig
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Ben S. schrieb: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
was heißt denn hier diese uint8_t, diese var oder auch cout<<0 also jetzt bin ich noch mehr durcheinander :)
Gast
#6507627
Taw U. schrieb: > ja Hm. Hätte wohl dazu schreiben sollen, dass Du das mal mit eigenen Worten erklärst. Daraus hättest Du dann erstmal in Stichworten, aber noch in normaler Sprache eine "Anweisung" schreiben können, als wenn jemand anders das Schritt für Schritt tun soll. Das wäre so meine Idee: Dir nicht direkt das Programm hinzuschreiben, sondern mit Dir das Programm zu entwickeln.
Gast
#6507635
Taw U. schrieb: > was heißt denn hier diese uint8_t, Das ist ein ganz üblicher C Datentype. Der wird in jedem C/Cpp Buch beschrieben. Auch Google findet da sicherlich was. Taw U. schrieb: > diese var Ein Benutzerdefinierter Variablenbezeicher. Taw U. schrieb: > auch cout<<0 Die C++ übliche Art und Weise Ausgaben zu tätigen.
Arduino Fanboy D. schrieb: > Taw U. schrieb: >> was heißt denn hier diese uint8_t, > Das ist ein ganz üblicher C Datentype. > Der wird in jedem C/Cpp Buch beschrieben. > Auch Google findet da sicherlich was. > > Taw U. schrieb: >> diese var > Ein Benutzerdefinierter Variablenbezeicher. > > Taw U. schrieb: >> auch cout<<0 > Die C++ übliche Art und Weise Ausgaben zu tätigen. mit c++ hab ich noch nicht angefangen gibt es keine Variante wo man nur c benutzt?
Gast
#6507725
Taw U. schrieb: > was heißt denn hier diese uint8_t, diese var oder auch cout<<0 > also jetzt bin ich noch mehr durcheinander :) uint8_t ist eine Deklaration für eine Variable mit 8 Bit ohne Vorzeichen, vergleichbar mit unsigned char. Steht für unsigned int mit 8 Bit. Ich habe es mal für einen Anfänger etwas umgeschrieben, ohne C++ statements und mit einem Variablenname, der für Ungeübte zu weniger Verwirrung führt.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
HildeK schrieb: > Ich habe es mal für einen Anfänger etwas umgeschrieben, Deine Schleife zählt von 8 bis 1 und nicht von 7 bis 0.
HildeK schrieb: > Ich habe es mal für einen Anfänger etwas umgeschrieben Leider ist dieses Beispiel zwar vollkommen korrekt, aber jetzt nicht das, was das Bild oben vorgaukelt. Natürlich könnte man sagen, dass diese Shifts ja quasi genau diese Divisionen sind, aber formal "korrekt" müsste es so aussehen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Dabei muss man natürlich beachten, dass "zahl" ein ganzzahliger Wert ist, bei dessen Division der Rest abgeschnitten wird: : : 11/2 = 5 12/2 = 6 13/2 = 6 14/2 = 7 15/2 = 7 16/2 = 8 : : Mit ein wenig Nachdenken findet man dann den Trick von ((zahl/2)*2) leicht heraus.
Lothar M. schrieb: > HildeK schrieb: >> Ich habe es mal für einen Anfänger etwas umgeschrieben > Leider ist dieses Beispiel zwar vollkommen korrekt, aber jetzt nicht > das, was das Bild oben vorgaukelt. > Natürlich könnte man sagen, dass diese Shifts ja quasi genau diese > Divisionen sind, aber formal "korrekt" müsste es so aussehen: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
> Dabei muss man natürlich beachten, dass "zahl" ein ganzzahliger Wert > ist, bei dessen Division der Rest abgeschnitten wird: > : > : > 11/2 = 5 > 12/2 = 6 > 13/2 = 6 > 14/2 = 7 > 15/2 = 7 > 16/2 = 8 > : > : > Mit ein wenig Nachdenken findet man dann den Trick von ((zahl/2)*2) > leicht heraus. Was mach ich den jetzt noch falsch warum wird mir die BInärzahl nicht nicht ausgegeben. Bin grad komplett lost, sorry #include <stdio.h> int main(){ int zahl; float i; float ergebnis; printf("\nGeben Sie bitte eine ganze Zahl ein: "); scanf("%i", &zahl); for (i=0; i<8; i++) { if ( zahl != ((zahl/2)*2) ) // wenn bei der Division ein Rest auftreten wird ergebnis = 1; // --> Rest = 1 else ergebnis = 0; // --> kein Rest zahl = zahl/2; } printf("Die Binärzahl lautet:", ergebnis); }
Taw U. schrieb: > Was mach ich den jetzt noch falsch warum wird mir die BInärzahl nicht > nicht ausgegeben. bitte lerne, deine "interaktion" mit dem mitlesenden Publikum zu präzisieren. "Binärzahl wird nicht ausgegeben": Das ist zu wenig Information! beschreibe: Was war deine Eingabe? was hättest du erwartet als Ausgabe? Was wird statt dessen ausgegeben?
Taw U. schrieb: > was heißt denn hier diese uint8_t, diese var oder auch cout<<0 > also jetzt bin ich noch mehr durcheinander :) cout ist ein C++ Kommando - damit brauchst Du Dir den Rest gar nicht mehr anzuschauen, weil der TO eine Binärzahlberechnung in C und nicht in C++ haben möchte.
Gast
#6507787
die Frage ist halt wie du diese Binärzahl darstellen willst. Als String? Wenn die Zahl nicht "riesig" ist, dann kann man sie auch als eine Zahl abspeichern. Man berechnet den Rest (wie auf der Skizze) und addiert diese Zahlen auf (aber gewichtet). Dadurch wird die Zahl gedreht (wie auf der Skizze).
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Taw U. schrieb: > #include <stdio.h> > > int main(){ > int zahl; > float i; > float ergebnis; > > printf("\nGeben Sie bitte eine ganze Zahl ein: "); > scanf("%i", &zahl); > > for (i=0; i<8; i++) > { > if ( zahl != ((zahl/2)*2) ) // wenn bei der Division ein Rest > auftreten wird > ergebnis = 1; // --> Rest = 1 > else ergebnis = 0; // --> kein Rest > zahl = zahl/2; > } > printf("Die Binärzahl lautet:", ergebnis); > > } Du setzt hier u.a. den Zählindex i als float an ... das ist schon mal falsch. Ich würde mit switch ... case Statement arbeiten anstatt mit if ... then ...else - Geschmackssache. Auch in C gibt es einen Modulo-Operator, jedoch nur für Typ Integer: https://manderc.com/operators/modoperator/index.php Diesen Operator könntest Du aber dennoch für die Berechnung verwenden. Sorry, das Programm ist nicht mein Problem, es gibt viele Wege zum Ziel - deshalb werde ich es auch nicht lösen.
Gast
#6507798
Robert K. schrieb: > Taw U. schrieb: >> was heißt denn hier diese uint8_t, diese var oder auch cout<<0 >> also jetzt bin ich noch mehr durcheinander :) > > cout ist ein C++ Kommando - damit brauchst Du Dir den Rest gar nicht > mehr anzuschauen, weil der TO eine Binärzahlberechnung in C und nicht in > C++ haben möchte. Er hat doch schon lange ein Beispiel in c bekommen...
Taw U. schrieb: > Brauche Tipps bzw. Hilfe bei der Berechnung von binärzahlen in C ! > Wie kann ich das mit den simplesten Befehlen machen ? eigentlich ist Dein Problem mehr als albern bzw. offenbar will hier jeder Poster das Rad neu erfinden? Kann das sein? Einmal Suchmaschine anwerfen ergibt schon die Lösung: https://www.javatpoint.com/c-program-to-convert-decimal-to-binary Sorry Leute, aber das Forum wird immer mehr zum Armutszeugnis ):
Erwin D. schrieb: > Er hat doch schon lange ein Beispiel in c bekommen... richtig, und die Lösung bekam er jetzt von mir! ... und ich habe mich noch nicht mal bemüht :(
Taw U. schrieb: > Was mach ich den jetzt noch falsch warum wird mir die BInärzahl nicht > nicht ausgegeben. Bin grad komplett lost, sorry ergebnis wird immer wieder überschrieben und nirgendwo ausgegeben.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
PS: bei dem Fertigprogramm meines Links fehlt noch eine abschließende Klammer } im Quellcode. Wenn man die gesetzt hat, funktioniert das Programm ... viel Spaß damit :-)
Gast
#6507861
Ben S. schrieb: > Deine Schleife zählt von 8 bis 1 und nicht von 7 bis 0. Ja, leider. 🙄
Noch ne Variante:
1 | |
2 | |
3 | |
4 | |
5 | |
Gast
#6507875
So nett? Zum Freitag? Hausaufgaben?
Peter D. schrieb: > Noch ne Variante: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Aus welchem Buch hast du's geklaut? Bei mir ists ein Data Becker Progmmierbuch aus den 90ern :D
M. K. schrieb: > Aus welchem Buch hast du's geklaut? Ich habs einfach so hingeschrieben. Zuerst hatte ich:
1 | |
2 | |
Das !! ist so eine Funktion, die man nicht mehr aus dem Kopf kriegt, wenn man sie einmal gesehen hat. Sie wirkt auf den ersten Blick nutzlos, danach aber sehr elegant.
Gast
#6507969
Peter D. schrieb: > Das !! ist so eine Funktion ! ist die Negierung eine boolschen Ausdrucks. !! ist die doppelte Negierung. Hier will man den Seiteneffekt nutzen, dass alle Zahlen ungleich 0 zu 1 werden.
Gast
#6507994
Peter D. schrieb: > Ich habs einfach so hingeschrieben. Ich weiß ja, dass du immer hocheffiziente Schreibweisen auf Lager hast. Aber da der TO bereits Verständnisprobleme beim 'uint8_t' und den Variablennamen 'var' nicht als solchen erkannt hatte, wird ihm das sicher nicht weiterhelfen. Ich profitiere schon gelegentlich von deinen Codeschnipsel ...
Gast
#6508334
Taw U. schrieb: > moin, ich wollte ein Programm schreiben was eine eingegebene Zahl in > eine 8 bit Dualzahl umwandelt verstehe aber grad nicht wie ich die > Rechnung codieren soll in C und ebenfalls wie ich die Ausgabe umgekehrt > mache ? > > Brauche Tipps bzw. Hilfe bei der Berechnung von binärzahlen in C ! Nein, du brauchst keinerlei Tipps in C, sondern du brauchst etwas an eigenem Nachdenken über Herangehensweisen, Algorithmen und die Darstellung von Zahlen. das ist es, was du brauchst. 1. Die Zahlen als solche, also hier mal positiv definite ganze Zahlen. also von 0 über 1, 2, 3, ... bis fast unendlich. Konkret bis zu der Grenze, die durch deine rechnerinterne Darstellung gegben ist. In ein Byte passen da Zahlen 0..255 hinein, in ein int dann dasselbe mal 256 und so weiter. 2. Negative Zahlen: das Zweierkomplement. Wiel muß eine Zahl in einem CPU-Register aussehen, damit beim Addieren von 1 eine 0 herauskommt? --> Selbststudium. 3. Menschlich lesbare Zahlen: Das sind aus Sicht des Rechners gar keine Zahlen, sondern Text. Also 1 oder mehrere Textzeichen gelle? Um die dem Rechner verständlich zu machen, muß man sie konvertieren. (ich benutze hier mal ne hypothetische Programmiersprache) Fall a: Dezimalzahlen: while Textzeichen not in ('0'..'9') do hole nächstes Zeichen Ergebnis = 0 while Textzeichen in ('0'..'9') do { Ergebnis = (Ergebnis * 10) + (Textzeichen - '0'); hole nächstes Zeichen } Fall b: Hexadezimale Zahlen: derselbe Algorithmus, aber zusätzlich noch das Berücksichtigen von 'A'..'F' bzw. 'a'..'f' und die Multiplikation nicht mit 10, sondern mit 16 Fall c: Binärzahlen: derselbe Algorithms wie a: aber nur Zeichen '0'..'1' zu berücksuchtigen. Multiplikation mit 2, was man technisch auch durch einfache Linksverschiebung machen kann. So. Das war's Prinzip für Eingabe-Konvertierungen. Ausgabekonvertierungen: Da gibt's 2 Herangehensweisen, die für unterschiedliche Hardware verschieden effektiv sind. a) Abzählen. Das geht wie das schriftliche Dividieren, was du ja in der Schule gelernt hast. Für das Byte also Ziffer = '0' while Zahl >0 {Zahl = Zahl - 100); increment Ziffer; } Zahl = Zahl + 100; // rückstellen Ziffer ausgeben Ziffer = '0'; while Zahl >0 {Zahl = Zahl - 10); increment Ziffer; } Zahl = Zahl + 10; // rückstellen Ziffer ausgeben Ziffer = Zahl + '0'; Ziffer ausgeben b) Division mit Rest, was bei den üblichen Arithmetik-Laufzeitroutinen als Funktion dabei ist. Also solange durch 10 teilen, bis Variable Null ist und jeweils den Divisionsrest als Ziffer hernehmen. Also lerne zuerst mal die Herangehensweisen. Das Hinschreiben in irgend einer Programmiersprache ist nachrangig. W.S.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
