[c++] dezimal --> binär

DarkSean

Erfahrenes Mitglied
Ich habe ein zum Umrechnen von Dezimalzahlen in Dualzahlen geschrieben. Bis jetzt soll es mit allen geraden Zahlen die größer als 0 funktionieren. Klappt soweit auch, allerdings scheint es nur mit den Zweierpotenzen zu funktionieren. Außerdem funktionieren noch alle Zahlen von 1 - 8. Ich saß jetzt schon über eine Stunde an dem Programm um den Fehler zu finden, jedoch vergebens. Ich hoffe ihr könnte mir helfen.
Code:
#include <iostream>
#include <conio.h> //Zum offenhalten des Konsolenfensters
#include <cmath>
#include <cstring>

using namespace std;

long double dez, dez2;//dez: Eingabe der Dezimalzahl, dez2: Dezimalzahl, mit der gerechnet wird
bool killzero;//Variable zur Beseitigung der Nullen vor der eigentlichen Zahl
long double ex, i; //ex: Exponent der Zweierpotenzen, i: Laufvariable
string dua; //Letztendliche Binärzahl
int end=0; //Wird benutzt um das Programm in eine Endlosschleife zu stecken


int zero()
{
    for (i=ex; i >= 0; i=i-1)
        dua = dua + '0';
}

int main()
{
    cout << "Umwandeln von Dezimalzahlen in Dualzahlen" << endl
         << "© 2006 Oliver Sabiniarz" << endl
         << "Geben Sie eine Dezimalzahl ein: ";
    cin  >> dez;
    killzero=1; 
    dez2=0;
    ex = 61;
    dua="";
    while (ex >=-60)
    {
          ex=ex-1;
          if (dez2+pow(2,ex) == dez)
          {
               dua = dua + '1';
               ex=ex-1;
               zero();
               goto output;
          }
          else if (dez2+pow(2,ex) < dez)
          {
               killzero=0;
               dua = dua + '1';
               dez2 = dez2 + pow(2,ex);
          }
          else if (dez2+pow(2,ex) > dez)
          {
               if (killzero=0)
                  dua = dua + '0';
          }             
    }
output: cout << dua;
    getch();
}
 
Das Prinzip der Konvertierung von Dezimal in Binär lautet ja die Zahl solange durch 2 Teilen bis nichts mehr übrig bleibt.
Bleibt bei der Divison durch 2 kein Rest ist die nächste Stelle 1; Existiert ein Rest heißt es 0. Die Funktion natürlich rekrusiv aufrufen um bis zum Schluss weiter zu rechnen:

C++:
#include <iostream>
using namespace std;

void PrintBin(int i);

int main() 
{
	int iEingabe = 0;

	cout << "Geben Sie eine Zahl ein welche Konvertiert werden soll" << endl;
	cout << "Eingabe: ";
	cin >> iEingabe;
	cout << "Zahl in Binaer: " << endl;
	PrintBin(iEingabe);
	cout << endl;
	system("pause");
	return 0;
}

int PrintBin(int i)
{
	if (i!=0) {
		PrintBin(i/2);
		if ((i % 2) == 0) {
			cout << "0";
		}
		else {
			cout << "1";
		}
	}
}
 
Dann ist mein Programm ja viel zu kompliziert :rolleyes:
Wobei, dein Algorithmus kommt nur mit natürlichen Zahlen zurecht. Ich nöchte mein Progamm so erweitern dass es auch mit allen rationalen Zahlen funktioniert. Bei Visual Basic hat es auch wunderbar geklappt, nur hier nicht. :(
~edit~
Habe meinen Fehler doch selber gefunden:
C++:
if (killzero==0)
 cout << "0";
Da mussten einfach zwei Gleichheitszeichen hin, bin leider noch an VB gewöhnt^^

~edit 2~
Habe das Programm gerade fertiggestellt, funktioniert mit allen rationalen Zahlen von 2^60 bis 2^-60.
C++:
#include <iostream>
#include <cmath>
#include <cstring>

using namespace std;
char janein;
long double dez, dez2;//dez: Eingabe der Dezimalzahl, dez2: Dezimalzahl, mit der gerechnet wird
bool killzero;//Variable zur Beseitigung der Nullen vor der eigentlichen Zahl
long double ex, i; //ex: Exponent der Zweierpotenzen, i: Laufvariable
bool end=0; //Wird benutzt um das Programm in eine Endlosschleife zu stecken


int zero()
{
    for (i=ex; i >= 0; i=i-1)
        cout << "0";
}

int main()
{
    cout << "Umwandeln von Dezimalzahlen in Dualzahlen" << endl
         << "© 2006 Oliver Sabiniarz" << endl;
while (end == 0)
{
    cout << "Geben Sie eine beliebige Dezimalzahl ein: ";
    cin  >> dez;
    killzero=1; 
    dez2=0;
    ex = 61;
    cout << endl << "Dual = ";
    if (dez == 0)
    {
       cout << "0";
       goto weiter;
    }
    if (dez < 0)
    {
            cout << "-";
            dez=-dez;
    }        
    while (ex >=-60)
    {
          ex=ex-1;
          if (ex == -1)
          {
             if (killzero == 0)
             {
                 cout << ".";
             }
             else
             {
                 killzero=0;
                 cout << "0.";
             }
                 
          }
          if (dez2+pow(2,ex) == dez)
          {
               cout << "1";
               ex=ex-1;
               zero();
               goto weiter;
          }
          else if (dez2+pow(2,ex) < dez)
          {
               killzero=0;
               cout << "1";
               dez2 = dez2 + pow(2,ex);
          }
          else if (dez2+pow(2,ex) > dez)
          {
              if (killzero==0)
                  cout << "0";
          }             
    }
weiter: cout << endl << endl << "Wollen Sie eine weitere Rechnung machen? (J/N)";
    cin  >> janein;
    end = 1;
    switch (janein)
    {
           case 'J':
                end = 0;
                break;
           case 'j':
                end = 0;
                break;
           case 'N':
                end = 1;
                break;
           case 'n':
                end = 1;
    }
    cout << endl;
system ("pause");
cout << endl;
}
}
 
Zuletzt bearbeitet:
ZUgegeben, ich hab grad einfach Langeweile... Daher bin ich mal so dreist und sag etwas zu Deinem Programmierstil. Solltest Du ernsthaft darüber nachdenken C++ programmieren lernen zu wollen, dann lies mal weiter. Andernfalls, vergiß dieses Posting einfach ;)

1. Vermeide globale Variablen
Sicher braucht man sie manchmal, aber der Grundgedanke von C++ besteht darin, Information und dazugehörige Funktion zu kapseln, globale Variablen aber machen das Gegenteil, sie machen Daten Programmweit sichtbar.

2. Deklariere Variablen genau da, wo du sie brauchst. z.B. in deiner zero-funktion das i sollte auch in dieser funktion deklariert sein, am besten gleich in der for-schleife, z.B.
for( int i=0; i<10; ++i)...

3. Vermeide goto
Es gibt mehr als genug Diskussionen warum goto in c++ als evil gilt. In 99 von 100 Fällen kann man ein goto durch eine vernünftige Programmstruktur ersetzen, in Deinem Fall z.B. durch einfache Nutzung des "break" um die Schleife zu verlassen.


All diese Punkte haben einen gemeinsamen Nenner. Es geht darum, ein Programm leserlich zu machen und späterres debuggen/erweitern zu ermöglichen. Bei einem solchen 10-Zeiler wie Deinem mag das Dir ja wirklich unerheblich erscheinen, aber schlechten Programmierstil gewöhnt man sich halt im Kleinen an und tut sich dann schwer ihn später abzulegen wenn die Programme mal größer werden. Wenn die globalen variablen 10 Zeilen höher stehen sieht man das Problem sicher nicht, aber ab 1000 Zeilen sourcecode ist es mit der Leserlichkeit dann endgültig vorbei.
 
Mal ne dumme Frage...kann man in C++ es nicht einfach als Binär ausgeben anstatt dezimal? Schließlich speichert er es ja auch binär.

Oder sollte es nur als Übung gelten?

P.S.: Bei Java kann man einfach sagen Integer.toBinaryString(int zahl) oder to String (int zahl,int asterix)
 
jsendrow hat gesagt.:
ZUgegeben, ich hab grad einfach Langeweile... Daher bin ich mal so dreist und sag etwas zu Deinem Programmierstil. Solltest Du ernsthaft darüber nachdenken C++ programmieren lernen zu wollen, dann lies mal weiter. Andernfalls, vergiß dieses Posting einfach ;)

1. Vermeide globale Variablen
Sicher braucht man sie manchmal, aber der Grundgedanke von C++ besteht darin, Information und dazugehörige Funktion zu kapseln, globale Variablen aber machen das Gegenteil, sie machen Daten Programmweit sichtbar.

2. Deklariere Variablen genau da, wo du sie brauchst. z.B. in deiner zero-funktion das i sollte auch in dieser funktion deklariert sein, am besten gleich in der for-schleife, z.B.
for( int i=0; i<10; ++i)...

3. Vermeide goto
Es gibt mehr als genug Diskussionen warum goto in c++ als evil gilt. In 99 von 100 Fällen kann man ein goto durch eine vernünftige Programmstruktur ersetzen, in Deinem Fall z.B. durch einfache Nutzung des "break" um die Schleife zu verlassen.


All diese Punkte haben einen gemeinsamen Nenner. Es geht darum, ein Programm leserlich zu machen und späterres debuggen/erweitern zu ermöglichen. Bei einem solchen 10-Zeiler wie Deinem mag das Dir ja wirklich unerheblich erscheinen, aber schlechten Programmierstil gewöhnt man sich halt im Kleinen an und tut sich dann schwer ihn später abzulegen wenn die Programme mal größer werden. Wenn die globalen variablen 10 Zeilen höher stehen sieht man das Problem sicher nicht, aber ab 1000 Zeilen sourcecode ist es mit der Leserlichkeit dann endgültig vorbei.
Danke für dein Posting, werd versuchen mir versuchen das anzugewöhnen. Ich dachte mit break; würde man die Funktion verlassen, deshalb hab ich das goto benutzt.
 
Anime-Otaku hat gesagt.:
Mal ne dumme Frage...kann man in C++ es nicht einfach als Binär ausgeben anstatt dezimal? Schließlich speichert er es ja auch binär.

Oder sollte es nur als Übung gelten?

P.S.: Bei Java kann man einfach sagen Integer.toBinaryString(int zahl) oder to String (int zahl,int asterix)
Es sollte eigtl. als Übung gelten. Aber kann Java das auch mit Gleitkommawerten? Darum gings mir nämlich hauptsächlich.
 
Hallo,
ich habe ein ähnliches Problem! Ich soll für eine Übung zu meiner Informatikvorlesung in c++ ein Programm schreiben, das eine Binärzahl in eine Dezimalzahl umwandelt und das Ergebniss in einem Array ausgibt. Bei mir funktioniert das aber irgendwie nciht so ganz. Wenn ich das ohne Array mache, spuckt der Programm, wenn ich das im cmd ausführe, nur eine 1 oder eine 0 aus. Wenn ich das mit dem Array ausgebe (wies in dem Folgenden Quelltext ist) kommen lauter wirre Zahlen. Vielleicht könnt ihr euch meinen Programm-Code ja mal anschauen und mir sagen wo der Fehler liegt, oder ob ich sogar vollkommenen Mist geschrieben hab (Das Grundgerüst war vom Prof vorgegeben):

C++:
#include <iostream> 
#include <cmath>    //definiert u.a. die Funktion float pow( float base, float exponent)

using namespace std;

int main(int argc, char* argv[])
{
	int x=34; //34 Dezimalzahl die umgerechnet werden soll
	
	//Das Array in das die einzelnen Bits geschrieben werden sollen.
	//Hinweis: speichert das niederwertigste Bit in feld[0] und das höchstwertige in feld[7]!
	int feld[8]; 
	
	//Ihre Loesung
	for (int i=0; i<8; i++) {
	    if (x<256 && x>=0) {
            if (x!=0) {
                for (int a=x; a=0;) {
                    a/2;
                    if ((x%2)==0) {
                        cout << "0";
                    }
                    else {
                        cout << "1";
                    }              
                }
            }
            else {
                cout << "0";
            }
        }
        else {
            cout << "nicht Definiert";
        }
        cout << feld[i] << " ";
     }      
	
	return 0;
}
 

Neue Beiträge

Zurück