Dezimal Binär Konvertierung in beide Richtungen
-
#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::eraseerwartet Iteratoren, keine Indizes. 0 und 2 sind implizit zuchar*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, ' ');