Bedingung aufstellen



  • while(a!=4||b!=1)



  • Logik0r schrieb:

    while(a!=4||b!=1)

    eben nicht.

    while (a!=4 && b!=1)
    

    oder auch

    while (a==4 || b==1)
    


  • l'abra d'or schrieb:

    Logik0r schrieb:

    while(a!=4||b!=1)

    eben nicht.

    while (a==4 || b==1)
    

    Das kann glaube ich nicht stimmen, denn in diesem Fall wird die Schleife wiederholt. In diesem Fall soll die Schleife nicht wiederholt sondern verlassen werden.

    while(a!=4||b!=1)

    Hast du vielleicht einen Tip für mich wie du auf diese Lösung gekommen bist.



  • l'abra d'or schrieb:

    while (a!=4 && b!=1)
    

    nur das ist richtig.



  • adasda schrieb:

    l'abra d'or schrieb:

    while (a!=4 && b!=1)
    

    nur das ist richtig.

    Ich hab dummerweise ein ! vergessen...
    Das geht nämlich auch, und wäre der erste Schritt gewesen, den du machen hättest können:
    a==4 || b==1
    ist deine Abbruchbedingung. Das Gegenteil ist somit die Bedingung für deine Schleife:

    do {
    } while( !(a==4 || b==1) )
    

    Und diese Negierung auflösen tust du, in dem alles umgedreht wird:
    == -> !=
    || -> &&
    ->

    while( a!=4 && b!=1 )
    


  • Diener schrieb:

    Es soll rausspringen wenn a==4 oder b==1 bzw in beiden Fällen.

    do{
              //
            }while((a!=4) && (b!=1))
    

    kannste es dir aber auch ganz einfach machen:

    for (;;)
    {
      //
      // ... anderer code
      // 
      if (a == 4 || b == 1) 
        break;
    }
    

    ^^ deine frage wörtlich in C umgewandelt. *fg*
    🙂



  • Diener schrieb:

    Hast du vielleicht einen Tip für mich wie du auf diese Lösung gekommen bist.

    Manchmal, wenn ich mich bei solchen Sachen sehr verwirrt hab, denk ich an die Sätze von De Morgan:
    http://de.wikipedia.org/wiki/De_Morgansche_Gesetze

    Besser ist aber (wie immer), sich nicht verwirren zu lassen.

    kannste es dir aber auch ganz einfach machen:

    for (;;)
    {
      //
      // ... anderer code
      //
      if (a == 4 || b == 1)
        break;
    }
    

    ^^ deine frage wörtlich in C umgewandelt. *fg*

    Ich finde das gar nicht so frech. Wenn man sich's so denkt, soll man's auch so sagen dürfen, alles andere ist doch Blödsinn.
    Aber Endlosschleifen sind eben böse, Punkt.
    🙂



  • µngbd schrieb:

    Aber Endlosschleifen sind eben böse, Punkt.

    das macht doch keinen unterschied. do{...}while(x) wird auch zur endlosschleife, wenn die bedingung im 'while' nie false wird.
    🙂



  • Gehen tut das mit dem for( ; ; ) ebenso wie ein while(true) schon.
    Aber für was bitte gibt es denn eine Abbruchbedingung? Die ist schön übersichtlich am Anfang/Ende der Schleife platziert. wenn der Code in der Schleife recht umfangreich wird, darf man ewig suchen, bis man alle break/continue/... zusammen hat, um die Logik hinter dem Code zu verstehen.
    Man löst ein Problem ja nicht nur, dass es gelöst ist, sondern dass man auch später wieder weiß wie sie funktioniert 😉



  • ;fricky schrieb:

    µngbd schrieb:

    Aber Endlosschleifen sind eben böse, Punkt.

    das macht doch keinen unterschied. do{...}while(x) wird auch zur endlosschleife, wenn die bedingung im 'while' nie false wird.
    🙂

    Sehe ich genauso. Ich hab früher, als ich noch solche Stilgesetze geglaubt hab, immer wieder mal die Bedingungen von Schleifen solange umgeschrieben, bis ich kein break/continue/goto mehr brauchte. Am Ende war dann die Bedingung zwei Zeilen lang, und so kunstvoll geklammert, dass man ohne Kopfschmerzen nicht mehr durchsteigen konnte.

    Andererseits ist l'abra d'or anderer Meinung:

    l'abra d'or schrieb:

    Die ist schön übersichtlich am Anfang/Ende der Schleife platziert. wenn der Code in der Schleife recht umfangreich wird, darf man ewig suchen, bis man alle break/continue/... zusammen hat, um die Logik hinter dem Code zu verstehen.

    Klar, das kann passieren. Ich glaub trotzdem nicht daran, dass man deshalb allgemeine Stilgesetze entwerfen sollte. Manchmal ist es so klarer, manchmal anders. Ich nenne das die Freiheit der Rede.
    🙂



  • l'abra d'or schrieb:

    Aber für was bitte gibt es denn eine Abbruchbedingung? Die ist schön übersichtlich am Anfang/Ende der Schleife platziert. wenn der Code in der Schleife recht umfangreich wird, darf man ewig suchen, bis man alle break/continue/... zusammen hat, um die Logik hinter dem Code zu verstehen.

    ich finde es unübersichtlicher, wenn man extra was negieren muss, nur damits zu irgendwelchen vorgegebenen schleifenkonstrukten passt. manche basteln sich sogar noch 'ne eigene abbruchvariable zurecht, damit es passt (<--*scheusslich*). ich finds am besten, wenn man's ganz straight programmiert, so wie man denkt, dann kannste auch auf kommentare verzichten. aber ist wohl geschmackssache.
    btw, zudem sind breaks innerhalb von for(;;)-schleifen flexibler, kannst z.b. sowas machen:

    for(;;)
    {
       ... anderer code
    
       a = calculate_a();
       if (a==4);
         break;    // berechnung von b nicht mehr nötig
    
       ... noch mehr code
    
       b = calculate_b();
       if (b==1)  // jetzt reichts aber wirklich
         break;
    
       ... und noch was
    }
    

    ^^ springt auch raus, wenn b==4 oder a==1 oder beides.

    µngbd schrieb:

    Ich hab früher, als ich noch solche Stilgesetze geglaubt hab, immer wieder mal die Bedingungen von Schleifen solange umgeschrieben, bis ich kein break/continue/goto mehr brauchte.

    dann haste damals switch/case wohl auch verabscheut *fg*
    🙂



  • Whatever, jedem das Seine.
    Nochmal für den OP.

    do
    {
        ...
    }while(a != 4 || b != 1);
    

    Damit das Verständnis erhalten bleibt, kann man statt "||" auch "or" verwenden.

    do
    {
        ...
    }while(a != 4 or b != 1);
    

    Führe die Schleife solange aus, bis a 4 ODER b 1 entspricht.



  • FreakY<3Cpp schrieb:

    Damit das Verständnis erhalten bleibt, kann man statt "||" auch "or" verwenden.

    do
    {
        ...
    }while(a != 4 or b != 1);
    

    Führe die Schleife solange aus, bis a 4 ODER b 1 entspricht.

    Die Schleife soll abgebrochen werden, falls a==4 oder b==1, oder beides eintritt.
    while(a!=4 || b!=1) bricht aber eben nur ab, wenn a==4 UND b==1!
    Mannmannmann 😃



  • FreakY<3Cpp schrieb:

    Damit das Verständnis erhalten bleibt, kann man statt "||" auch "or" verwenden.

    ^^dafür musste aber <iso646.h> includen. or, and, not, usw. sind keine schlüsselwörter sondern #defines
    🙂



  • ;fricky schrieb:

    manche basteln sich sogar noch 'ne eigene abbruchvariable zurecht, damit es passt (<--*scheusslich*)

    Das sind sicher C++ler, die glauben, dass jeder Compiler Gedanken lesen kann.

    ;fricky schrieb:

    dann haste damals switch/case wohl auch verabscheut *fg*
    🙂

    Stimmt, ganz am Anfang hab ich nicht verstanden, wozu das gut sein soll. Irgendwann bin ich dann dahintergekommen, und damals hab ich wohl begonnen, mir meine eigene Meinung zurechtzulegen. Bin immer noch nicht damit fertig. 🙂

    Schon die Propheten waren in dem Punkt nicht ganz eindeutig:

    K&R (frei zitiert) schrieb:

    C hat goto, kann beliebig missbraucht werden. Wir bringen trotzdem einige Anwendungsbeispiele:
    [...]

    Jedenfalls bin ich einverstanden mit:

    l'abra d'or schrieb:

    Man löst ein Problem ja nicht nur, dass es gelöst ist, sondern dass man auch später wieder weiß wie sie funktioniert 😉

    ;fricky schrieb:

    ich finds am besten, wenn man's ganz straight programmiert, so wie man denkt, dann kannste auch auf kommentare verzichten.

    Da ist sicher was dran.
    🙂



  • ;fricky schrieb:

    kannste es dir aber auch ganz einfach machen:

    for (;;)
    {
      //
      // ... anderer code
      // 
      if (a == 4 || b == 1) 
        break;
    }
    

    ^^ deine frage wörtlich in C umgewandelt. *fg*
    🙂

    Kein Wunder das in diesem Forum jeder C verabscheut wenn du solchen Code postest. Das ist übelster Anfänger-Code und wenn ich das sehe muss ich sehr an deinen Fähigkeiten zweifeln.



  • player4245 schrieb:

    Kein Wunder das in diesem Forum jeder C verabscheut wenn du solchen Code postest.

    Jeder...?
    http://www.cliquenabend.de/spiele/asterix/asterix1.jpg
    🙂



  • Einigen wir uns auf: die meisten



  • player4245 schrieb:

    Einigen wir uns auf: die meisten

    Hast du eine Statistik?
    🙂



  • nicht unbedingt aber erfahrung


Anmelden zum Antworten