ubuntu--anfaenger
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
Hallo, Ich möchte mit cin in einer while Schleife 2Variablen einlesen, und wenn ich eine '|' eingebe soll das Programm eine Ausgabe erzeugen. Das Problem es wird zuerst ein double gefolgt von einem string Eingelesen, da cin nicht weiss wann der string beendet ist habe ich hinten drann noch einen char gehängt. Ich muss aber logischer Weise hinter der 2ten Eingabe(string) entweder eine Leerstelle lassen was verwirrend ist, oder halt enter drücken um den string zu beenden. Ich hatte auch schon versucht anstatt double und string einzulesen einfach 2strings zu lesen und den ersten dann später als double umzuwandeln, das Ergebnis ist aber auch nicht zufriedenstellend. Kann mann das irgendwie anders machen? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 | #include <iostream>
#include <string>
using namespace std;
int main()
{
const double cm = 100;
const double m = 1;
const double inch = 2.54;
double counter = 0;
double input;
char c;
string einh;
while(cin>>input>>einh>>c){
// cin>>input>>einh;
++counter;
if(c=='|'){
// input = stod(st);
// mache was
cout << counter << endl;
return 0;
}
if(einh=="m"){
cout << input << "m " << "sind: " << input*cm << "cm" << endl;
}
else if(einh=="cm"){
cout << input << "cm " << "sind: " << input/cm << "m" << endl;
}
else if(einh=="inch"){
cout << input << "inch " << "sind: " << input*inch << "cm" << endl;
}
else{
cout << "Falsche Einheit" << endl;
}
}
return 0;
}
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Ich habe mir das nicht im Detail angeschaut, aber ich würde jede Eingabe mit Enter beenden wollen - also nicht "|" o.ä. als Trenner zwischen zwei Werten benutzen.
|
ubuntu--anfaenger
(Themenstarter)
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
Ich habe mir das nicht im Detail angeschaut, aber ich würde jede Eingabe mit Enter beenden wollen - also nicht "|" o.ä. als Trenner zwischen zwei Werten benutzen.
Das ist kein Trenner für 2 Werte, Man gibt zb: 120m an drückt enter, bekommt die Umrechnung, und kann eine neue Eingabe machen, wenn '|' gedrückt wird bekommt man eine andere Ausgabe. Meinst Du ich soll alles getrennt einlesen etwa 120[enter]m[enter]? Wäre das deiner Meinung nach besser? lg,
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Mir ist noch nicht klar, wie das Programm genutzt werden soll. Willst Du qua echo mehrere Werte übergeben können: | echo "3.545 m ;472 cm ;69 inch ;" | ./cminch
|
Ein Ende des Eingabestroms kannst Du im interaktiven Modus mit Ctrl-D signalisieren. Wird eine Datei umgelenkt oder mit echo gearbeitet, brauchst Du das nicht, denn das Ende besteht darin, dass der Eingabestrom abreisst: echo "3.545 m ;472 cm ;69 inch ;" | ./cminch
3.545m sind: 354.5cm
472cm sind: 4.72m
69inch sind: 175.26cm
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Das ist jetzt für mich auch C++ Neuland. Das hatte ich bei meinen GUI Anwendungen so noch nicht benötigt. Deshalb nur eine grobe Beschreibung. Ich würde erstmal die gesamte Eingabe in einen String einlesen und danach interpretieren. Dann kannst Du bei einer leeren Eingabe gleich abbrechen.
| #include <sstream>
...
std::stringstream eingabe;
...
cin >> eingabe;
...
|
und später
| eingabe >> input >> einheit;
|
Und für die Einheiten und deren Umrechnungsfaktoren würde sich eine Tabelle (Vector) anbieten samt einer Funktion, die Dir den zugehörigen Umrechnungsfaktor liefert.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Dakuan schrieb: Das ist jetzt für mich auch C++ Neuland. Das hatte ich bei meinen GUI Anwendungen so noch nicht benötigt. Deshalb nur eine grobe Beschreibung. Ich würde erstmal die gesamte Eingabe in einen String einlesen und danach interpretieren.
Was ist daran der Vorteil?
Dann kannst Du bei einer leeren Eingabe gleich abbrechen.
Das Programm bricht bei einer leeren Eingabe von selbst ab - da muss man nichts machen.
| #include <sstream>
...
std::stringstream eingabe;
...
cin >> eingabe;
...
|
und später
| eingabe >> input >> einheit;
|
Und für die Einheiten und deren Umrechnungsfaktoren würde sich eine Tabelle (Vector) anbieten samt einer Funktion, die Dir den zugehörigen Umrechnungsfaktor liefert.
Vom gezeigten Code steht der User ganz am Anfang. Ob da ein Vector (Tabelle) weiterhilft bezweifle ich etwas, vor allem hat es gar nichts mit Inputproblemen zu tun.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ubuntu--anfaenger schrieb:
Das ist kein Trenner für 2 Werte, Man gibt zb: 120m an drückt enter, bekommt die Umrechnung, und kann eine neue Eingabe machen, wenn '|' gedrückt wird bekommt man eine andere Ausgabe.
Ich verstehe es immer noch nicht, wie es funktionieren soll. Poste doch mal bitte einen Ablauf mit allen Eingaben und Ausgaben. Andere scheinen ja auch noch nicht verstanden zu haben, was Du willst.
Meinst Du ich soll alles getrennt einlesen etwa 120[enter]m[enter]?
Nee, bestimmt nicht.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Das wäre ein Ansatz, wenn man Elemente, die aus einem Double und einer dahinter folgenden Einheit bestehen an Whitespace auftrennen wollte: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | #include <iostream>
#include <sstream>
#include <string>
int main() {
while(!std::cin.eof()) {
std::string s;
std::stringstream buffer;
double value;
std::string unit;
std::cin >> s;
buffer << s;
if (buffer >> value >> unit) {
std::cout << "value: " << value << " unit: " << unit << std::endl;
} else {
std::cout << "invalid input: " << buffer.str() << std::endl;
}
}
}
|
|
ubuntu--anfaenger
(Themenstarter)
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
Ich verstehe es immer noch nicht, wie es funktionieren soll. Poste doch mal bitte einen Ablauf mit allen Eingaben und Ausgaben. Andere scheinen ja auch noch nicht verstanden zu haben, was Du willst.
ok Eingabe 120m[enter] [semikolum] oder 120m[enter] [Leertaste] [semikolum] Ausgabe Geben Sie den Wert ein+die Einheit in der Sie Umrechnen wollen: 120m
;
120m sind: 12000cm
200inch
;
200inch sind: 508cm
30cm ;
30cm sind: 0.3m
12m ;
12m sind: 1200cm Ausgabe mit pipe'|' 120m |
5 #Durgänge Progr bricht ab Mein Ziel ist es zb Eingabe:120m enter drücken, und wieder neue Eingabe, und wenn Eingabe gleich '|' die Ausgabe der Zählschleife erzeugen.
|
ubuntu--anfaenger
(Themenstarter)
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
seahawk1986 schrieb:
Das wäre ein Ansatz
Ich glaube das geht in meine Richtung. danke. Dakuan schrieb:
Und für die Einheiten und deren Umrechnungsfaktoren würde sich eine Tabelle (Vector) anbieten samt einer Funktion, die Dir den zugehörigen Umrechnungsfaktor liefert.
Ja das soll noch kommen. user_unknown schrieb:
Ein Ende des Eingabestroms kannst Du im interaktiven Modus mit Ctrl-D signalisieren.
Ja das hatte ich schon gelernt, aber bekomme so einen Programm Abruch, wollte noch die Möglichkeit haben eine Pipe einzutippen und was anderes zu machen.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
ubuntu--anfaenger schrieb: Dakuan schrieb:
Und für die Einheiten und deren Umrechnungsfaktoren würde sich eine Tabelle (Vector) anbieten samt einer Funktion, die Dir den zugehörigen Umrechnungsfaktor liefert.
Ich hätte da eher an eine unordered_map gedacht, aber da kann man sich auch richtig mit Graphen Austoben, wenn man das "professionell" machen will: https://alexgolec.dev/ratio-finder/
|
ubuntu--anfaenger
(Themenstarter)
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
Ich hätte da eher an eine unordered_map gedacht, aber da kann man sich auch richtig mit Graphen Austoben, wenn man das "professionell" machen will: https://alexgolec.dev/ratio-finder/
Da warten wir noch ein bisschen mit ca(10Jahre) 😳
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ubuntu--anfaenger schrieb: Ich verstehe es immer noch nicht, wie es funktionieren soll. Poste doch mal bitte einen Ablauf mit allen Eingaben und Ausgaben. Andere scheinen ja auch noch nicht verstanden zu haben, was Du willst.
ok
Danke!
Eingabe 120m[enter] [semikolum] oder 120m[enter] [Leertaste] [semikolum]
Ich verstehe ja Enter - aber warum soll man ein Semikolon eingeben? Du hast doch mit Enter bereits die Eingabe bestätigt.
Ausgabe Geben Sie den Wert ein+die Einheit in der Sie Umrechnen wollen: 120m
;
120m sind: 12000cm
200inch
;
200inch sind: 508cm
30cm ;
30cm sind: 0.3m
12m ;
12m sind: 1200cm Ausgabe mit pipe'|' 120m |
5 #Durgänge Progr bricht ab Mein Ziel ist es zb Eingabe:120m enter drücken, und wieder neue Eingabe, und wenn Eingabe gleich '|' die Ausgabe der Zählschleife erzeugen.
Also, das Pipe-Symbol dient dazu, den aktuellen Schleifenzähler auszugeben? Warum gibst Du davor noch "120m" ein? Soll das Pipe-Symbol als eine Art Modifikator der Eingabe wirken? Und was passiert dann mit "120m", das Du noch vor dem Pipe-Symbol eingegeben hast? Dazu sehe ich da gar keine Ausgabe. Ich bin mir nicht so sicher, was Du am Ende eigentlich erreichen willst. Wofür ist der Schleifenzähler da?
|
ubuntu--anfaenger
(Themenstarter)
Anmeldungsdatum: 12. Oktober 2013
Beiträge: 1088
Wohnort: Belgien
|
Ich verstehe ja Enter - aber warum soll man ein Semikolon eingeben? Du hast doch mit Enter bereits die Eingabe bestätigt.
Ja das kann auch ein anderer char sein, muss kein ; sein. Wenn ich die Eingabe mache ohne das char hinten drann(cin>>input>>einh) dann hab ich Eingabe/Ausgabe das ist ok, wenn ich aber '|' (oder von mir aus auch ein anderes Zeichen),bekomme ich das if mit dem counter zurück, wenn ich soweit bin will ich das so machen mit dem vector, wie Beschrieben,der Zähler dient nur dazu die Durchgänge zu zählen.
Warum gibst Du davor noch "120m" ein? Soll das Pipe-Symbol als eine Art Modifikator der Eingabe wirken?
Ja, ich gebe vorher noch 120m ein und dann erst das Pipe-Symbol, weil das | Symbol nicht zu den 2 Vorherigen Datentypen passt die Eingelesen werden,und ich mit meinen fähigkeiten da an meine Grenze stosse.. seahawk1986 hat das dann erkannt und hat code gepostet.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Schleifenabbruch könntest Du auch damit machen, dass der User 0 umzurechnen befiehlt. Null wie Null Bock. ☺ Wenn der Counter nach der Schleife ausgibt, wie fleißig der User war, braucht man es nicht extra zu signalisieren. | echo "4m 1662cm 4235inch 17m 0" | ./cminch
4 m sind: 400 cm
1662 cm sind: 16.62 m
4235 inch sind: 10756.9 cm
17 m sind: 1700 cm
0 m sind: 0 cm
5
|
Den 0-Wert könnte man noch abziehen, die 5 kommentieren.
Mit Tabs sähe das ganze noch tabellarischer aus.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | int main()
{
const double cm = 100;
// unused: const double m = 1;
const double inch = 2.54;
double counter = 0;
double input;
string einh;
do
{
cin >> input >> einh;
++counter;
if (einh == "m") {
cout << input << " m " << "sind: " << input * cm << " cm" << endl;
}
else if (einh == "cm") {
cout << input << " cm " << "sind: " << input / cm << " m" << endl;
}
else if ( einh == "inch") {
cout << input << " inch " << "sind: " << input * inch << " cm" << endl;
}
else {
cout << "Falsche Einheit: " << einh << endl;
}
} while (input != 0.0);
cout << counter << endl;
return 0;
}
|
Hat man eigentlich aufgehört CONSTANTEN komplett groß zu schreiben? Wenn counter ein double ist (sehe ich gerade), dann könnte man die abschließende 0 ja mit 0.5 zählen.
|