Wer macht mir aus 2if Bedingungen eine?



  • Ich bekomms nicht hin, hier der Code:

    if(Read.substr(55,3) == "bla" && Read.substr(100,5) == "blubb")
    				if(
    			   a == false ||
    			   b == false ||
    		       c      == false ||
    		       d      == false  )
    

    Was nicht geht ist die die if Bedingungen einfach mit && zu Verknüpfen 😕



  • Klammern setzen hilft!

    btw. kannst du a==false auch einfach so schreiben !a bzw. a==true als a



  • if(A) // A
        if(B) // UND B
            Anweisung
    
    if( (A) && (B) ) // A UND B (Klammerung nicht vergessen!)
    

    MfG SideWinder



  • Ich machs immer ausführlich und bin letzter :p

    MfG SideWinder



  • Du musst die Bedingungen in eine if- Anweisung schreiben und darauf achten, dass die Prioritäten noch stimmen.

    if( a==1 && b==2 && (c==3 || d==4)  )
    {
      //bedingung wird ausgeführt
    }
    


  • dafür hab ich noch auf das a==false hingewiesen :p 🙂



  • klappt wunderbar, danke



  • Ausknopf schrieb:

    if(Read.substr(55,3) == "bla" && Read.substr(100,5) == "blubb")
          if(a == false || b == false || c == false || d == false  )
    

    jo, ich mach mal kingruedis verkürzung.

    if(Read.substr(55,3) == "bla" && Read.substr(100,5) == "blubb")
          if(!a || !b || !c || !d)
    

    und sidewinders umwandlung

    if(Read.substr(55,3)== "bla" && Read.substr(100,5)=="blubb" && (!a || !b || !c || !d))
    

    und de Morgans trick

    if(Read.substr(55,3)== "bla" && Read.substr(100,5)=="blubb" && !(a && b && c && d))
    

    und stelle fest, daß man sich hier drehen und wenden kann, wie man will, die erste version ar viel besser, als wenn man alles in ein großes if zusammenfasst.

    normalerweisesind solche sachen innerhalb von schleifen und man kann die verschachtelungstiefe mit continue gering halten.

    while(nächsteZeilelesen()){
       if(Read.substr(55,3) == "bla" && Read.substr(100,5) == "blubb"){
          if(a == false || b == false || c == false || d == false  ){
             tuwas_kompliziertes();
             for(...){
                hier_geht_die_post_ab();
             }
           }
        }
    }
    

    mit continue kann man oft wunder wirken.

    while(nächsteZeilelesen()){
       if(Read.substr(55,3) != "bla") continue; //jo, wenn da was falsches steht, mag ich's nicht verarbeiten
       if(Read.substr(100,5) != "blubb") continue; //dito
       if(!a || !b  !c || !d) continue;
       //so, alle vortests abgeschlossen, also kann die arbeit beginnen
       tuwas_kompliziertes();
       for(...){
          hier_geht_die_post_ab();
       }
    }
    

    (ausführlicher und letzterer)



  • volkard schrieb:

    mit continue kann man oft wunder wirken.

    while(nächsteZeilelesen()){
       if(Read.substr(55,3) != "bla") continue; //jo, wenn da was falsches steht, mag ich's nicht verarbeiten
       if(Read.substr(100,5) != "blubb") continue; //dito
       if(!a || !b  !c || !d) continue;
       //so, alle vortests abgeschlossen, also kann die arbeit beginnen
       tuwas_kompliziertes();
       for(...){
          hier_geht_die_post_ab();
       }
    }
    

    (ausführlicher und letzterer)

    Soweit so gut.
    Jetzt würde ich noch ein paar Funktionen einbauen um den Code selbstdokumentierend zu machen.
    Das ist gerade für Bedingungen wie (!a || !b !c || !d) sinnvoll. Eine Funktion mit sprechendem Namen kann dieser doch eher semantik-freien Bedingung eine Bedeutung zuordnen.

    while(nächsteZeilelesen()){
       if(Read.substr(55,3) != "bla") continue; //jo, wenn da was falsches steht, mag ich's nicht verarbeiten
       if(Read.substr(100,5) != "blubb") continue; //dito
       if(somethingWrongThusFar()) continue; // generischer Name, da ich die Bedeutung von a,b,c und d nicht kenne
    
       //so, alle vortests abgeschlossen, also kann die arbeit beginnen
       tuwas_kompliziertes();
       for(...){
          hier_geht_die_post_ab();
       }
    }
    

    Auch das substr ist meiner Meinung nach zu technisch um selbstdokumentierend zu sein:

    while(nächsteZeilelesen()){
       if(!lineIsABlaBlubString()) continue; 
       if(somethingWrongThusFar()) continue; 
       //so, alle vortests abgeschlossen, also kann die arbeit beginnen
       tuwas_kompliziertes();
       for(...){
          hier_geht_die_post_ab();
       }
    }
    

    Falls die ganze Prüferei eine zusammenhängende High-Level-Bedeutung hat, kann das alles natürlich auch in eine Funktion:

    while(nächsteZeilelesen()){
       if(lineIsWhatImLockingFor()) // natürlich auch schwachsinniger Name
       {
           tuwas_kompliziertes();
           for(...){
               hier_geht_die_post_ab();
       }
    }
    

    Naja, mir ist klar, dass Volkard nicht darauf hinaus wollte (sonst hätte er es selbst erklärt), ist vielleicht trotzdem einen Hinweis wert 🙄



  • HumeSikkins schrieb:

    while(nächsteZeilelesen()){
       if(lineIsWhatImLockingFor()) // natürlich auch schwachsinniger Name
       {
           tuwas_kompliziertes();
           for(...){
               hier_geht_die_post_ab();
       }
    }
    

    und selbst das kann man noch verbessern:

    while(nächsteZeilelesen()){
       if(!lineIsWhatImLockingFor())continue; //nicht das gesuchte? arbeitsverweigerung!
       tuwas_kompliziertes();
       for(...){
           hier_geht_die_post_ab();
       }
    }
    


  • Hallo,
    das würde ich persönlich nicht unbedingt als Verbesserung bezeichnen, da ich es bevorzuge, wenn der normalen Programmablauf im Vordergrund steht. Den Fehlerfall stelle ich dann hinten an.
    Nur wenn ich z.B. explizit Vorbedingungen testen und dokumentieren will, drehe ich diese Reihenfolge um.
    Am Beispiel:

    void process()
    {
        ifstream source(...);
        if (source.is_open())
        {
            ofstream dest(...);
            if (dest.is_open())
            {
                 // hier kommt der Code hin, der den normalen Fall implementiert
            }
            else
            {
                // error dest
            }
        }
        else
        {
            // error source
        }
    }
    

    Statt:

    void process()
    {
        ifstream source(...);
        if (!source.is_open())
        {
            // error source
            return;
        }
        ofstream dest(...);
        if (!dest.is_open())
        {
            // error dest
            return;
        }
        // hier kommt der Code hin, der den normalen Fall implementiert
    }
    

    Das Beispiel ist wie immer schlecht gewählt, die Aussage wird hoffentlich trotzdem klar.



  • ich kann mir nich helfen, aber das 2. finde ich persönlich schöner...


Anmelden zum Antworten