Abschneiden eingelesene Zahl



  • Noch eine Bitte - und eigentlich sollte das selbstverständlich sein.

    Lass bitte dein anfängliches posting (sprich: die Eingangsfragestellung bzw. Beschreibung des Problems) stehen. So können auch andere Leser, die ein ähnliches oder sogar gleiches Problem haben die Forensuche nutzen und den thread nachvollziehen.

    Nun hast du alles gelöscht und einfach "Danke" hingeschrieben, und keiner weiss mehr worum es ging.

    ALso in Zukunft: Einfach auf den bestehenden thread antworten und mit neuem posting bedanken - und das Anfangsposting unverändert lassen.



  • Nicht besonders schön, aber vlt. das was du haben wolltest?

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <map>
    #include <sstream>
    
    struct convert {
    	static std::map<char,std::string> myMap;
    	static void init() {
    		myMap.clear();
    		myMap['0']  = "null";
    		myMap['1']  = "eins";
    		myMap['2']  = "zwei";
    		myMap['3']  = "drei";
    		myMap['4']  = "vier";
    		myMap['5']  = "fuenf";
    		myMap['6']  = "sechs";
    		myMap['7']  = "sieben";
    		myMap['8']  = "acht";
    		myMap['9']  = "nein";
    		myMap['.']  = "komma";
    	}
    
    	void operator()(char c) {
    		std::cout << myMap[c] << "-";
    	}
    };
    std::map<char,std::string> convert::myMap;
    
    std::string getStringRepresentation (double value) {
    	std::ostringstream oss;
    	oss << value;
    	return oss.str();
    }
    
    int main () {
    	double zahl;
    	std::cout << "Zahl eingeben: ";
    	std::cin >> zahl;
    	std::string strzahl(getStringRepresentation(zahl));
    	convert::init();
    	std::for_each(strzahl.begin(),strzahl.end(),convert());
    	std::cin.ignore(1);
    	std::cin.get();
    	return 0;
    }
    


  • nicht_aendern_bitte schrieb:

    Noch eine Bitte - und eigentlich sollte das selbstverständlich sein.

    Lass bitte dein anfängliches posting (sprich: die Eingangsfragestellung bzw. Beschreibung des Problems) stehen. So können auch andere Leser, die ein ähnliches oder sogar gleiches Problem haben die Forensuche nutzen und den thread nachvollziehen.

    Nun hast du alles gelöscht und einfach "Danke" hingeschrieben, und keiner weiss mehr worum es ging.

    ALso in Zukunft: Einfach auf den bestehenden thread antworten und mit neuem posting bedanken - und das Anfangsposting unverändert lassen.

    👍
    Vielleicht willst du stattdessen einfach [gelöst] in den Threadtitel dazueditieren? (Das hilft wenigstens etwas, ist aber nicht unbedingt nötig)

    Und übrigens: Die halbe Lösung wurde dir schon im Inversionen-Thread gepostet... (btw - int inversions(int number) habe ich in 15 Zeilen gecoded)



  • nicht_aendern_bitte schrieb:

    Noch eine Bitte - und eigentlich sollte das selbstverständlich sein.

    Lass bitte dein anfängliches posting (sprich: die Eingangsfragestellung bzw. Beschreibung des Problems) stehen. So können auch andere Leser, die ein ähnliches oder sogar gleiches Problem haben die Forensuche nutzen und den thread nachvollziehen.

    Nun hast du alles gelöscht und einfach "Danke" hingeschrieben, und keiner weiss mehr worum es ging.

    ALso in Zukunft: Einfach auf den bestehenden thread antworten und mit neuem posting bedanken - und das Anfangsposting unverändert lassen.

    Hat er bisher bei fast jedem seiner Threads gemacht, ist jedes Mal drauf hingewiesen worden und stellt´s trotzdem nicht ab. Außerdem habe ich den Eindruck, dass er sich hier bequem seine Aufgaben lösen lassen möchte, ohne selbst viel beizutragen. Meiner Meinung nach sollte ein Moderator hier mal eingreifen und einige Dinge klarstellen.



  • Diesmal hat er das Ursprungsposting wiederhergestellt. Schlampig zwar, aber ich denke es ist angekommen, daß er es stehenlassen soll.



  • danke sehr funktioniert;
    für mich leider zu kompliziert soweit bin ich noch nicht
    habe erst vor einem Monat begonnen.....

    sowas-vielleicht schrieb:

    Nicht besonders schön, aber vlt. das was du haben wolltest?

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <map>
    #include <sstream>
    
    struct convert {
    	static std::map<char,std::string> myMap;
    	static void init() {
    		myMap.clear();
    		myMap['0']  = "null";
    		myMap['1']  = "eins";
    		myMap['2']  = "zwei";
    		myMap['3']  = "drei";
    		myMap['4']  = "vier";
    		myMap['5']  = "fuenf";
    		myMap['6']  = "sechs";
    		myMap['7']  = "sieben";
    		myMap['8']  = "acht";
    		myMap['9']  = "nein";
    		myMap['.']  = "komma";
    	}
    
    	void operator()(char c) {
    		std::cout << myMap[c] << "-";
    	}
    };
    std::map<char,std::string> convert::myMap;
    
    std::string getStringRepresentation (double value) {
    	std::ostringstream oss;
    	oss << value;
    	return oss.str();
    }
    
    int main () {
    	double zahl;
    	std::cout << "Zahl eingeben: ";
    	std::cin >> zahl;
    	std::string strzahl(getStringRepresentation(zahl));
    	convert::init();
    	std::for_each(strzahl.begin(),strzahl.end(),convert());
    	std::cin.ignore(1);
    	std::cin.get();
    	return 0;
    }
    


  • volkard schrieb:

    Diesmal hat er das Ursprungsposting wiederhergestellt. Schlampig zwar, aber ich denke es ist angekommen, daß er es stehenlassen soll.

    ich dachte ein Lösungsansatz der nix bringt gehört nicht ins forum,
    werde mich bessern versprochen



  • markuswenczel schrieb:

    ich dachte ein Lösungsansatz der nix bringt gehört nicht ins forum,
    werde mich bessern versprochen

    Doch, sowas gehört durchaus hierhin. So können nämlich auch andere aus den Fehlern lernen, die dort drin stehen.



  • markuswenczel schrieb:

    danke sehr funktioniert;
    für mich leider zu kompliziert soweit bin ich noch nicht
    habe erst vor einem Monat begonnen.....

    Die quick-and-dirty Lösung war von mir. (war nicht eingeloggt)
    Was genau verstehst du daran nicht?
    Sollte es nicht den kompletten code betreffen, erklär ich es dir natürlich gerne.



  • inter2k3 schrieb:

    markuswenczel schrieb:

    danke sehr funktioniert;
    für mich leider zu kompliziert soweit bin ich noch nicht
    habe erst vor einem Monat begonnen.....

    Die quick-and-dirty Lösung war von mir. (war nicht eingeloggt)
    Was genau verstehst du daran nicht?
    Sollte es nicht den kompletten code betreffen, erklär ich es dir natürlich gerne.

    oss << value;

    der Operator << ist das ähnlich wie ein cin
    oder wird da value dem oss Objekt zugewiesen wie bei =
    lg
    markus



  • Du meinst cout, nicht cin.
    std::cout ist ein std::ostream mit Ziel -> Konsole.
    Ein std::ostringstream funktioniert fast gleich, nur das Ziel ist ein String, den du nachher mit .str() bekommst.
    Dann gibt es noch z.B. std::ofstream, der schreibt dann in eine Datei.



  • wxSkip schrieb:

    Du meinst cout, nicht cin.
    std::cout ist ein std::ostream mit Ziel -> Konsole.
    Ein std::ostringstream funktioniert fast gleich, nur das Ziel ist ein String, den du nachher mit .str() bekommst.
    Dann gibt es noch z.B. std::ofstream, der schreibt dann in eine Datei.

    myMap.clear();

    Löscht etwas ?



  • Nich etwas, sondern alles.



  • wxSkip schrieb:

    Nich etwas, sondern alles.

    Wie ein Destruktor oder?

    std::cin.ignore(1);

    was macht diese Zeile bitte?



  • markuswenczel schrieb:

    wxSkip schrieb:

    Nich etwas, sondern alles.

    Wie ein Destruktor oder?

    std::cin.ignore(1);

    was macht diese Zeile bitte?

    Nein, nicht wie ein Destruktor, du kannst danach immer noch Sachen in die map schreiben. Lediglich der Inhalt der Map wird gelöscht, nicht das ganze Objekt.

    std::cin.ignore(1) wird vermutlich 1 Zeichen bei std::cin überspringen - du kannst aber auch einfach mal unter http://www.cplusplus.com/reference reinschauen.



  • Deine Fragen wurden ja grösstenteils schon beantwortet.
    Wie bereits von mir erwähnt war das eine quick-and-dirty Lösung, einfach auf die schnelle hingetippt.

    Daher halte dich an Sachen wie z.b. cin.ignore(1) nicht auf. Wenn du eine Zahl eingegeben hast schliesst du diese vermutlich mit einem return (enter) ab, und dieses newline verbleibt im stream.
    Um die Konsole im debug-Modus offen zu halten verwenden viele ein einfaches cin.get(), das einfach ein beliebiges Zeichen extrahiert. Da aber das newline noch im stream ist, würde dieses nun die Konsole nicht offen bleiben weil es sofort durch cin.get() extrahiert werden würde. Daher ignoriere ich einfach ein Zeichen und warte dann auf eine Eingabe.
    Aber all das ist eigentlich eher unwichtig für dein Problem.

    Wie bereits von wxskip erklärt handelt es sich bei oss um ein ostringstream-Objekt. Wie das genau intern funktioniert muss dich erstmal nicht interessieren.
    Durch den operator<< kannst du nun Zahlen, strings etc. reinpacken und diese werden "in einen string umgewandelt". Diesen string kannst du dann abrufen mit der member-Funktion str().
    Also hast du nachher eine string-Repräsentation deiner eingegebenen Zahl. (es gibgt natürlich andere Lösungsansätze, aber dieser erschien mir am einfachsten)

    Nun geh ich Zeichen für Zeichen durch diesen string und verwende die entsprechenden chars als key für den Zugriff auf die map, in der die entsprechnenden Zifferntexte stehen.

    Das clear() auf der map ist eigentlich unnötig, genauso wie der Aufruf der init()-Funktion (man könnte die static map direktk über eine static-Funktion initialisieren). Aber ich denke so ist es einfacher für dich zu verstehen was wie wo wann passiert.



  • @inter2k3: Ich glaube kaum, dass die Newline im Puffer bleibt. Wenn du zwei Strings einliest, enthält ja auch keiner von beiden ein Newline-Zeichen.



  • Muss noch sehr viel lernen, habe ich jetzt verstanden.
    lg
    markus



  • wxSkip schrieb:

    @inter2k3: Ich glaube kaum, dass die Newline im Puffer bleibt. Wenn du zwei Strings einliest, enthält ja auch keiner von beiden ein Newline-Zeichen.

    Das kommt ganz darauf an, womit du die Strings einliest. getline() schluckt das \n am Ende der Eingabe und wirft es weg, op>> überliest Whitespaces, bis es etwas verwendbares findet.


Anmelden zum Antworten