zu viele == in if-bedingung??? --KEIN spaßpost! [gelöst]



  • solala schrieb:

    warum sollte das gehen?

    weil das programm bei folgendem schnipsel test ausgibt:

    #include <windows.h> 
    #include <iostream>
    #include<conio.h>
    
    using namespace std; 
    int main() 
    {
    	int a=3;
    	int b=4;
    	int c=5;
    	if(a!=b!=c)
    	{
    		cout<<"test\n";
    	}
    	getch();
    }
    

    jetzt will ich nur wisse ob er das auch wieder falsch interpretiert und durch zufall dest ausgibt zB weil der erste teil stimmt oder ob er das richtig interpretiert.ich müsste das deshalb wissen weil bei den bedingungen im echten code viel != stehen und der pc das nicht falsch interpretieren darf.

    mfg,
    andi01.



  • cout << (3 != 3 != 3);
    

    true.



  • 😕 ich verstehe zwar nicht so ganz warum, aber der kompiler scheint es schonmal falsch zu interpretieren, danke. 😕

    jetzt weiß ich wenigstens dass es so ist. aber mal rein interessehalber: warum? wie interpretiert es der complier denn dann?

    mfg,
    andi01.



  • (3 != 3 != 3)
    =>
    ((3 != 3) != 3)
    (false != 3)
    (true)
    Es ist immer das selbe System.



  • probiere das doch mal mit 4 variablen, dann siehst du warum.
    benutze die logischen operatoren um solche effekte zu vermeiden.



  • ok, danke, hab ich verstanden.

    danke für die ganzen antworten,
    andi01.



  • andi01 schrieb:

    😕 ich verstehe zwar nicht so ganz warum, aber der kompiler scheint es schonmal falsch zu interpretieren, danke. 😕

    jetzt weiß ich wenigstens dass es so ist. aber mal rein interessehalber: warum? wie interpretiert es der complier denn dann?

    mfg,
    andi01.

    Na, das hat doch unskilled prima erklärt: Nacheinander. Wobei nach jeder Evaluation das Ergebnis für die nächste verwendet wird.

    Stell's dir wie Funktionsaufrufe vor (du weißt doch: Operatoren kann man überladen) Dann ist:

    if(a == b == c)
    

    dasselbe wie:

    if(operator==(operator==(a, b), c))
    

    Wobei operator==() natürlich bool liefert, das in diesem Ausdruck zu int konvertiert wird.

    Macht's das jetzt irgendwie klarer?

    Stefan.



  • Hallo andi,

    na dann viel Spaß beim Tippen, wenn du wirklich auf diese Weise alle 4er-Kombinationen abfragen willst 😮

    Wie in deinem anderen Beitrag schon vorgeschlagen wurde, benutze Arrays und prüfe mittels Schleifen deine Bedingungen: sind dann weniger als 10 Zeilen!!!



  • @DStefan:
    ja, hat er. ich habe es auh dank ihm verstanden.mich hatte nur interessiert ob das bei != dasselbe ist, jetzt weiß ichs ja
    @Th69:
    natürlich löse ich das mit Schleifen 🙂 , aber trotzdem werde ich um den einen oder anderen vergleich mit den nachbarstellen nicht drumherumkommen 😃 .

    @all:
    wer sich für die fertige lösung interessiert(alles außer die funktion gegen den pc zu spielen ist jezt fertig):

    .cpp: http://rapidshare.com/files/272969298/Vier_Gewinnt.cpp.html
    .exe: http://rapidshare.com/files/272969549/Vier_Gewinnt.exe.html

    danke für die ganzen antworten 🙂 ,
    andi01.



  • so hab sie jetzt soweit fertig gekürzt auf 351 Zeilen:

    .cpp: http://rapidshare.com/files/272988186/VierGewinnt.cpp.html
    .exe: http://rapidshare.com/files/272988290/VierGewinnt.exe.html

    mfg,
    andi01.



  • Und wenn du jetzt noch die if-Orgien in Schleifen umwandelst, dann könnte es langsam was werden...

    P.S: Du darfst auch Funktionen mit Parametern erstellen - dann brächtest du nicht doppelten Code in spielerzug() und spielerzug2() -)



  • so hab jetzt auch noch das mi den parametern eingefügt, bloß die if-anweisungen sin meiner meinung nach eigentlich nicht mehr zu kürzen.

    edit: hat sich erledigt, alle fehler gefunden! zetzt noch 316zeilen!

    hier nochmal die aktuellesten dateien:

    .cpp: http://rapidshare.com/files/273016960/VierGewinnt.cpp.html
    .exe: http://rapidshare.com/files/273019320/VierGewinnt.exe.html

    nur wie soll ich die if-bedingungen noch stärker kürzen???

    mfg,
    andi01.


  • Mod

    if(position[5][a]==' ')
    ...
    		else
    		{
    		if(position[5][a]!=' '&&position[4][a]==' ')
    ...		else
    		{
    		if((position[5][a]!=' ')&&(position[4][a]!=' ')&&(position[3][a]==' '))
    

    Die Bedingungen werden unnötig komplex. In der 2. if-Anweisung wissen wir von vornherein, dass die Bedingung position[5][a]!=' ' immer erfüllt ist, andernfalls würde diese Anweisung nicht ausgeführt werden. Damit reduziert sich das Ganze zu

    if(position[5][a]==' ')
    			position[5][a]=farbe;
    		else if(position[4][a]==' ')
    			position[4][a]=farbe;
    		else if(position[3][a]==' ')
    			position[3][a]=farbe;
    		else if(position[2][a]==' ')
    			position[2][a]=farbe;
    		else if(position[1][a]==' ')
    			position[1][a]=farbe;
    		else if(position[a][a]==' ')
    			position[a][a]=farbe;
    

    Scheint so, als ob die letzte Bedingung fehlerhaft ist (sollte sicher Position[0][a]) und das springt hier direkt ins Auge. Abgesehen davon ist die Struktur so regeläßig, dass die Vereinfachung mittels Schleife offensichtlich sein sollte. Noch besser wäre möglicherweise die Nutzung eines zusätzlichen Feldes, dass sich den Füllstand jeder Spalte merkt. Auf die Weise müssten wir gar nicht mehr suchen, wo der nächste Stein landen würde.



  • was die letzte bedingung betrifft: jo, habe ich bereits ausgebessert. ich ändere das mit dem if noch schnell und uploade dann nochmal den code.

    mfg,
    andi01.



  • so leiderhab ich jetzt einen fehler gefunden: bei der eingabereihe wenn man den stein in position 5 3 einwirft gehts nich, aber das kriege ich sicher noch hin(vor dem umschreiben der if-bedingungen war der aber auch schon).

    hier der komplette Code:

    .cpp: http://rapidshare.com/files/273036003/VierGewinnt.cpp.html
    .exe: http://rapidshare.com/files/273039252/VierGewinnt.exe.html

    und hier der verbesserte ausschnitt:

    if(reihe==a)
    	{
    		if(position[5][a]==' ')
    		{
    			position[5][a]=farbe;
    		}
    		else if(position[4][a]==' ')
    		{
    			position[4][a]=farbe;
    		}
    		else if(position[3][a]==' ')
    		{
    			position[3][a]=farbe;
    		}
    		else if(position[2][a]==' ')
    		{
    			position[2][a]=farbe;
    		}
    		else if(position[1][a]==' ')
    		{
    			position[1][a]=farbe;
    		}
    		else if(position[0][a]==' ')
    		{
    			position[0][a]=farbe;
    		}
    	}
    	}
    

    ich hoffe ich finde diesen letzten fehler auch noch.

    mfg,
    andi01.



  • Und hier als Schleife:

    int i=5
    while(i >= 0 && position[i][a] != ' ')
      i--;
    
    // oder alternativ: int i; for(i=5; i >= 0 && position[i][a] != ' '; i--);
    
    position[i][a] = farbe;
    


  • edit: habe den Fehler jetzt gefunden! der Code funktioniert perfekt!

    danke für die ganzen Antworten 🙂 ,
    andi01.


Anmelden zum Antworten