Dezimal Binär Konvertierung in beide Richtungen



  • Hallo zusammen,

    http://img5.fotos-hochladen.net/uploads/bildschirmfotous5emtcfh1.png

    Bin dabei diese Aufgabe/n zu lösen und habe einen starken Hänger.

    Dabei soll in der Header Datei nur deklariert werden, dazu eine zugehörige .cpp erstellt werden in der die Methoden void convert() und anscheinend auch GetBinary() und GetDecimal() geschrieben werden.

    In meiner main.cpp steht bisher folgendes:

    #include <iostream>
    #include "Dec2Bin.h"
    #include "Bin2Dec.h"
    using namespace std;
    
    int main()
    {
    	string eingabe;
    	cout << "Geben Sie Ihre umzurechnende Binär- / Dezimalzahl ein : " << endl;
    	cin >> eingabe;
    	char c = eingabe[0];
    	switch(c)
    		{
    			case 'd': { Dec2Bin dec(eingabe);
    				    dec.convert();
    				    string ergebnis = dec.GetBinary();
    				    cout << " Ihre Zahl als Binärzahl lautet : " << ergebnis << endl; 
    				  }
    			case 'b': { Bin2Dec bin(eingabe);
    				    bin.convert();
    				    string ergebnis = bin.GetDecimal();
    				    cout << " Ihre Zahl als Dezimalzahl lautet : " << ergebnis << endl;
    				  }
    			default:{cout << " Falsche Eingabe ! " << endl;
    				 break;}
    		}
    }
    

    soweit so gut, das wichtigste fehlt allerdings, und zwar habe ich nicht die geringste Ahnung wie ich die Konvertierung schreiben soll, also den Rechenweg und zweitens verstehe ich auch nicht wie ich void convert() so nutzen soll, dass mir ja ( da es eine Berechnung werden soll ) einen Wert zurückgibt...

    Anbei noch die Header dateien:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Dec2Bin
    {
    	private:
    	string decimal_;
    
    	public:
    	Dec2Bin(const std::string& eingabe) : decimal_(eingabe) {}
    	void convert();
    };
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Bin2Dec
    {
    	private:
    	string binary_;
    	public:
    	Bin2Dec(const std::string& eingabe) : binary_(eingabe) {}
    	void convert();
    };
    


  • OT aber das konnte ich mir nicht verkneifen:
    Diese Funktionalität stellt man in einem tatsächlichen Anwendungsfall mit freien Funktionen zur Verfügung und nicht mit Klassen. Der Autor ist wahrscheinlich Java-Programmierer der denkt, er kann nun automatisch auch C++.



  • Das mag sein, wobei es zu einem großen Teil auch daran liegt die Klassen näher zu bringen...

    Was übrigens noch dazu kommt ist mein Unverständnis den string in einen int umzuwandeln.



  • #include <iostream>
    #include <string>
    #include "Bin2Dec.h"
    using namespace std;
    
    int Bin2Dec::convert(string binary)
    {
    	binary.erase(0, 2);
    	int erg = 0;
    	int multi = 1;
    	for (size_t idx = binary.size()-1; idx >= 0; idx--=)
    	{
    		if (binary[idx] == '1')
    		{
    			erg += multi;
    		}
    		erg *= 2;
    	}
    }
    
    /*int Bin2Dec::int GetDecimal()
    {
    }
    **/
    

    Das wäre jetzt meine Lösung für Binärzahlen zu Dezimalzahlen, allerdings besteht bei mir jetzt zweierlei an Problemen.

    Zum einen habe ich ja, da es eine void Funktion ist, nichts was zurückgegeben wird. Und zum anderen, was aufs gleiche schließen lässt, soll die Ausgabe ja mit GetDecimal() geschehen, gibt es diese Funktion bereits oder muss man die irgendwie implementieren? und ganz besonders wie kann ich sie in meiner main aufrufen.



  • In der Hoffnung dass mir mal jemand helfen kann...

    habe jetzt die Rechenoperationen fertig, nur mit dem Problem, dass ich immer einen Speicherzugriffsfehler erhalte.
    Zusätzlich funktioniert das mit den Get Funktionen noch nicht...

    #include <iostream>
    #include <string>
    #include "Dec2Bin.h"
    #include <stdlib.h>
    #include <sstream>
    
    using namespace std;
    
    void Dec2Bin::convert(string decimal)
    {
    	decimal.erase(0, 1);
    
    	stringstream stream;
    	stream << decimal;
    	double decim;
    	stream >> decim;
    	int de = decim;
    	int zahl,rest,ergebnis=0,faktor=1;
    	while(de)
    		{
    			rest = de % 2;
    			de = de / 2;
    
    			faktor *= 10;
    			ergebnis = ergebnis + rest * faktor;
    		}
    	cout << ergebnis;
    }
    
    string Dec2Bin::GetBinary()
    {
    	//string rest[];
    
    }
    
    #include <iostream>
    #include <string>
    #include "Bin2Dec.h"
    using namespace std;
    
    void Bin2Dec::convert(string binary)
    {
    	binary.erase(0, 2);
    	int erg = 0;
    	int multi = 1;
    	for (size_t idx = binary.size()-1; idx >= 0; idx-- )
    	{
    		if (binary[idx] == '1')
    		{
    			erg += multi;
    		}
    		erg *= 2;
    	}
    	cout << erg;
    }
    
    int Bin2Dec::GetDecimal( )
    {
    
    }
    

    würde mir gerne mal das Ergebnis anschauen, Problem nur dass ich immer einen Speicherzugriffsfehler erhalte...

    meine main.cpp

    #include <iostream>
    #include "Dec2Bin.h"
    #include "Bin2Dec.h"
    using namespace std;
    
    string binary,decimal;
    
    int main()
    {
    	string eingabe;
    	cout << "Geben Sie Ihre umzurechnende Binär- / Dezimalzahl ein : " << endl;
    	cin >> eingabe;
    	char c = eingabe[0];
    	switch(c)
    		{
    			case 'd': { Dec2Bin dec(eingabe);
    				    dec.convert(decimal);
    				    //dec.GetBinary();
    				    //cout << " Ihre Zahl als Binärzahl lautet : " << ergebnis << endl; 
    				  }
    			case 'b': { Bin2Dec bin(eingabe);
    				    bin.convert(binary);
    				    int ergebnis = bin.GetDecimal();
    				    cout << " Ihre Zahl als Dezimalzahl lautet : " << ergebnis << endl;
    				  }
    			default:{cout << " Falsche Eingabe ! " << endl;
    				 break;}
    		}
    }
    


  • std::string::erase erwartet Iteratoren, keine Indizes. 0 und 2 sind implizit zu char* konvertierbar, daher übersetzt dein Compiler das anstandslos. Zur Runtime fliegt dir das um die Ohren, weil du ab Speicheradresse 0 nichts löschen darfst.

    Edit:
    Man muss in C++ nicht alles in Klassen verpacken. Für dein Aufgabe reichen freie Funktion vollkommen aus, als Klasse ist die Handhabung eher umständlich.

    Edit 2:
    asdflol hat´s vor mir erwähnt 😃



  • Ich darf ab Speicheradresse 0 nichts löschen?

    Wie soll ich denn dann die ersten zwei Zeichen aus meinem String rausfiltern?

    Verzweifle so langsam, obwohl bisher alles geklappt hat..

    EDIT: Für das mit den Klassen kann ich ja nix für, muss es nur so ausführen leider...



  • huwul schrieb:

    Ich darf ab Speicheradresse 0 nichts löschen?

    Ja, an Speicheradresse 0 darfst du nichts löschen. Die Adresse 0 ist nämlich per Konvention reserviert. Und der Speicher an Adresse 2 wird dir nicht gehören

    Wie soll ich denn dann die ersten zwei Zeichen aus meinem String rausfiltern?

    Du darfst nicht an Adresse 0 löschen, du darfst aber an der Startadresse von deinem String löschen, das ist ein Unterschied!
    erase erwartet Iteratoren, das sind quasi Zeiger in den String. Du holst dir einen Iterator auf das n-te Zeichen via str.begin() + n, in deinem Fall also bspw:

    decimal.erase(decimal.begin(), decimal.begin() + 1);
    

    Und vermeide bitte globale Variablen!



  • Ich hab das ganze jetzt in zwei strings aufgeteilt einmal b für den quasi Rechenoperator wobei es ja kein richtiger ist.
    Und den zweiten dann mit der Zahleneingabe.

    im Fall Binär zu Dezimal ist der Code dann folgendermaßen:

    #include <iostream>
    #include <string>
    #include <math.h>
    #include "Bin2Dec.h"
    using namespace std;
    
    void Bin2Dec::convert()
    {
    	int summe;
    	int length = binary.size();
    	cout << binary.size();
    	cout << length;
    	for (int i=0; length - i > 0; i++)
    		{
    			if(binary[length-1-i] == '1')
    				{summe = summe + pow(2, length-(length- 1 -i));}
    		}
    	cout << summe;
    
    }
    
    int Bin2Dec::GetDecimal( )
    {
    	//return summe;
    }
    

    ich kapiere aber nicht wieso so ein Mist rauskommt:

    Ihre Zahl als Dezimalzahl lautet : -1077984360

    Wenn ich das schriftlich nachgehe, müsste er bei mir eigentlich das Richtige Rechnen in dem er anfängt mit:
    2 hoch 1 auf Summe speichern, dann nix dann 2 hoch 3, dann nix, dann 2 hoch 5.

    Aber machen tut er was anderes, ich blicke da echt nicht durch, meiner Meinung nach ist der Code richtig so...



  • Prüfe mal nach, welchen Wert summe vor der Schleife hat. In Zeile 11 ein:

    cout << "initialer Wert von summe: " << summe << "/n" ;
    

    einfügen. Ich schätze, Du erwartest dort eine 0, Du hast das aber nirgendwo angegeben.



  • Das'n Witz ne 😮

    und ich sitz an der einen Stelle seit ner Stunde und denke immer wieder, dass es richtig sein müsste :o

    okay dankeschön schonmal dafür, mir wurde beigebracht, von selbigem Prof. dass solange ich keinen Wert angebe, dieser automatisch auf 0 gesetzt wird...

    Habt ihr/du denn noch eine Idee wegen der beiden Get Funktionen?

    wenn ich dec.GetDecimal(); in der main.cpp nutze, kommt da nämlich auch so ein hochzahliger Schmutz raus...

    bei der anderen Get Funktion funktioniert erst gar nichts, vermutlich da es laut Aufgabenstellung im String sein muss 😕



  • Hey, um das Thema von letzter Woche nochmal aufzugreifen:

    mir fehlen nur ein paar Kniffe, wobei ihr mir bestimmt helfen könnt.

    Binär zu Dezimal funktioniert schonmal einwandfrei.
    Dezimal zu binär gibt es nur noch ein kleines Problem, ich lasse mir die Zahlen auf einen Stack schreiben und möchte sie dann halt mit top(); von oben nach unten in einen String ( von hinten nach vorne ) schreiben lassen, Größtes Problem dabei ist allerdings, dass er nichts in den String schreibt.

    die zwischenzeitlichen Stack ausgaben sind genau wie sie sein sollten.

    hier mal die betreffende .cpp:

    #include <iostream>
    #include <string>
    #include "Dec2Bin.h"
    #include <stdlib.h>
    #include <sstream>
    #include <stack>
    
    using namespace std;
    
    void Dec2Bin::convert()
    {
    
    	stack<int> stack;
    	stringstream stream;
    	stream << decimal;
    	double decim;
    	stream >> decim;
    	int de = decim;
    	int rest,ergebnis=0,faktor=1;
    
    	string ausgabe="";
    
    	while(de>=1)
    		{
    			rest = de % 2;
    			de = de / 2;
    			if(rest>0)
    			{
    				stack.push(1);
    			}
    			if(rest==0)
    			{
    				stack.push(0);
    			}
    
    			//faktor *= 10;
    			//ergebnis = ergebnis + rest * faktor;
    		}
    
    	int lo=stack.size();
    	cout << "Stacksize: "<< lo <<endl;
    	for(int i=0; lo>i;i++)
    			{
    
    				string a = "1";
    				string d = "0";
    				const char b = '1';
    				const char c = '0';
    				int oben = stack.top();
    				cout << "stack oben: " << oben << endl ;
    				if(oben==1)
    				{
    
    					ausgabe.insert(lo-i-1, b);
    					ausgabe[lo-1-i]= b;
    					cout << ausgabe << endl;
    				}
    				else
    				{
    					ausgabe.insert(lo-i-1, c);
    					ausgabe[lo-1-i]= c;
    					cout << ausgabe << endl;
    				}
    			stack.pop();
    			cout << ausgabe;
    			}
    	cout << "ausg: "<< ausgabe <<endl;
    
    	/*ergebnis = ergebnis/10;
    	cout << ergebnis << endl;**/
    
    }
    
    string Dec2Bin::GetBinary()
    {
    
    }
    


  • Hat sich erledigt, sollte es leute geben, die es interessiert:

    Beim initialisieren des strings ausgabe, sollte man erstmal bspw. 10 leere stringinhalte hinzufügen mit:

    string ausgabe(10, ' ');


Anmelden zum Antworten