C++ Brüche und ganzzahlen und kommazahlen?
-
Hallo.
Ich bin zur zeit ITA im ersten jahr und bin noch nicht sooo sehr vertraut mit C++.Aber trotz meiner geringen kenntnisse und so weiter will ich derzeit ein Programm schreiben, dass eine komplette kurvendiskussion berechnet.
Mit ganzzahlen und komazahlen hab ich das so weit hintereinander bekommen. ich hab einfach alle Variablen als double declariert.
Doch was für variablen muss ich mir basteln, das der benutzer des programms wahlweise Brüche, komazahlen und ganzzahlen nutzen kann? und wie wird das dann geschrieben? und wie läuft dann die eingabe als nutzer?...
Danke im Vorraus
-
wenn du auch 1/3 und so richtig rechnen willst, musst du Zahlen immer in zähler/Nennen aufteilen.
D.h. meines Erachtens am Besten schreibst du dir struct mit int zähler und int nenner und musst dann die rechenoperationen auf brüche umschreiben.(gibts vermutlich schon Skripte dazu).Benutzereingabe kannste ja machen wie du willst...
-
DerBaer schrieb:
(gibts vermutlich schon Skripte dazu)
Von Skripten spricht man bei Skriptsprachen. C++ ist keine Skriptsprache.
-
Vorgefertigt gibt es für Brüche z.B. boost::rational.
Wenn der Nutzer wahlweise Brüche (und damit auch ganze Zahlen) oder Doubles einlesen können soll, brauchst du eine Struct oder besser einen Variant-Typ, der beides halten kann. Dann liest du die Eingabe als String ein, parst diese (entscheidest, ob Bruch oder Kommazahl) und schreibst sie dann in das entsprechende Feld.
Beispiel mit boost:
#include <iostream> using namespace std; #include <boost/rational.hpp> #include <boost/variant.hpp> #include <boost/lexical_cast.hpp> int main() { boost::variant<boost::rational<int>, double> value; string s; cout << "Kommazahl oder Bruch eingeben: "; cin >> s; // Vereinfacht: Kommazahlen enthalten einen Punkt if(s.find('.') != string::npos) value = boost::lexical_cast<double>(s); // double-Wert wird geschrieben else { // Eventuell Bruchstrich ('/') finden int pos = s.find('/'); if(pos != string::npos) value = boost::rational<int>(boost::lexical_cast<int>(s.substr(0, pos)), boost::lexical_cast<int>(s.substr(pos+1))); else value = boost::rational<int>(boost::lexical_cast<int>(s)); } cout << value << endl; }
Eingabe: 1.05 --> Ausgabe: 1.05 Eingabe: 15 --> Ausgabe: 15/1 Eingabe: 18/12 --> Ausgabe: 3/2
Natürlich kannst du in die Variant auch noch gerne einen
int
packen, wenn dir die 15/1 nicht gefallen.
-
Ich danke erst mal.
Irgendwie übersteigt das momentan meine fähigkeiten... ich glaube ich belasse es dann dohc mal bei dem ganz normalen double...