do while Schleifen



  • Guten Abend Leute,
    ich bin Neuling in der IT und seit ca. 3 Tagen am C++ programieren.
    Ich habe irgendwie ein Problem mit do while Schleifen. Denn bei mir funktionieren sie irgendwie nur wen ich die Bedingung auf ungleich irgendwas setze.
    Als beispiel mal mein Lernprojekt "Taschenrechner" wo das Problem aufgetreten ist.

    #include <iostream>
    #include <cmath>
    using namespace std;
    	
    	int main() 
    {
    	
    	
    
    	int zahl1 = 0;
    	int zahl2 = 0;
    	char rechenzeichen;
    	float ergebnis;
    	int beenden;
    cout << "Hallo dies ist ein Taschenrechner\n";
    do {
    		cout << "gebe die erste Zahl ein";
    		cin >> zahl1;
    	
    		cout << "Gebe deine zweite Zahl ein ";
    		cin >> zahl2;
    	 
    do{
    		cout << "Gebe das gewünschte Rechenzeiche(+, -, *, / ) ein";
    		cin >> rechenzeichen;
    	switch (rechenzeichen)
    	{
    	 default: cout<< "falsches rechenzeichen"<<endl; break;
    	}
    	}
    	while(rechenzeichen != '+'&& rechenzeichen!='-'&& rechenzeichen != '*'&& rechenzeichen != '/');
    	
    
    	switch (rechenzeichen)
    	{
    		
    		case '+': ergebnis = (float)zahl1 + zahl2; break;
    		case '-': ergebnis = (float)zahl1 - zahl2; break;
    		case '*': ergebnis = (float)zahl1 * zahl2; break;
    		case '/': ergebnis = (float)zahl1 / zahl2; break;
    	}
    	 
    	 
    		cout << "Das Ergebnis von " << zahl1 << rechenzeichen << zahl2 << "=" << ergebnis << endl;
    		cout << "Zum beenden trücken sie die 0. Für eine weitere Rechnung eine belibige andere Zahl ";
    		cin >> beenden;
    	}
    	while (beenden != 0);
    
       
    	system("pause");
    	return 0;
    }
    	
    

    Das genaue Problem ist wen ich bei der Schleife die Bedingung auf gleich Nul setze funktioniert es nicht mehr richtig und bricht immer ab. Eigentlich sollte es ja dann bei der 0 wieder von vorne beginnen und bei einer anderen Zahl beenden.
    Ich glaube ich bin da bei den do while Schleifen gedanklich irgendwo falsch abgebogen. Denn irgendwas muss ja falsch sein sonst würde es ja gehen.

    Ich danke schon mal im Voraus führ eure Hilfe:)

    PS: ich nutze Embarcadero Dev-C++ fals es irgendwas damit auf sich haben könnte.



  • @käsekuchen Die do-while-Schleife läuft, solange die Bedingung wahr ist.

    (In anderen Sprachen gibt es noch repeat-until-Schleifen. Die brechen den Schleifendurchlauf ab, wenn die Bedingung wahr ist)



  • @DirkB
    Ja soweit ist mir das klar. Aber mein Problem ist ja dass wen ich schreib while (beenden= 0) dass er dann die Schleife nicht weiter ausführt wen ich eine 0 eingebe sondern diese beendet wird. Laut der do while Logik sollte sie ja wiederholt werden. Wen ich aber while (beenden !=0) eingebe dann bricht sie ordnungsgemäß bei der 0 ab und bei irgend ner anderen Zahl wiederholt sie sich wieder.



  • @käsekuchen sagte in do while Schleifen:

    while (beenden= 0)

    while (beenden == 0)
    Ich weiß nicht, was Du meinst. Die Schleife wird doch wie gewünscht bei Eingabe von 0 beendet?
    Wenn Du beenden == 0 nimmst, wird die Schleife solange ausgeführt bis du eine Eingabe von != 0 machst.



  • @Helmut-Jakoby
    Vielen Dank jetzt ist mir auch klar warum so einiges nicht funktioniert hat.
    Vielen Dank!

    Edit: der einzige Fehler wahr das ich =0 und nicht ==0 geschrieben habe. ansonsten wahr ja alles richtig da sie bei !=0 ja bei 0 abbricht.



  • @käsekuchen Das nächste mal bitte gleich den Code posten, der Probleme macht.

    Stell mal den Warn-Level vom Compiler hoch.
    Der meckert dann auch mögliche Zuweisungen bei Vergleichen an.



  • @DirkB der code steht oben der probleme macht. Aber da ich ... gleich 0 und nicht =0 geschrieben hab wahr nicht klar das ich einfach nur ein = vergessen hab.
    Aber dankle führ eure hilfe.
    Das Problem kann nun aber auch geschlossen werden.



  • @käsekuchen sagte in do while Schleifen:

    @DirkB der code steht oben der probleme macht. Aber da ich ... gleich 0 und nicht =0 geschrieben hab wahr nicht klar das ich einfach nur ein = vergessen hab.
    Aber dankle führ eure hilfe.
    Das Problem kann nun aber auch geschlossen werden.

    Ok, aber beherzige bitte, was @DirkB gesagt hat: "Stell mal den Warn-Level vom Compiler hoch." Der Compiler warnt dich dann automatisch vor diesem Fehler - das sieht dann zum Beispiel so aus:

    <source>: In function 'int main()':
    <source>:48:24: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
       48 |         while (beenden = 0);
          |                ~~~~~~~~^~~
    

    Der Compiler warnt dich dann also, dass eine Zuweisung als Wahrheitswert verwendet wurde.

    Finde heraus, wie du das bei dir aktivierst (z.B. verwende mindestens -Wall -Wextra bei gcc/clang)



  • Um nochmal zu betonen, was @wob und @DirkB gesagt haben:

    Warnungen niemals ignorieren!

    ich fahre meist mit diesem Setup hier:

    -Wall
    -Wextra
    -Wshadow
    -Wcast-align
    -Wswitch-default
    -Wunreachable-code
    -Wredundant-decls
    -Wundef
    -Wmissing-include-dirs
    -Wnon-virtual-dtor
    -Wzero-as-null-pointer-constant
    -Winit-self
    

    Da ich schon von einigen ( nicht hier im Forum ) den Satz gehört habe: "Warnungen sind keine Fehler", möchte ich hier an dieser Stelle noch mal betonen: Warnungen können (!) sehr wohl Fehler sein. Nicht selten auch Fehler, die zu einem Absturz oder ungewünschtem Verhalten führen.
    Daher gilt auch für Neulinge: Aktiviert ein gewisses Set an Warnungen und behebt die Ursachen. Und lernt zeitnah zu verstehen was die Warnungen bedeuten.



  • @It0101 Es geht hier ja um Embarcadero Dev-C++ - keine Ahnung, ob man da dieselben Optionen hat. Scheint ja auch optional einen Clang-Enhanced-Compiler zu haben. Für @käsekuchen: die Einstellung kannst du offenbar hier vornehmen: https://docwiki.embarcadero.com/RADStudio/Sydney/en/Errors_and_Warnings_of_Clang-enhanced_C%2B%2B_Compilers


Log in to reply