Verschachtelte Bedingungen (Negativbeispiel)



  • Hallo!

    Es seien a,b,c,d und stat als int-Variabeln deklariert. Ein hoffentlich abschreckendes Beispiel für schlechtes Layout stellt folgende geschachtelte if-Bedingung dar:

    if(a<b) {if(c<d)                   {stat=1;}
         else {if(a<c) {if(b<d)        {stat=2;}
                                 else  {stat=3;}
       }  else {if(a<d) {if(b<c)       {stat=4;}
                                 else  {stat=5;}
                          }      else  {stat=6;}
              } } }              else  {stat=7;}
    

    Bestimmen Sie die Werte, die der Variablen stat in den folgenden vier Fällen zugewiesen werden.

    \begin{array}{|c|c|c|c|c|c|} \mbox{Fall} & a & b & c & d & \mbox{stat}\\ \hline 1 & 0 & 1 & 1 & 0\\ 2 & 1 & 0 & 0 & 1\\ 3 & 0 & 1 & 0 & 1\\ 4 & 1 & 0 & 1 & 0\\ \end{array}

    ---

    Ich habe mal versucht, mich da durchzuboxen.
    Meine Ergebnisse (letzte Spalte) sind:

    \begin{array}{|c|c|c|c|c|c|} \mbox{Fall} & a & b & c & d & \mbox{stat}\\ \hline 1 & 0 & 1 & 1 & 0 & 3\\ 2 & 1 & 0 & 0 & 1 & 7\\ 3 & 0 & 1 & 0 & 1 & 1\\ 4 & 1 & 0 & 1 & 0 & 7\\ \end{array}

    Erläuterung:

    Ich habe es mir mal ein bisschen übersichtlicher hingeschrieben (zumindest habe ich es versucht) und bin damit dann zu obigen Ergebnissen gekommen.

    if(a<b) {
        if(c<d) {
           stat=1;
        }
        else {
            if(a<c) {
              if(b<d) {
                 stat=2;
              }
              else {
              stat=3;
            }
            }
            else {
                if(a<d) {
                      if(b<c) {
                          stat=4;
                      }
                      else {
                          stat=5;
                      }
                }
                else {
                     stat=6;
                }
    }
    else {
        stat=7;
    }
    

    Vielleicht hat ja jemand Lust mir zu sagen, ob meine Ergebnisse korrekt sind [wenn nicht, habe ich dafür auch Verständnis, denn das ist ja wirklich eine Zumutung!].

    Beste Grüße

    LinuxC_newbie

    😋



  • Programmierst du in C oder C++?

    Na ja, machs dir nicht so schwer:

    #include <iostream>
    
    int GetStat(int a, int b, int c, int d)
    {
    	int stat = 0;
    
    	if(a<b) {if(c<d)                   {stat=1;}
         else {if(a<c) {if(b<d)        {stat=2;}
                                 else  {stat=3;}
       }  else {if(a<d) {if(b<c)       {stat=4;}
                                 else  {stat=5;}
                          }      else  {stat=6;}
              } } }              else  {stat=7;}
    
    		  return stat;
    }
    
    int main()
    {
    	std::cout << GetStat(0, 1, 1, 0) << std::endl;
    	std::cout << GetStat(1, 0, 0, 1) << std::endl;
    	std::cout << GetStat(0, 1, 0, 1) << std::endl;
    	std::cout << GetStat(1, 0, 1, 0) << std::endl;
    }
    

    Ausgabe:

    3
    7
    1
    7
    Drücken Sie eine beliebige Taste . . .

    Deine Ergebnisse sehen gut aus. 👍



  • Schreibe doch einfach ein Programm!


  • Mod

    LinuxC_newbie schrieb:

    Vielleicht hat ja jemand Lust mir zu sagen, ob meine Ergebnisse korrekt sind

    Das klingt doch nach einem idealen Anwendungsfall für eine programmierbare Rechenmaschine. Damit könnte man sich wiederholende Aufgaben automatisiert durchführen. Schade, dass es so etwas noch nicht gibt 😞 .

    P.S.: Können denn a,b,c und d nur 0 oder 1 sein? So wie das geschrieben ist, würde ich erwarten, dass es sich um beliebige Zahlen handeln kann. Somit erhöht sich die Zahl der Fälle gewaltig:

    a=b=c=d
    a=b=c<d
    a=b<c=d
    ...und viele andere mehr...
    


  • Puh, ich freu mich, dass meine Ergebnisse stimmen und ich mich nicht umsonst da durchgeackert habe.

    Du hast einfach eine Funktion daraus gemacht, oder? Sehr klug!
    Wir hatten das Thema "Funktionen" noch nicht; aber ich bin immerhin schon in der Lage zu erkennen, dass Du eine Funktion benutzt hast. 😃

    Ich weiß ehrlich gesagt nicht genau, wo da der Unterschied ist.
    Ich glaube aber, dass wir in dem Kurs zwar C++ benutzen, aber wohl nur das, was Schnittmenge mit C ist, was immer genau das ist...

    Edit:

    Ich weiß nicht, ob die nur die Werte 0 und 1 annehmen können, ich denke aber wohl schon, man soll ja auch nur die Ergebnisse für die vorgegebenen Werte bestimmen.



  • knivil schrieb:

    Schreibe doch einfach ein Programm!

    Ähm, ja. Das hätte ich zur Überprüfung meiner Ergebnisse in der Tat machen können. Einfach eines, das die Ergebnisse ausgibt...

    Sorry, dann hätte ich Euch gar nicht damit behelligen müssen.



  • Manchmal sieht man den Wald vor lauter Bäumen nicht. Außerdem war es mal eine ganz nette Übung. Wie du das jetzt eleganter lösen kannst, hast du ja nun gelernt. Also alles gut. 🙂


  • Mod

    LinuxC_newbie schrieb:

    Ich glaube aber, dass wir in dem Kurs zwar C++ benutzen, aber wohl nur das, was Schnittmenge mit C ist, was immer genau das ist...

    Die Schnittmenge wäre eine Art kastriertes C. Oder mindestens schlechtes C. Solche Kurse gibt es leider zuhauf. Am Ende hast du dann weder C noch C++ richtig gelernt. 😞

    Falls du die Wahl hast, wäre ein gutes Buch wohl besser. Für C++ siehe meine Signatur, für C siehe Empfehlungen im C-Forum.



  • Es lohnt sich nicht nur den Code übersichtlich zu schreiben, sondern ihn auch zu kommentieren:

    if(a<b) { // a < b
            if(c<d) { // a < b AND c < d
                stat=1;
            } else { // a < b AND d <= c
                if(a<c) { // a < b AND d <= c AND a < c
                    if(b<d) {
                        stat=2;
                    } else {
                        stat=3;
                    }
                } else { // d <= c <= a < b
                    if(a<d) { // kann nie erfüllt sein, da d <= a!
                        if(b<c) {
                            stat=4;
                        } else {
                            stat=5;
                        }
                    } else {
                        stat=6;
                    }
                } 
            } 
        } else {
            stat=7;
        }
    

    dann sieht man sofort, dass die Bedingung a<d in Zeile 12 nie erfüllt sein kann, da sie durch die vorher erfüllten Bedingungen bereits ausgeschlossen wurde. Damit vereinfacht sich das ganze zu:

    if(a<b) { // a < b
            if(c<d) { // a < b AND c < d
                stat=1;
            } else { // a < b AND d <= c
                if(a<c) { // a < b AND d <= c AND a < c
                    if(b<d) {
                        stat=2;
                    } else {
                        stat=3;
                    }
                } else { // d <= c <= a < b
                    stat=6;
                } 
            } 
        } else {
            stat=7;
        }
    

    Gruß
    Werner


Log in to reply