c++ dezimal zu binär (Fehler im code)

Gast #2516917
Lesenswert?

hi hoffe Ihr könnt mir helfen :)

habe mal hinter jedem Vorgang ein kommentar hinterlassen damit ihr es 
versteht :)
 Mein Problem: ich bekomme die while Schleife nicht richtig zu laufen :/
er gibt mir in der Konsole nur 1 oder 0 raus aber kein ganzes Byte.
Hoffe ihr wisst wo der Fehler liegt.



#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
int w = 1, rest, eingabe, bin = 0, q=1, max = 9;

cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest; //eingabe der Dez. Zahl
while(w<max) // soll 8 mal wiederholt werden
{
rest = rest%2; // rest ist = 1 oder 0
w = w++; // auf w wird 1 inkrementiert
   if(rest<=1) // wenn der rest größer oder gleich 1 ist
    bin + q;  // addiere 1 auf bin
   else
     bin + 0;
q = q*10; // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << rest; //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
Gast #2516946
Lesenswert?

Sorry das ich das mal so sagen muss, aber der Code ist Scheisse.

Auch wenn es so vielleicht funktionieren mag, das ist so richtiges 
Ghetto-C.

Im einzelnen:

1. Einrücken (ja, immer und auf jeden Fall)
2. Klammern setzen bei if und else (um dangling else zu verhindern)
3. Eine Zeile pro Deklaration
4. Variablen initialisieren
5. Variablen richtig deklarieren (w nicht als int sondern z.B. als 
unsigned char)
6. statt "while(w<max)" besser "while (w < max)"
7. w = w++; (ohne worte)
8. was soll das doppelte "cin.get()"

ohne Anspruch auf Vollständigkeit....
Gast #2516993
Lesenswert?

@ sebastian
ah natürlich, manchmal hat man echt nen brett vorm kopf,
mhh funktioniert immer noch nicht :/

@Klaus ja ich weiß das hatte ich auch erst so aber da ich anfänger bin 
bin ich schnell verunsichert :/

@Speedy
Ja ich weiß :)
ich bin noch glatter Anfänger danke für deine Tipps, aus Fehlern lernt 
man besser ich werde die mal abarbeiten :)
PS: bei einem cin.get(); schließt sich das Konsolenfenster sofort nach 
eingabe der Zahl, bei 2 nicht.

werde mich gleich erneut melden;
Habe alles geändert, aber es will einfach nur 1 oder 0 anzeigen 
ichverstehe es nicht :(

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
int rest = 0, bin = 0, max = 9;
char w = 1, q = 1;
cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest; //eingabe der Dez. Zahl
while(w < max) // soll 8 mal wiederholt werden
{
rest = rest%2; // rest ist = 1 oder 0
w++; // auf w wird 1 inkrementiert
   if(rest<=1) // wenn der rest größer oder gleich 1 ist
   {bin + q;}  // addiere 1 auf bin
   else
   {bin + 0;}
q = q*10; // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << bin; //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
Gast #2517003
Lesenswert?

Jan schrieb:
>     bin + q;  // addiere 1 auf bin

Dieser Code hat keinen Effekt, und ...

>      bin + 0;

dieser erst recht nicht. Du rechnest da nur aus, was rauskommt, wenn du 
zu bin q dazuaddierst, dann schmeißt du das Ergebnis ungesehen weg. Hast 
du da keine Warnung vom Compiler erhalten?

Speedy schrieb:
> 5. Variablen richtig deklarieren (w nicht als int sondern z.B. als
> unsigned char)

Warum sollte unsigned char besser sein als int?
#2517038
Lesenswert?

Jan schrieb:
> @rolf
> doch habe ich aber ich wusste nicht wieso,
> warum schmeiss ich es denn umgehend weg?

weil du nichts mit dem Ergebnis tust!


du rechnest

   5 + 3

schön.
Und?
Nix und. Es gibt kein und. Da kommt irgendein Ergebnis aus, aber du tust 
nichts damit.
zb in einer Variablen speichern

   i = 5 + 3;

oder direkt ausgeben

   printf( "%d", 5 + 3 );

oder das Ergebnis an eine Funktion weitergeben

   MeineFunktion( 5 + 3 );

das alles sind Beispiele, bei denen mit dem Ergebnis etwas gemacht wird.

Aber bei

   5 + 3;

tust du nichts mit dem Ergebnis. Du lässt es ausrechnen und dann 
verschwindet es auf nimmer wiedersehen im Bithimmel.
Gast #2517057
Lesenswert?

so okay ich komme weiter aber noch nciht ganz,
er gibt jetzt immer 11111111 aus egal welche Zahl, aber meckern tut der 
compiler nicht mehr :) Und nochmal großen Dank für eure Hilfe ^^
hier der neue code, habe ihn etwas verfeinert

// deztobin.cpp : Definiert den Einstiegspunkt für die 
Konsolenanwendung.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
int rest = 0, bin = 0, max = 8, i = 0, w = 0, q = 1, leer = 0;

cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest;    //eingabe der Dez. Zahl
while(w < max)    // soll 8 mal wiederholt werden
{
rest = rest%2;    // rest ist = 1 oder 0
w++;      // auf w wird 1 inkrementiert
   if(rest<=1)    // wenn der rest größer oder gleich 1 ist
   {i+= q;}    // addiere 1 auf bin
   else
   {i+= leer;}
q = q*10;    // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << i;    //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
Gast #2517098
Lesenswert?

// Convert a decimal integer do a binary string
    // added a test printf() you can remove later
    // Turbo C modified for Pelles C vegaseat 19nov2004

    #include <stdio.h>

    void dec2bin(long decimal, char *binary);

    int main()
    {
    long decimal;
    char binary[80];

    printf("\n\n Enter an integer value : ");
    scanf("%ld",&decimal);
    dec2bin(decimal,binary);
    printf("\n The binary value of %ld is %s \n",decimal,binary);

    getchar(); // trap enter
    getchar(); // wait
    return 0;
    }

    //
    // accepts a decimal integer and returns a binary coded string
    //
    void dec2bin(long decimal, char *binary)
    {
    int k = 0, n = 0;
    int neg_flag = 0;
    int remain;
    int old_decimal; // for test
    char temp[80];

    // take care of negative input
    if (decimal < 0)
    {
    decimal = -decimal;
    neg_flag = 1;
    }
    do
    {
    old_decimal = decimal; // for test
    remain = decimal % 2;
    // whittle down the decimal number
    decimal = decimal / 2;
    // this is a test to show the action
    printf("%d/2 = %d remainder = %d\n", old_decimal, decimal, remain);
    // converts digit 0 or 1 to character '0' or '1'
    temp[k++] = remain + '0';
    } while (decimal > 0);

    if (neg_flag)
    temp[k++] = '-'; // add - sign
    else
    temp[k++] = ' '; // space

    // reverse the spelling
    while (k >= 0)
    binary[n++] = temp[--k];

    binary[n-1] = 0; // end with NULL
    }


mfg
#2517138
Lesenswert?

Jan schrieb:
> ach sehe grade habe die kommentare noch nicht angepasst also einfach
> ignorieren :)

Die ignorieren wir sowieso.
Weil deine Kommentare, so wie bei allen Neulingen, sinnlose Kommentare 
sind.

Mio hat weiter oben den meiner Meinung nach wichtigsten Tip gegeben:

Erfinde eine Zahl und geh dein Programm selber durch (du spielst 
Computer).
Schnapp dir Papier und Bleistift und mach alle Anweisungen, die dir dein 
Programm vorschreibt. Dein Einstieg ist nach
  cin >> rest;
Welche Beleung haben zu diesem Zeitpunkt deine Variablen, das schreibst 
du dir auf einem Papier auf und ab dort übernimmst jetzt du das Kommando 
und arbeitest dein Programm Befehl für Befehl weiter durch. Du machst 
genau das, und nur genau das, was der Programmtext von dir fordert.

Das hat dann auch den Vorteil, dass du ein wenig Gefühl dafür bekommst, 
was die Anweisungen eigentlich machen (und ich hoffe mal, du weißt 
wenigstens in der Theorie was jede Anweisung für sich alleine gesehen 
eigentlich tun soll)
#2517152
Lesenswert?

Jan schrieb:
> @klaus einfach ignorieren ind er klammer stand auch mal was anderes ;),
> es hat mal gepasst^^

Schon.
Aber der Kommentar an sich ist SChwachsinn.

Warum soll ich mir zu

  if( rest <= 1 )

als Kommentar dazuschreiben: Wenn rest kleiner oder gleich 1 ist.
Das diese Operation hier passiert, das sehe ich im Source Code genau so 
gut. Das brauch ich mir nicht dazuschreiben.

Du malst ja auch nicht ein rotes Kästchen auf Papier und schreibst dann 
daneben hin, das das jetzt ein rotes Kästchen ist.
Gast #2517183
Lesenswert?

Klaus schrieb:
> und übrigens:
>
>     rest = rest%2;
>
> schaut schon wieder aus wie:
>
>     rest = rest++;

Ist es aber nicht. rest = rest++ ist undefiniertes Verhalten,
rest = rest%2 ist sehr wohl definiert. Ob es jetzt in diesem Kontext 
eine sinnvolle Rechnung ist, ist nochmal eine andere Sache.

Jan schrieb:
> so okay ich komme weiter aber noch nciht ganz,
> er gibt jetzt immer 11111111 aus egal welche Zahl, aber meckern tut der
> compiler nicht mehr :)

> cin >> rest;    //eingabe der Dez. Zahl
> while(w < max)    // soll 8 mal wiederholt werden
> {
> rest = rest%2;    // rest ist = 1 oder 0

Überleg dir mal, was hier passiert. Was wird beim ersten 
Schleifendurchlauf nach dieser Zeile aus rest? Was bedeutet das für die 
nachfolgenden Durchläufe?
Gast #2517707
Lesenswert?

So danke nochmal :) jetzt klappt es :)
meine Fehler:
0 bzw. werden auf rest gespeichert damit rechne ich ja weiter habe dden 
int eingabe hinzugefügt und denn dahinter immer durch 2 geteilt ^^
und der vergleichs operator <= wurde auf >= um geändert :)
jetzt Zeigt er mir die Binomische Zahl richtig von rechts nach links an 
:) heir nochmal jetzt der Frische code
@ usr
danke aber erstens ist der mir zu kompliziert und 2. macht es ja dann 
keinen spaß wenn man einen fertigen code bekommt :)

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
int rest = 0, bin = 0, max = 8, i = 0, w = 0, q = 1, leer = 0, eingabe = 
0;

cout << "\n\geben sie eine zahl kleiner als 256 ein: ";
cin >> eingabe;
while(w < max)
{
rest = eingabe%2;
eingabe = eingabe/2; // eingabe reingeholt um richtig weiter zu rechnen 
:)
w++;
   if(rest>=1)  // vorher <=
   {i = i + q;}
   else
   {i = i + leer;}
q = q*10;
}
cout << i;
cin.get();
cin.get();
main();
return 0;
}
Gast #2518607
Lesenswert?

Man Speedy, nicht jeder kann als so ein Programmiergott wie Du auf die 
Welt kommen.

Es hat sich im Laufe des Threads ja wohl herausgestellt das Jan Anfänger 
ist.
Man probiert, macht Fehler und lernt aus Fehlern. Man lernt nicht, wenn 
man mit arrogant wirkenden Postings belegt wird - das frustriert eher.

Hilfreicher, und didaktisch sinnvoller wäre es doch gewesen, Jan zu 
fragen warum er diese Anweisung im Code hat und warum sein Programm dann 
doch keine führenden 0-en ausgibt, die er ja wohl beabsichtigt hat.
Und vielleicht hätte er dann auch verstanden, dass seine Vorstellung zum 
Inhalt von i falsch ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren