Was läuft hier falsch? Programm macht, was es nicht soll...



  • Hallo,
    nach Stunden, in denen ich nicht wusste, wo nun das Problem liegt, konnte ich es nun finden, kann es aber leider nicht verstehen und weiß deshalb nicht, wie ich es loswerde.
    Es geht um das folgende extrahierte Stück. Das Problem ist, dass die Schleife gleich beim ersten Aufrufen alle 80 Punkte ausgibt, wo sie es doch nur bis zu dem Wert 0,79*prozent ausgeben sollte. So wird zunächst einmal die for Schleife komplett ausgeführt, danach aber die Ausgabe mit dem Doppelpunkt praktisch nicht mehr beachtet. Nun ja seht selbst:

    #include <iostream>
    int durchgaenge1;
    double prozent{ 0 }, teil{ 0 }, durchgaenge2{ 0 }, punkte{ 0 };
    
    int main()
    {
    	std::cin >> durchgaenge1;
    	durchgaenge2 = double(durchgaenge1);
    	for (; teil<=durchgaenge1;)
    	{
    		teil++;
    		std::cout << teil << ": ";
    		prozent = prozent + (100 * teil / durchgaenge2);
    		while (punkte <= (prozent * 0, 79))
    		{
    			std::cout << ".";
    			punkte = punkte + 1;
    		}
    	}
    	system("Pause");
    }
    

    Ich hoffe ihr könnt mir helfen!
    Danke schon mal...



  • ...
    while (punkte <= (prozent * 0, 79))
    ...
    

    Komma in Punkt ändern.

    ...
    while (punkte <= (prozent * 0.79))
    ...
    


  • Die Zeile

    while (punkte <= (prozent * 0, 79))
    

    sollte

    while (punkte <= prozent * 0.79)
    

    sein.

    Lustigerweise kompiliert die erste Version einwandfrei. Kann das jemand erklären 😕



  • punkte <= (prozent * 0, 79)
    

    Schau mal scharf auf die Dezimalzahl und schlag mal nach ob C++ als Trennzeichen bei Nachkommastellen ein Komma oder einen Punkt verwendet.
    0,79 wird dann vom Compiler als 79 interpretiert.



  • icarus2 schrieb:

    Die Zeile

    while (punkte <= (prozent * 0, 79))
    

    sollte

    while (punkte <= prozent * 0.79)
    

    sein.

    Lustigerweise kompiliert die erste Version einwandfrei. Kann das jemand erklären 😕

    War mir bis dato auch nicht klar, mir ist es nach deiner Frage aber klar geworden: Es gibt ja den Kommaoperator, das Komma wird also genauso interpretiert und 0,79 ergibt den Wert rechts.


  • Mod

    icarus2 schrieb:

    Lustigerweise kompiliert die erste Version einwandfrei. Kann das jemand erklären 😕

    Warum nicht? Da wird halt punkte mit 79 verglichen.



  • SeppJ schrieb:

    icarus2 schrieb:

    Lustigerweise kompiliert die erste Version einwandfrei. Kann das jemand erklären 😕

    Warum nicht? Da wird halt punkte mit 79 verglichen.

    Ah, jetzt verstehe ich was da passiert. Ich war gerade wirklich verwirrt. Schon lustig was man so alles schreiben kann... 🙂



  • Okay, das mit dem Punkt hat mir jetzt schon einmal indirekt weitergeholfen:
    Zwar war nicht das Komma das Problem(Punkt oder Komma: Es kommt das gleiche raus), sondern das Leerzeichen, das sich irgendwie zwischen Komma und 79 eingeschlichen hatte. 🤡
    Aber irgendwie macht das Programm mir jetzt viel zu viele Punkte, statt nur insgesamt 80. 😮


  • Mod

    irreal++ schrieb:

    Okay, das mit dem Punkt hat mir jetzt schon einmal indirekt weitergeholfen:
    Zwar war nicht das Komma das Problem(Punkt oder Komma: Es kommt das gleiche raus), sondern das Leerzeichen, das sich irgendwie zwischen Komma und 79 eingeschlichen hatte. 🤡
    Aber irgendwie macht das Programm mir jetzt viel zu viele Punkte, statt nur insgesamt 80. 😮

    Heißt das, du hast immer noch das Komma drin? Dann ist doch kein Wunder, dass das Programm nicht das tut, was es soll. Mit Punkt und Komma kommen hier jeweils ganz unterschiedliche Ergebnisse heraus!



  • Wie gesagt, Punkt oder Komma machen, zumindest hier, keinen Unterschied.
    Jedenfalls macht das Programm jedesmal das gleiche...



  • irreal+++ schrieb:

    Wie gesagt, Punkt oder Komma machen, zumindest hier, keinen Unterschied.

    DOCH.

    Obwohl ich wenig Hoffnung habe, wenn das Gleiche schon vier (!) Leute gesagt haben und du es aus irgendeinem Grund nicht glauben willst.

    Und räum mal mit deinen Variablen auf. Benutze nur die, die du wirklich brauchst, und deklariere sie unmittelbar vor Benutzung -- sicher nicht global.



  • SeppJ schrieb:

    irreal++ schrieb:

    Okay, das mit dem Punkt hat mir jetzt schon einmal indirekt weitergeholfen:
    Zwar war nicht das Komma das Problem(Punkt oder Komma: Es kommt das gleiche raus), sondern das Leerzeichen, das sich irgendwie zwischen Komma und 79 eingeschlichen hatte. 🤡
    Aber irgendwie macht das Programm mir jetzt viel zu viele Punkte, statt nur insgesamt 80. 😮

    Heißt das, du hast immer noch das Komma drin? Dann ist doch kein Wunder, dass das Programm nicht das tut, was es soll. Mit Punkt und Komma kommen hier jeweils ganz unterschiedliche Ergebnisse heraus!

    Ich habe benutze den Punkt statt dem Komma, dennoch macht es viel zu viele Punkte.
    Theoretisch müsste es doch jedes mal (egal, welche int konforme Zahl eingegeben wird) genau 80 Punkte machen, oder irre ich mich da?
    EDIT: Es scheint so, als würde punkte bei jedem Aufruf der Schleife erneut auf 0 zurückgesetzt werden?! 😕

    DOCH.

    Obwohl ich wenig Hoffnung habe, wenn das Gleiche schon vier (!) Leute gesagt haben und du es aus irgendeinem Grund nicht glauben willst.

    Und räum mal mit deinen Variablen auf. Benutze nur die, die du wirklich brauchst, und deklariere sie unmittelbar vor Benutzung -- sicher nicht global.

    Ja Sie haben Recht, aus unerfindlichen Gründen wurde das Programm nach einer erneuten Änderung zum Komma nicht neu erstellt.
    Nochmal: Ich habe jetzt 0.79 eingetragen. Dennoch werden zu viele Punkte ausgegeben, nämlich nach jedem Doppelpunkt mehr statt immer etwa gleich viele Punkte. Deshalb schließe ich darauf, dass punkte immer zurückgesetzt wird.



  • Der Code sähe nun so aus:

    #include <iostream>
    int main()
    {	
    	int durchgaenge1;
    	std::cin >> durchgaenge1;
    	double prozent{ 0 }; 
    	int teil{ 1 }, punkte{ 0 };
    	while (teil<=durchgaenge1)
    	{
    		std::cout << teil << ": ";
    		prozent = prozent + (100 * teil / durchgaenge1);
    		while (punkte <= (prozent * 0.79))
    		{
    			std::cout << ".";
    			punkte = punkte + 1;
    		}
    		teil++;
    	}
    	system("Pause");
    }
    

    Macht aber trotzdem nicht das, was ich möchte...



  • prozent = prozent + (100.0 * teil / durchgaenge1);
    //                      ^^
    


  • hmm, ändert nichts, inwiefern soll dies helfen?


  • Mod

    irreal++ schrieb:

    hmm, ändert nichts, inwiefern soll dies helfen?

    Weil dann teil/durchgaenge das ergibt, was du denkst, was es ergibt, statt dem, was wirklich raus kommt. Stichwort: Integerdivision.

    Es wäre übrigens sehr hilfreich, wenn du mal beschreiben würdest, was du möchtest. Dass da viele Punkte ausgegeben werden, sehen wir auch. Ob das zu viele sind, können wir nicht sagen, da wir nicht wissen, was du willst. Wir kennen ja nur dein Programm und dein Programm gibt genau so viele Punkte aus wie wir vom Code her auch annehmen würden.



  • Ich möchte, dass immer, egal welche Zahl ich angebe, 80 Punkte ausgegeben werden.
    Eigentlich sollten deshalb zwischen jeden : immer ETWA gleich viele Punkte enthalten sein. Der : ist dabei nur da, um zu sehen, dass das eigentlich nicht passiert.

    EDIT: Natürlich sollten diese Schrittweise ausgegeben werden 😉



  • Da du 'teil' in jedem Schleifendurchgang erhöhst, wird dann 'prozent' immer größer (weil du dazuaddierst).
    Du willst wohl einfach

    prozent = 100.0 * teil / durchgaenge1;
    

    ???

    Aber benutze am besten einen Debugger - oder laß dir die beiden Variablen einfach mal ausgeben...



  • Th69 schrieb:

    Da du 'teil' in jedem Schleifendurchgang erhöhst, wird dann 'prozent' immer größer (weil du dazuaddierst).
    Du willst wohl einfach

    prozent = 100.0 * teil / durchgaenge1;
    

    ???

    Aber benutze am besten einen Debugger - oder laß dir die beiden Variablen einfach mal ausgeben...

    Ouh man 😃

    Genau das wars, ich habe prozent praktisch zweimal größer werden lassen: Durch das erhöhen von teil und dazuaddieren von prozent!
    Wie konnte ich das übersehen?! 🤡 🤡
    Danke für die Mühe! Ich würde wahrscheinlich immer noch rätseln!
    Vielen vielen Dank!



  • Nimm dir die Tipps zu Herzen und nimm ab sofort zur Fehlersuche einen Debugger.


Anmelden zum Antworten