C++ int-oder double-input
Ich bin auf der Suche, um aufzuräumen einige bereits funktionierenden code, den ich habe. Zuerst von allen, ist dies für eine Zuordnung und die Zuordnung gibt an, ints genommen werden muss, wie ints, doubles als verdoppelt, etc, sonst könnte ich einfach den Eingang als Doppel-und cast als int -if(number%1==0)
.
Habe ich getrimmt Sie den code unten, um nur die Handhabung der Eingabe (mit einer output-Anweisung, um sicherzustellen, es richtig funktioniert).
int wholePart=0;
double decimalPart=0;
cout << "Input a number: ";
cin >> wholePart;
if(cin.peek() != '\n')
cin >> decimalPart;
cout << "wholePart = " << wholePart << endl << "decimalPart = " << decimalPart << endl;
Nun... das funktioniert wie es ist, und nach füge ich den code hinzu, um zu behandeln, kombiniert die ganze Zahl und dezimal wenn die decimalPart ist nicht 0, dann habe ich schon mehr getan, als die Zuordnung fordert, aber ich bin auf der Suche, um zu lernen, und ich will reinigen Sie diesen code so viel wie möglich.
Kann ich wickeln Sie den gesamten input-Bereich mit anderen input-Validierung um sicherzustellen, dass der Benutzer tatsächlich die Eingabe von zahlen und nicht in Zeichen. Aber mein Hauptanliegen hier ist, dass if(cin.peek() != '\n')
ist nicht gut genug. Vielleicht if(cin.peek() == '.')
ist eine bessere option, aber ich bin neugierig, was wäre der beste Weg zu gehen über das vollbringen, was ich versuche zu erreichen, hier. Irgendwelche Ideen?
Und bitte nicht nur diese nach unten, wie "oh, es ist Hausaufgabe." Ich möchte betonen, dass mein Programm geht schon über das hinaus, was auch das extra-Guthaben Teil der Hausaufgaben fragt. Ich versuche nur zu lernen, mehr über die Sprache und, was der beste Weg für die Bearbeitung dieser Art von input sein könnte.
InformationsquelleAutor nhgrif | 2013-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass es so etwas wie
"1.0"
genommen werden sollte, alsein Doppel-als auch, dass ziemlich viel beseitigt Dinge wie
Lesen Sie ein Doppel -, dann die überprüfung, ob es tatsächlich eine ganze Zahl ist.
Ist der einzige Weg, um die Daten analysieren, um zu sehen, ob Sie auftreten
etwas, das interpretiert werden kann als eine
int
oder nicht. Wenn Sieverwenden Sie die Funktionen für die Konvertierung des Baches, diesem ziemlich
viel bedeutet das Scannen der Eingabe zweimal. Die offensichtliche Lösung wäre
die Eingabe in einem string; diese sind viel einfacher zu
Scannen Sie mehrere Male. Wenn Sie sind nicht erlaubt zu tun, können Sie
verwenden
istream::tellg
zu merken der position, vor Scannen, und sobaldSie haben sich entschieden,
istream::seekg
zu gehen zurück, wo Sie begannaus. Aber ich weiß nicht, welche Regeln Ihr Lehrer auferlegt hat.
Wenn Sie nicht versuchen, Sie können versuchen, hacken Sie es von hand. Zuerst Lesen
ein
int
, dann Blick auf das nächste Zeichen. Wenn es ein'.'
Siekann dann Lesen Sie eine Doppel -, die Ihnen den gebrochenen Teil,
die Sie hinzufügen können, um die ganze Zahl, die Sie bereits gelesen haben. Wenn es
ein
'E'
oder und'e'
wird, wird es ein bisschen schwieriger; Siewahrscheinlich Voraus, Lesen Sie ein int, und verwenden Sie
pow
manuell.Aber das ist bei weitem nicht perfekt: wenn das Doppel hat die form
"1.2E6"
Sie werden am Ende mit 200000, da der "Bruch" Teil;Sie müssen einige Mittel zum erkennen dieser und Skalierung der
integer haben Sie bereits gelesen. Und wenn die Zahl
".3"
werden Sieein Fehler beim Einlesen der Ganzzahl: Sie können entweder überprüfen
das vorher (aber vergessen Sie nicht
"-.3"
), oder den Fehler zurückzusetzenbevor irgendetwas anderes tun. Und natürlich ist es möglich, dass
der Integrale Teil eines Doppel-passt nicht in eine
int
(oder sogarein
long long
).Alles in allem, scheint es ein wenig künstlich auf mich. In der Praxis würden Sie
Einlesen in einen string und mit regulären Ausdrücken gegen Sie in
um zu bestimmen, wie Sie wollte, Sie zu interpretieren.
Sie sind standard-member-Funktionen von
std::istream
: der erste gibt die aktuelle position (alsstd::streampos
), und die zweite nimmt einestd::streampos
aus einem früheren Aufruftellg
und Positionen für die nächsten Lesen.Danke. Ich denke, das werde ich wohl umsetzen
tellg
undseekg
in den Weg über extra-Guthaben Teil meiner Aufgabe, wie es scheint wahrscheinlicher, dass diese möglicherweise mehr Zukunft nutzen dann dieif(cin.peek() == '.')
Methode.InformationsquelleAutor James Kanze
Es ist wahrscheinlich einfacher zu Lesen, in der Sie die ganze Zeile als einen string prüfen Sie zunächst, für ein dezimal-Punkt, und dann führen Sie die Linie zu einem stringstream kann dann entweder konvertieren es in eine int-oder double (je nachdem, ob der Dezimalpunkt vorhanden ist):
InformationsquelleAutor hogliux
Angesichts Ihrer Spezifikation, Las ich ein
std::string
, sehen, wenn, das könnte etwas anderes sein als eine ganze Zahl, und je nach Ergebnis geparstint
oder alsdouble
. Zum BeispielInformationsquelleAutor Dietmar Kühl