Ein "double-"ergebnis nicht aus Integern-Variablen möglich?



  • Guten Tag,
    ich habe folgenden Code-Ausschnitt für Euch:

    srand(time(0));
    		int zufallszahl;
    		double anzahl_richtige = 0;
    		double anzahl_falsche = 0;
    		double erfolg;
    		double anzahl_vokabeln = 0;
    		while(1) {
    			std::string eingabe_englisch;
    			zufallszahl = rand() % anzahl_zeilen;
    			erfolg = anzahl_richtige / anzahl_vokabeln * 100;
    			anzahl_vokabeln++;
    			system("CLS");
    			std::cout << "Richtige: " << anzahl_richtige << "	Falsche: " << anzahl_falsche << "	Erfolg: " << erfolg << "%\n\n\n";
    			std::cout << "Deutsch:  " << deutsch[zufallszahl] << '\n';
    			std::cout << "Englisch: ";
    			std::cin  >> eingabe_englisch;
    			if(eingabe_englisch == englisch[zufallszahl]) {
    				std::cout << "Richtig!";
    				anzahl_richtige++;
    				_getch();
    			}
    			else {
    				std::cout << "Falsch: " << englisch[zufallszahl];
    				anzahl_falsche++;
    				_getch();
    			}
    		}
    

    Und zwar ist es ein Teil meines Lernprogramms. Es sollen zufällige Vokabeln aus einer Textdatei eingelesen werden (funktioniert). Nun soll der Benutzer eine Vokabel auf englisch eingeben, dann wird sie mit der Richtigen verglichen und ausgewertet. Das funktioniert auch alles, nur wenn ich Änderung an folgendem Ausschnitt vornehme

    double anzahl_richtige = 0;
    		double anzahl_falsche = 0;
    		double erfolg;
    		double anzahl_vokabeln = 0;
    

    Und ersetze durch

    int anzahl_richtige = 0;
    		int anzahl_falsche = 0;
    		double erfolg;
    		int anzahl_vokabeln = 0;
    

    dann ist irgendwas falsch bei der Berechnung

    erfolg = anzahl_richtige / anzahl_vokabeln * 100;
    

    denn das Programm hängt sich dann auf.
    Wisst ihr warum? Denn eigentlich müsste folgender Pseudocode doch funktionieren

    double erfolg = int zahl1 / int zahl2
    

    :xmas1:



  • Wenn du zwei ints dividierst, kommt auch int raus. Die Lösung: Schreib eine Multiplikation mit 1.0 dazu.



  • Achso okay funktioniert, danke. Irgendwie komisch finde ich. Ich meine mich zu erinnern, dass es beim Dev C++ Compiler funktionierte (ohne Multiplikation von 1.0)



  • Du kannst auch static_cast<double>(operand) verwenden. Natürlich vor der Division.


  • Mod

    Feuerkelch schrieb:

    Achso okay funktioniert, danke. Irgendwie komisch finde ich. Ich meine mich zu erinnern, dass es beim Dev C++ Compiler funktionierte (ohne Multiplikation von 1.0)

    Das wäre ein Fehler im Compiler, denn dieses Verhalten ist so vorgeschrieben (und das hat auch gute Gründe, die du jetzt vielleicht nicht siehst). Jetzt werden einige sagen, dass dies bei Dev C++ kein Wunder ist, aber so krasse Fehler hat der nun auch nicht.



  • Jetzt hab ich ein anderes Problem. Der selbe Codeausschnitt wie oben, nur dass ich jetzt statt einer einfachen "cin-" Eingabe eine "con.getline()" funktion nutzen möchte (bei Leerzeicheneingabe)

    srand(time(0));
    		int zufallszahl;
    		int anzahl_richtige = 0;
    		int anzahl_falsche = 0;
    		int anzahl_vokabeln = 0;
    		double erfolg;
    		while(1) {
    			char eingabe_englisch[100];
    			zufallszahl = rand() % anzahl_zeilen;
    			erfolg = (anzahl_richtige * 1.0) / (anzahl_vokabeln * 1.0) * 100;
    			anzahl_vokabeln++;
    			system("CLS");
    			std::cout << "Richtige: " << anzahl_richtige << "	Falsche: " << anzahl_falsche << "	Erfolg: " << erfolg << "%\n\n\n";
    			std::cout << "Deutsch:  " << deutsch[zufallszahl] << '\n';
    			std::cout << "Englisch: ";
    			std::cin.getline(eingabe_englisch, 100, '\n');
    			if(eingabe_englisch == englisch[zufallszahl]) {
    				std::cout << "Richtig!";
    				anzahl_richtige++;
    				_getch();
    			}
    			else {
    				std::cout << "Falsch: " << englisch[zufallszahl];
    				anzahl_falsche++;
    				_getch();
    			}
    		}
    

    Funktioniert auch, aber leider wird das erste mal eingeben übersprungen und mir schmeißt das Programm einfach ein Falsch hin. Wenn ich mir eine neue Vokabel abfrage, dann funktioniert es. Es ist also nur am Start der Abfrage. 😕



  • Schreib mal über das getline ein std::cin.ignore();.



  • Okay funktioniert, kommt mir aber irgendwie gefuscht vor 😃



  • Feuerkelch schrieb:

    Okay funktioniert, kommt mir aber irgendwie gefuscht vor 😃

    Ist es aber nicht.
    ignore ist eine Funktion von istream und dient dazu, zZeichen aus einem sStream bis zu einem dDelimitter oder der angegebenen Anzahl zu ignorieren.

    istream&  ignore ( streamsize n = 1, int delim = EOF );//Deklaration
    

    Es wird also bei der "default" Variante einfach ein Zeichen übersprungen.


Anmelden zum Antworten