Hilfe bei Umwandlung von Dezimal in Binär
-
Moin,
mein Name ist Florian und ich studiere Maschinenbau im ersten Semester.
Ich hatte eine Einführung in C++ und soll jetzt ein Programm von Dezimal in Binärzahlen schreiben. Ich weiß, dass das schon etliche Male beantwortet wurde, ich habe nur zwei Probleme:Ich soll dass Array mit Hilfe einer Schleife ausgeben (bei mir kommt z.B bei einer 6 als Dezimalzahl eine 2 vor) und bei mir kommen die Zahlen falschrum raus. Vielmehr als Schleifen, Arrays etc. hatten wir noch nicht.
Das hier habe ich schon fabriziertint main (){
int x;
std::cin >>x;
if (x>255||x<0){
std::cout<< "out of bounds" << std::endl;
return 0;} int binaer [8]; for (int i = 0;i < 8;i++) { if (x%2 == 0) { binaer[8]=0; } else { binaer[8]=1; } x=x/2; int h; for(h=0; h<=8;h++) ; std::cout<<binaer [h] ; }Es wäre super, wenn mir trotzdem jemand helfen könnte.
Ich hätte auch gerne einen Tipp, wie ich mir am besten C++ aneignen kann.
Schönen Abend noch
Florian
-
Du musst in Zeile 8 und 12 als Index im Array auch die Laufvariable i verwenden.
-
Hi! Ein paar Kommentare zu deinem Code (habe mir die Freiheit genommen, den etwas angenehmer zu formatieren):
@SBHH sagte in Hilfe bei Umwandlung von Dezimal in Binär:
int main (){ int x; std::cin >>x; // Vorzeitiges 'return', das finde ich gut! // Das kannste dir ruhig angewöhnen - trägt m.E. zur besseren // Verständlichkeit bei und vermeidet oft zu tiefe 'if'-Schachtelungen, // bei denen niemand mehr durchblickt. if (x>255||x<0){ // Eine Alternative wäre, Fehler auf std::cerr auszugeben, auch wenn das // hier jetzt nicht wirklich wichtig ist. So kann man Fehler und Warnmeldungen // von der eigentlichen Ausgabe des Programms trennen - das ist hilfreich für // Skripte und andere Programme, die dein Programm aufrufen. std::cout<< "out of bounds" << std::endl; // Vielleicht möchte man im Fehlerfall wenn überhaupt etwas anderes // als 0 zurückgeben. Die 0 steht normalerweise für "Kein Fehler". Das // ist aber für so eine Übung auch nicht wirklich wichtig, dennoch mal // erwähnenswert. return 0; } int binaer [8]; for (int i = 0;i < 8;i++) { // Hier ein Tip für die "Kür". Die Werte, die du in das Array // schreibst, sind exakt das Ergebnis der Berechnung 'x % 2' // Das könnte man also theoretisch komplett ohne 'if' formulieren. // Auch wenn das für Anfänger nicht wirklich relevant ist, aber // wenn man auf "Branches" ('if' und sowas) so einfach wie hier // verzichten kann, dann ist es nicht verkehrt, das auch auszunutzen. // Das ist nicht selten für die Performance förderlich :-). if (x%2 == 0) { // wie @axels bereits erwähnte, verwende hier deine Laufvariable 'i' binaer[8]=0; } else { // s.o. binaer[8]=1; } x=x/2; // hier fehlt ein '}', um den Block des Schleifenkörpers abzuschließen. // Dieses 'h' kann man auch wie das 'i' in der vorherigen Schleife // direkt im Schleifenkopf deklarieren - for (int h = 0; ... ). // Das spart eine Zeile und macht die Variable 'h' auch nur innerhalb // der Schleife gültig. Das ist übrigens auch der Grund, weshalb du // hier auch problemlos wieder den Variablennamen 'i' verwenden // könntest: das 'i' aus der vorherigen Schleife existiert nur innerhalb // des Schleifenkörpers (Stichwort 'scope'). int h; // Das Semikolon am Ende der 'for'-Anweisung führt dazu, dass du // damit einen leeren Schleifenkörper definierst. D.h. das nachfolgende // 'std::cout<<binaer [h]' wird nicht innerhalb dieser Schliefe ausgeführt. // Was du hier geschrieben hast ist dasselbe wie: for(h=0; h<=8;h++) {} for(h=0; h<=8;h++) ; // Ebenfalls: Dein Array ist 8 Elemente lang, hat also nur Indizes von 0..7, // Schau dir nochmal deine Schleifeneintrittsbedingung an. Die ist nicht // ganz korrekt und wird auf ein Element ausßerhalb des Arrays zugreifen. // Das ist ein Bug, der je nach Kontext schonmal sicherheitskritisch werden // kann. std::cout<<binaer [h] ; }Habe das jetzt nicht getestet. Gut möglich also, dass ich nochwas übersehen habe

-
@Finnegan sagte in Hilfe bei Umwandlung von Dezimal in Binär:
Gut möglich also, dass ich nochwas übersehen habe
Einen wichtigen Tipp hast du noch vergessen. Sowas hier:
int binaer [8]; (...) for (int i = 0;i < 8;i++)ist sehr leicht fehleranfällig. Wenn du die eine 8 änderst, musst du auch gleich alle 8en an anderen Stellen ändern. Definieren sowas daher als Konstante einmalig.
Also:
const int max_bits = 8;
Und dann verwendest du im folgenden nur nochmax_bits. Das macht es im Code auch gleich klarer, wofür die 8 denn stehen soll. Damit könntest du auch die 255 im Check fürxumformulieren und sie aus denmax_bitsermitteln.Noch ein Hinweis: Die Größe eines C-Style Arrays (dein
binaer) kannst du mit einer Konstanten festlegen, aber nicht mit einer Variablen.
-
Mega cool von euch, hilft mir sehr viel weiter!
Könnte ich also statt if&else einfach schreiben?:
x%2 == binaer [i];
x=x/2;Bekomme ich noch einen Hinweis, wie ich rausfinden kann, wie man die Stellen andersherum aus dem Array abruft?
Nochmal danke

-
@SBHH sagte in Hilfe bei Umwandlung von Dezimal in Binär:
Mega cool von euch, hilft mir sehr viel weiter!
Könnte ich also statt if&else einfach schreiben?:
x%2 == binaer [i]; x=x/2;Nein, das ist ein Vergleich ("ist
x % 2gleichbinaer[i]?"), dessen Ergebnis (trueoderfalse) du verwirfst, weil du nichts damit machst.
Du willst stattdessen eine Zuweisung haben:binaer[i] = x % 2;Sprich "setze den Wert des i-ten Array-Elements auf das Ergebnis des Ausdrucks
x % 2".Bekomme ich noch einen Hinweis, wie ich rausfinden kann, wie man die Stellen andersherum aus dem Array abruft?
Ja, statt die Ausgabeschleife von
0bis7laufen zu lassen, lass sie einfach rückwärts von7bis0laufen.
Bzw. an @wob s Vorschlag angelehnt vonmax_bits - 1bis0.Andere Möglichkeit: Lass die Schleife wie sie ist und verwende statt den Index
iden Index7 - i, bzw.max_bits - 1 - i... die Schleife selbst rückwärts laufen zu lassen ist aber denke ich die bessere Anfängerübung.
Nochmal danke

Gern

-
Ich habs geschafft

Bist der Beste !