if else und Toleranz


  • Mod

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
      double a =0.0; // Messwert a
      double b =0.0; // Messwert b
      double t =5.0; // Toleranz (Nennmaß) von 5.0, zwichen a+b
      double d =0.0; // Differens von a +b
    
      while (cin>> a >>b )
      {
    
        if((a<b) && (d=b-a))
          {
            cout <<b <<" B ist groesser A "<<a<<" Differens: "<< d <<'\n';
    
            if (d<t)
              {
                cout <<d <<" OK beide Werte ligen in der Toleranz von "<<t <<'\n';
              }
    
            else if (d>t)
              {
                cout <<d <<"= SCHROTT Werte ligen ueber der Toleranz von "<<t <<'\n';
              }
    
          }
    
        else
    
          if((a>b) && (d=a-b))
            {
              cout <<a <<" A ist groesser B "<<b <<" Differens: "<< d<<'\n';
              if (d<t)
    
                {
                  cout <<d <<" OK beide Werte ligen in der Toleranz von "<<t <<'\n';
                }
    
              else if (d>t)
                {
                  cout <<d <<"= SCHROTT Werte ligen ueber der Toleranz von "<<t <<'\n';
                }
    
            }
          else if((a==b)  && (d=a-b))
    
            {
              // Was auch immer dann geschehen soll
            }
    
      }
      //-- Halt Routine --
      getchar();
      return 0;
    }
    

    Anmerkungen:
    -Kauf dir mal 'nen Duden und lies ihn!
    -Das mit der Zuweisung im if ist kein guter Stil, da schwer zu lesen.
    -Auch schwer zu lesen ist dein Stil, wo du Leerzeichen setzt und wo nicht.
    -Man könnte auch alles kürzen zu

    #include <iostream>
    #include <cmath> 
    using namespace std;
    
    int main()
    {
      const double t = 5.0; // Toleranz (Nennmaß) von 5.0
    
      double a, b; 
      while (cin >> a >> b)
        { 
          if(a < b)
             cout << b << " B ist größer als A " << a;
          else if (a > b)
             cout << a << " A ist größer als B " << b;
          else if (a == b)
             cout << a << " A ist gleich B " << b;
    
          double d = fabs(a - b); 
          cout << " Differenz: " << d << '\n';
    
          if (d <= t)
            cout << d << "= OK Beide Werte liegen in der Toleranz von " << t << '\n';
          else
            cout << d << "= SCHROTT Werte liegen über der Toleranz von " << t << '\n';
        }
    }
    

    Was nicht nur kürzer, sondern auch richtiger ist. Denn bei deinem jetzigen Code hast du so viele Einzelfälle betrachtet, dass du ein paar vergessen hast (zum Beispiel Differenz gleich Toleranz). Dabei ist das alles auf wenige Fälle rückführbar.



  • [quote="Asyl-Dämon"]Du hast die Mengenklammern von der Schleife vergessen und als Tipp: Du hast ein paar Rechtschreibfehler in deinen Kommentaren.[/quote] Wo muss die Mengenklammer hin. Bitte mit Nase draufstoßen, stehe auf der Leitung. Die anderen Lössunge sind sehr gut, kommen nächste Woche dran.



  • while(Bedingung){
    
    //Der Code
    
    }
    

    Alles was sich in der Schleife wiederholt muss zwischen zwei geschweiften Klammern stehen.



  • Asyl-Dämon schrieb:

    while(Bedingung){
    
    //Der Code
    
    }
    

    Alles was sich in der Schleife wiederholt muss zwischen zwei geschweiften Klammern stehen.

    Das ist falsch, wenn der Schleifenrumpf nur aus 1 Befehl besteht, dürfen die Klammern entfallen.

    MFG Martin



  • @mgaeckler
    Jetzt wo du's sagst, sehe ich, dass es nur 1 Befehl ist


  • Mod

    Wenn dieser eine Ausdruck über 50 Zeilen geht, ist es vielleicht trotzdem eine gute Idee, da ein paar Klammern zu setzen...



  • SeppJ schrieb:

    Wenn dieser eine Ausdruck über 50 Zeilen geht, ist es vielleicht trotzdem eine gute Idee, da ein paar Klammern zu setzen...

    Das stimmt natürlich.



  • Es läuft fast
    Warum wird Zeile 44 nicht aus gegeben
    cout <<a <<" A ist gleich B "<<b <<" Differens: "<< d<<'\n';

    ich weiß das der Code nicht gut ist aber.....

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    double a =0.0; // Messwert a
    double b =0.0; // Messwert b
    double t =5.0; // Toleranz (Nennmaß) von 5.0, zwichen a+b
    double d =0.0; // Differens von a +b
    
    while (cin>> a >>b )
    
    	if((a<b) && (d=b-a))
    	{
    	 cout <<b <<" B ist groesser A "<<a<<" Differens: "<< d <<'\n';
    
    		//	{
    					   if (d<t)
    						{
    						 cout <<d <<" OK beide Werte ligen in der Toleranz von "<<t <<'\n';
    						}
    						  else if (d>t)
    						  {
    						   cout <<d <<"= SCHROTT Werte ligen ueber der Toleranz von "<<t <<'\n';
    						  }
    
    		//	}
    
       	}
    
    		else
    		{
    			if((a>b) && (d=a-b))
    			{
    			 cout <<a <<" A ist groesser B "<<b <<" Differens: "<< d<<'\n';
    			}
    
    			else if((a==b)&& (d=a-b))
    
    			   { 
    				cout <<a <<" A ist gleich B "<<b <<" Differens: "<< d<<'\n';
    			   }
    
    					   if (d<t)
    						{
    						 cout <<d <<" OK beide Werte ligen in der Toleranz von "<<t <<'\n';
    						}
    						  else if (d>t)
    						  {
    						   cout <<d <<"= SCHROTT Werte ligen ueber der Toleranz von "<<t <<'\n';
    						  }
    
    		}
    
    //-- Halt Routine --
    getchar();
    return 0;
    }
    

    [code="cli"]


  • Mod

    juhu123 schrieb:

    ich weiß das der Code nicht gut ist aber.....

    Nicht "aber", sondern "deshalb". Wahrscheinlich kommt der Ausführungsfluss niemals bei der Anweisung an. Denn Code wird nicht irgendwie magisch übersprungen. Der Computer macht ganz genau das was du sagst. Und wenn da irgendein Chaos aus if, else und geschweiften Klammern steht, dann findet er den Weg durch dieses Labyrinth. Die Frage ist, ist dies der Weg, den du dir selber vorgestellt hast, als du das Programm geschrieben hast? Wahrscheinlich nicht, denn der Code ist ungeheuer unübersichtlich formatiert und daher schwer nachvollziehbar.



  • OK, einmal Mülltonne und komplett neu. Schönes Wochenende


  • Mod

    Viele Editoren haben automatische Codeeinrückung. Und Anzeige, welches Klammerpaar wo endet. Beides wäre sicherlich sehr hilfreich bei deinem Schreibstil. Versuch mal raus zu finden, ob du diese Features zur Verfügung hast* und wie du sie benutzt.

    *: Und falls nicht, besorg dir besseres Werkzeug.



  • juhu123 schrieb:

    Warum wird Zeile 44 nicht aus gegeben
    cout <<a <<" A ist gleich B "<<b <<" Differens: "<< d<<'\n';

    Weil du davor if((a==b)&& (d=a-b)) hast.

    Wenn a==b wahr ist, dann kommt für d halt 0 raus. Das ist aber unwahr.

    wahr && unwahr ist unwahr. Somit wird der if-Zweig nicht ausgeführt.

    Ein andere Schwachstelle ist noch die Gleichheit von Fließkommawerten.



  • DirkB schrieb:

    juhu123 schrieb:

    Warum wird Zeile 44 nicht aus gegeben
    cout <<a <<" A ist gleich B "<<b <<" Differens: "<< d<<'\n';

    Weil du davor if((a==b)&& (d=a-b)) hast.

    Wenn a==b wahr ist, dann kommt für d halt 0 raus. Das ist aber unwahr.

    wahr && unwahr ist unwahr. Somit wird der if-Zweig nicht ausgeführt.

    Ein andere Schwachstelle ist noch die Gleichheit von Fließkommawerten.

    Vielen Dank, es läuft. Ich werde aber trotzdem alles überarbeiten.
    Schönes Wochenende


Anmelden zum Antworten