Ich komme nicht aus meiner Schleife heraus



  • Hallo zusammen,
    ich bin blutiger c++-Anfänger und hab kaum Ahnung von der Materie.
    Jedenfalls sollen wir in der Schule eine Win32-Konsolenanwendung schreiben, die Widerstände zusammenrechnet.

    Mein Problem ist, dass innerhalb der Schleife zwar gerechnet wird, ich aber aus der Schleife nicht herauskomme.Leider kann ich es genauer nicht beschreiben.
    Naja, blutiger Forumsnutzer bin ich im Übrigen auch.

    Wäre echt nett, wenn mir wer helfen könnte... Hier mein Programm:

    case 6:
    {
    char r; //Als Bedingung der for-Schleife
    float Widerstand;
    float Rr=0; //Summe der Reihenwiderstände
    float Rp=0; //Summe der Parallelwiderstände
    float Rz=0; //Summe aus Rr & Rz

    cout<<"Herzlich Wilkommen!\nBitte druecken sie (S)tart\n";
    cin>>r;
    cout<<"Bitte geben sie ihre Widerstaende ein\n";
    cout<<"Beispieleingabe: (p20) fuer 20 Ohm parallel-"
    "/ (r20) fuer 20 Ohm Reihenwiderstand\n";
    cout<<"Druecken sie (u) zum umkehren eines Wertes\n";
    cout<<"Eingabe von = zeigt das Zwischenergebnis an\n";

    for(;r='s'||'r'||'p'||'='||'u';)
    {
    cin>>r;

    if(r=='=') {
    if(Rp==0) {Rz+=Rr;}
    else if(Rp>=0){Rz+=(Rr+(1/Rp));}

    cout<<Rz<<" Ohm\n";
    Rg+=Rz;
    Rp=Rp-Rp;
    Rr=Rr-Rr;
    cin>>r;
    }
    else if(r=='u') { Rp=Rz=1/Rz; cin>>r;}

    cin>>Widerstand;

    if(r=='p') { Rp+=1/Widerstand; }
    else if(r=='r') { Rr+=Widerstand; }
    else { break;}
    }
    cout<<Rz<<" Ohm";
    }
    break;



  • Sepas schrieb:

    for(;r='s'||'r'||'p'||'='||'u';)
    

    Deine Bedingung ist falsch.
    Zum einen besteht der Vergleichsoperator auf Gleichheit aus zwei =
    Zum anderen musst du jedes Zeichen einzeln mit r vergleichen und dann verodern.

    r=='s'|| r=='r' || r== ....
    

    Da du aber auf das init und inkrement verzichtest, ist das eher eine while-Schleife,

    Ach ja, benutze bitte die C++-Tags unter den 😞 😉
    (Code markieren und auf den Button klicken)



  • Sepas schrieb:

    for(;r='s'||'r'||'p'||'='||'u'; )

    Da sollte der Compiler eigentlich warnen, denn das ist doppelt falsch. '=' ist eine Zuweisung, der Test auf Gleichheit ist '=='. Und die Bedingung ist immer wahr, denn '<beliebiger Buchstabe>' ist ungleich Null und immer wahr. Wenn du vergleichen möchtest musst du das explizit schreiben. Warnungen vom Compiler aktivieren!

    Richtig ist:

    for(;r=='s'||r=='r'||r=='p'||r=='='||r=='u';)
    

    Fürs nächste mal bitte den Code in Code-Tags einfassen und möglichst ein compilierbares (also komplettes) Minimalbeispiel posten.



  • Erst mal danke für die schnelle Hilfe, denn damit hatte ich nicht gerechnet.
    Im Übrigen scheint das aber wohl nicht mein einziger Fehler zu sein, denn die Schleife, ob for- oder while-, bricht nicht ab. Selbst dann, wenn ich für char etwas anderes als die gewählten Bedingungen eingebe.
    Da muss ich wohl oder übel anfangen zu sezieren.

    Ich glaube jetzt habe ich es mit der Code-Anzeige....

    while(r=='s'||r=='r'||r=='p'||r=='='||r=='u';)
    


  • Sepas schrieb:

    Erst mal danke für die schnelle Hilfe, denn damit hatte ich nicht gerechnet.
    Im Übrigen scheint das aber wohl nicht mein einziger Fehler zu sein, denn die Schleife, ob for- oder while-, bricht nicht ab. Selbst dann, wenn ich für char etwas anderes als die gewählten Bedingungen eingebe.
    Da muss ich wohl oder übel anfangen zu sezieren.

    Ich glaube jetzt habe ich es mit der Code-Anzeige....

    while(r=='s'||r=='r'||r=='p'||r=='='||r=='u';)
    

    Entferne mal das ;



  • Keine Ahnung ob dein Quelltext hier exakt dem auf deinem Rechner entspricht?

    Hast du in den letzten beiden Zeilen break und ) vertauscht?



  • Und das Minimalbeispiel währe folgendes:

    #include<iostream>
    #include<conio.h>
    
    using namespace std;
    int main();
    {
    	char r;				//Als Bedingung der while-Schleife
    	float Widerstand;
    	float Rr=0;			//Summe der Reihenwiderstände
    	float Rp=0;			//Summe der Parallelwiderstände
    	float Rz=0;			//Summe aus Rr & Rz
    
    	cout<<"Herzlich Wilkommen!\nBitte druecken sie (S)tart\n";
    	cin>>r;
    	cout<<"Bitte geben sie ihre Widerstaende ein\n";
    	cout<<"Beispieleingabe: (p20) fuer 20 Ohm parallel-"
    		  "/ (r20) fuer 20 Ohm Reihenwiderstand\n";
    	cout<<"Druecken sie (u) zum umkehren eines Wertes\n";
    	cout<<"Eingabe von = zeigt das Zwischenergebnis an\n";
    
    	while(r=='s'||r=='r'||r=='p'||r=='='||r=='u';)
    	{
    		cin>>r;
    		else				{ break;}		
    		if(r=='=')			{
    							  if(Rp==0)				{Rz+=Rr;}
    							  else if(Rp>=0)		{Rz+=(Rr+(1/Rp));}
    
    							  cout<<Rz<<" Ohm\n";
    							  Rg+=Rz;
    							  Rp=Rp-Rp;
    							  Rr=Rr-Rr;
    							  cin>>r;
    							}
    		else if(r=='u')		{ Rp=Rz=1/Rz;	cin>>r;}
    
    		cin>>Widerstand;
    
    		if(r=='p')			{ Rp+=1/Widerstand; }
    		else if(r=='r')		{ Rr+=Widerstand; }
    
    	}	
    	cout<<Rz<<" Ohm";
    
    		system("Pause");
    
    		return 0;
    
    }
    


  • Diese Klammer

    }
    

    sollte das sein. 🙄



  • Ich kann mich mit deiner Quelltext-Formatierung nicht anfreunden:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char sel;
        cout << "bitte waehlen: ";
    
        switch(sel=6)
        {
        case 6:
    
            char r; //Als Bedingung der for-Schleife
            float Widerstand;
            float Rr=0; //Summe der Reihenwiderstände
            float Rp=0; //Summe der Parallelwiderstände
            float Rz=0; //Summe aus Rr & Rz
            float Rg=0; //Summe aus ?
    
            cout<<"Herzlich Wilkommen!\nBitte druecken sie (S)tart\n";
            cin>>r;
            cout<<"Bitte geben sie ihre Widerstaende ein\n";
            cout<<"Beispieleingabe: (p20) fuer 20 Ohm parallel-"
                "/ (r20) fuer 20 Ohm Reihenwiderstand\n";
            cout<<"Druecken sie (u) zum umkehren eines Wertes\n";
            cout<<"Eingabe von = zeigt das Zwischenergebnis an\n";
    
            for(; r=='s'||r=='r'||r=='p'||r=='='||r=='u';)
            {
                cin>>r;
    
                if(r=='=')
                {
                    if(Rp==0)
                    {
                        Rz+=Rr;
                    }
                    else if(Rp>=0)
                    {
                        Rz+=(Rr+(1/Rp));
                    }
    
                    cout<<Rz<<" Ohm\n";
                    Rg+=Rz;
                    Rp=Rp-Rp;
                    Rr=Rr-Rr;
                    cin>>r;
                }
                else if(r=='u')
                {
                    Rp=Rz=1/Rz;
                    cin>>r;
                }
    
                cin>>Widerstand;
    
                if(r=='p')
                {
                    Rp+=1/Widerstand;
                }
                else if(r=='r')
                {
                    Rr+=Widerstand;
                }
                else
                {
                    break;
                }
            }
            cout<<Rz<<" Ohm";
            break;
        }
    }
    


  • Was ist denn verkehrt?



  • Deine Einrückung ist nicht falsch, dem Compiler ist das sowieso egal, aber etwas sagen wir gewöhungsbedürftig. Ich würde mir an deiner Stelle einen der üblichen Stile angewöhnen, das Internet sagt sicher mehr wenn man danach sucht. Auf jeden Fall konsequent nur einen Stil, nicht mischen. Bei dir sind die Zeilen 47 & 50 zu weit rechts.

    Dein Minimalbeispiel hat mehrere Probleme. Nochmal, aktiviere die Warnungen vom Compiler und beachte diese!
    -kein ; nach main() (nur nach Funktionsprototypen)
    -; in der while-Schleife ist falsch
    Den Rest lass ich dich selber lösen, durch den ungewöhnlichen Einrückungsstil ist es etwas schwer den Code nachzuvollziehen (ja, ich könnte den Code durch ein Formatierungstool laufen lassen).

    f.cpp: In function 'int main()':
    f.cpp:25:9: error: 'else' without a previous 'if'
    f.cpp:31:31: error: 'Rg' was not declared in this scope
    f.cpp:47:23: error: 'system' was not declared in this scope
    


  • Vielen Dank, ich mache mich dann direkt mal an die Arbeit...
    und den Formatierungsstil^^
    Bis dann



  • Ach und die Warnungen habe ich auch schon gefunden und auf W3 gestellt.
    Die Einstellung kannte ich bis dato noch nicht.


Log in to reply