Taschenrechner für Double Zahlen über einen String
-
Hallo Zusammen,
ich bin ziemlich neu im Thema C++ Programmierung, da ich seit einem Monat mein Studium der Wirtschaftsinformatik angefangen habe. Ich habe bereits einige Grundkenntnisse im Bereich Swift gesammelt (Hobbymäßig ein bisschen was gemacht) und stehe jetzt vor meiner zweiten Hausaufgabe nach ca. 50 % der Hausaufgaben vor einem Problem...
Ich soll einen Taschenrechner basteln der die Eingabe vom Benutzt z.B. "12+32" in eine verstandene Operation ändert und diese vor der Rechnung ungefähr so ausgibt: 12 + 32= 45. Jetzt habe ich schon eine ganze Zeit das Internet durchforstet, wie ich ihn bis zum mathematischen Operator den String durchforsten lasse - sprich er zählt die erste Zahl bis zum +, -, * oder / Zeichen und gibt diese als einen int aus und zählt danach die zweite Zahl wieder bis zu dem math.Operator.
Mein Code sieht derzeit so aus:
#include "stdafx.h"
#include <iostream>
#include <sstream>
using namespace std;void stringTo(std::string str, double & wert) {
std::istringstream eingabe;
eingabe.str(str);
eingabe >> wert;
}int main() {
cout << "\n \n Aufgabe 2 ! \n";
cout << "Hier haben wir unseren nächsten Taschenrechner für Double-Zahlen\n Bitte gib deine Rechnung ein. \t Sie kann z.B. so aussehen: 19-34; -7.1 + 9.5;...\n";
std::string eingabeEins;
double kommazahl;std::getline(std::cin, eingabeEins);
stringTo(eingabeEins, kommazahl);std::cout << "die Rechnung lautet " << eingabeEins;
return 0;
}Aktuell gibt er mir natürlich nur die eingegebene Zahlenreihenfolge zurück.
Mein Plan ist jetzt:
1. Eingabe nutzer
2. Zahlenreihenfolge soll mit Leerzeichen ausgegeben werden
2.1 dafür müssen die Zahlen bis zum Operator ausgelesen werden und ein Leerzeichen dazwischen gefügt werden
3. falsche Operatoren sollen erkannt und angemekkert werden
3. Rechnung soll nach der erfolgreich ausgeführten Zahlenreihenfolge ausgegeben werden (ich würde den String in 2 Ints konvertieren und entsprechend rechnen lassen)Könntet ihr mir einen Denkanstoß geben?
Lieben Dank!
-
Habe deine Frage nur kurz überflogen da ich weg muss und hoffe, dass ich jetzt keinen Mist antworte. Aber ich würde es garnicht so kompliziert machen. Sagen wir deine Datentypen sind vom Typ int. Dann kannst du einfach std::cin >> int >> char >> int; machen. (ich denke du verstehst wie ich das meine). Damit wird das Rechenzeichen als char erkannt und deine Zahlen als int. Zusammenrechnen kannst du dann ja selbst.
-
Zhavok schrieb:
Sagen wir deine Datentypen sind vom Typ int. Dann kannst du einfach std::cin >> int >> char >> int; machen. (ich denke du verstehst wie ich das meine). Damit wird das Rechenzeichen als char erkannt und deine Zahlen als int. Zusammenrechnen kannst du dann ja selbst.
+1
und den Operator kannst du dann in einer switch prüfen.
-
Genau so sah mein Plan aus
-
Zhavok schrieb:
Genau so sah mein Plan aus
Joa, dann mach dat mal und lösch das ganze getline und istringstream Zeugs.
-
Haha, war doch garnicht meine Frage
-
Zhavok schrieb:
Haha, war doch garnicht meine Frage
Lol, heute läufts noch nicht bei mir, tut mir Leid
-
Ich habe es jetzt einmal so probiert:
double kommazahl;
double kommazahl2;char std;
std::cin >> kommazahl >> std >> kommazahl2;
std::cout << "die Rechnung lautet " << kommazahl << " " << std << " " << kommazahl2 << " ";do {
switch (std) {
case 1:
if (std == +) {
cout << kommazahl + kommazahl2;
}
break;case 2:
if (std == -) {
cout << kommazahl - kommazahl2;
break;
}
default:
cout << "Sie haben die falsche Zahl eingegeben. Probieren Sie es erneut!";
}
}while (std != 0);return 0;
}Nun sagt er mir aber, dass bei if (std == +) ein Ausdruck erwartet wird...
Wenn ich es in " " einfüge klappt es auch nicht.. Muss ich den Char jetzt in einen Int umwandeln
-
Du hast kein char angegeben. Das ist ein char '+'
-
Du, das ist nicht böse gemeint, aber kauf dir ein Buch oder finde eine umfangreiche aktuelle Quelle, die dir C++ programmieren bei bringt. Du wirst sonst wahrscheinlich alle 10min vor Baustellen stehen, die du nicht selbstständig lösen kannst. Und das ist unglaublich nervig. Außerdem interpretiert man dann auch Dinge schnell falsch und lernt es somit auch falsch. Ich habe es auch auf die "Hauruck"->Methode probiert und bin kläglich gescheitert. Wie schon gesagt, ist nicht böse gemeint, nur ein Ratschlag wie du ordentlich und vernünftig vorankommst.
Achja, und nutze Codetags. (Wenn du Code postest, klickst du unten einfach zum Beispiel auf die C++ Schaltfläche und am Ende vom Code klickst du wieder darauf. Je nach Sprache) Das bringt den Lesern hier gleich eine bessere Übersicht.
-
Hast du evtl eine buchempfehlung?
Habe das Buch hier gefunden, aber keine Rezessionen gefunden..https://www.rheinwerk-verlag.de/einstieg-in-c_4361/
-
Hallo Blaxter,
Blaxter schrieb:
einfüge klappt es auch nicht.. Muss ich den Char jetzt in einen Int umwandeln
Nein - Dein Fehler besteht darin, für den Variablennamen das 'std' zu benutzen, was auch der Name des Standard-namespace von C++ ist. Du benennst also zwei verschieden Dinge mit gleichem Namen, was der Compiler nicht mag.
Besser Du kapselst so eine (Rechen-)Operation in eine Klasse - z.B. so:
class BinaryOperation { public: BinaryOperation() : char_() {} double operator()( double a, double b ) const { switch( char_ ) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } return 0.; } friend std::istream& operator>>( std::istream& in, BinaryOperation& binOp ) { char char_; if( in >> char_ ) { switch( char_ ) { case '+': case '-': case '*': case '/': binOp.char_ = char_; break; default: in.setstate( std::ios_base::failbit ); // Lesefehler! break; } } return in; } friend std::ostream& operator<<( std::ostream& out, BinaryOperation binOp ) { return out << binOp.char_; } private: char char_; };
dann wird nicht irgendein Zeichen gelesen, sondern eines der Zeichen für die vier Grundrechenarten. Steht dort ein anderes Zeichen, so ist es ein Lesefehler.
Erweiterst Du die Sache noch um den binären Term 'BinaryTerm' der neben der Operation (s.o.) noch die beiden Argumente enthält, so wird es im Grunde recht einfach:
#include <iostream> class BinaryOperation ... // Code siehe oben class BinaryTerm { public: BinaryTerm() : arg1_(), arg2_(), binOp_() {} friend std::istream& operator>>( std::istream& in, BinaryTerm& term ) { return in >> term.arg1_ >> term.binOp_ >> term.arg2_; } friend std::ostream& operator<<( std::ostream& out, const BinaryTerm& term ) { // Zahlenreihenfolge soll mit Leerzeichen ausgegeben werden (na meinet wegen!) return out << term.arg1_ << " " << term.binOp_ << " " << term.arg2_; } double result() const { return binOp_( arg1_, arg2_ ); } private: double arg1_, arg2_; BinaryOperation binOp_; }; int main() { using namespace std; for( BinaryTerm term; cout << "> ", cin >> term; ) { cout << "die Rechnung lautet: " << term << " = " << term.result() << endl; } return 0; }
falls Du es komplizierter haben möchtest, so schaue Dir mal diesen Beitrag an.
Gruß
Werner
-
@Blauester
-> https://www.c-plusplus.net/forum/310212
Ich selbst habe das:
Das ist für nen Programmiereinsteiger etwas schwer finde ich. Ich habe zu manchen Dingen noch paar Videos auf Youtube geschaut wodurch ich Zusammenhänge dann etwas besser verstanden habe. Aber dafür ist es für Einsteiger und Profis. Mir dient es immer wieder als Nachschlagewerk und ich bin sehr zufrieden damit. Ich kanns nur empfehlen. Aber wenn du kein Problem mit Englisch hast, sind die Bücher in der Linkliste wahrscheinlich noch besser.