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ürx
umformulieren und sie aus denmax_bits
ermitteln.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 % 2
gleichbinaer[i]
?"), dessen Ergebnis (true
oderfalse
) 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
0
bis7
laufen zu lassen, lass sie einfach rückwärts von7
bis0
laufen.
Bzw. an @wob s Vorschlag angelehnt vonmax_bits - 1
bis0
.Andere Möglichkeit: Lass die Schleife wie sie ist und verwende statt den Index
i
den 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 !