Forum: PC-Programmierung c++ dezimal zu binär (Fehler im code)


von Jan (Gast)


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;
}

von Sebastian Hepp (Gast)


Lesenswert?

Vielleicht solltest du am Ende bin ausgeben, statt rest?

von Klaus (Gast)


Lesenswert?

und w = w++; ist auch nicht gut.

Entweder: w++;
    oder: w=w+1;
    oder: w+=1;


Gruß,
Klaus

von Speedy (Gast)


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....

von Uwe (Gast)


Lesenswert?

> rest = rest%2; // rest ist = 1 oder 0
> :
> if(rest<=1)

rest ist IMMER kleiner oder gleich 1 da rest nur 0 oder 1 sein kann

von Jan (Gast)


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;
}

von XTerminator (Gast)


Lesenswert?

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

Warum?

von Rolf Magnus (Gast)


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?

von Jan (Gast)


Lesenswert?

@rolf
doch habe ich aber ich wusste nicht wieso,
warum schmeiss ich es denn umgehend weg?
wie soll ich das den sonst machen?
MfG

von Karl H. (kbuchegg)


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.

von Jan (Gast)


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;
}

von Jan (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

der Kommentar hat aber noch nie gepasst:

   if(rest<=1) // wenn der rest größer oder gleich 1 ist

Klaus

von Jan (Gast)


Lesenswert?

{i+= q;} erzeugt das gleiche wie i = i + q
daselbe gillt für i+= leer

von Jan (Gast)


Lesenswert?

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

von mio (Gast)


Lesenswert?

Nimm doch mal eine Beispiel-Zahl und geh Deinen Programm-Code von Hand 
durch.

von usr (Gast)


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

von Klaus (Gast)


Lesenswert?

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

soll ich auch ignorieren dass du 8 mal prüfst
ob deine eingebene Zahl gerade oder ungerade ist ?

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

aber ich ignoriere das jetzt mal...

Klaus

von Karl H. (kbuchegg)


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)

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


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?

von Jan (Gast)


Lesenswert?

ah danke euch allen habe den fehler glaube ich gefunden, anstoß durch 
Rolf :) werde es morgen mal ändern :),

von Jan (Gast)


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;
}

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Jan schrieb:
> die Binomische Zahl

ich glaube, du verwendest da den falschen Begriff für das was du da 
errechnet hast ....

von guenther (Gast)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Jan schrieb:
>> die Binomische Zahl
>
> ich glaube, du verwendest da den falschen Begriff für das was du da
> errechnet hast ....

Ja, ja, so sind sie, unsere Berufsschüler, Studenten, Bachelors und 
Masters: "binomisch" nicht von "binär" unterscheiden können... ;-)

von Speedy (Gast)


Lesenswert?

Am geilsten ist immer noch i = i + leer.
Das zeigt das er null kapiert hat war er hier macht.

von Jan (Gast)


Lesenswert?

ja mg ich war müde xD
ich weiß das die binomischen Zahlen aus der Mathematik kommen xD

@speedy was ist daran so falsch es funktioniert doch?
Und ein bischen freundlichkeit schadet nicht ;)

von Speedy (Gast)


Lesenswert?

Was funktioniert?

i = i + leer?

das kann man genausogut weglassen.

Die Konstante leer die hier fälschlicherweise als Variable deklariet 
ist, ist "0".

Addition mit 0.

Weitere fragen?

von mio (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.