aufhänger bei do/while-schleife



  • aha, und wie könnte man das problem umgehen?
    denn ich dachte immer dass die bedingung in die klammer nach dem while kommt, oder irr ich mich da?
    hier das programm:

    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    using namespace std;

    int main(int argc, char *argv[])
    {
    srand( (unsigned)time(NULL) );
    int feld1[3][2]=
    {{1,1},
    {1,1},
    {1,1}};
    int feld2[3][2]=
    {{0,0},
    {0,0},
    {0,0}};

    int x; int y;

    for (x=0; x<3; x=x+1)
    {for (y=0; y<2; y=y+1)
    {printf ("%d ", feld1[x][y]);}
    printf ("\n");}
    printf("\n");

    for (x=0; x<3; x=x+1)
    {for (y=0; y<2; y=y+1)
    {printf ("%d ", feld2[x][y]);}
    printf ("\n");}
    printf("\n");

    int c; int d;

    int a = (rand()%3);
    int b = (rand()%2);
    feld1[a][b]=0;
    feld2[a][b]=1;

    do{int c = rand()%3;
    int d = rand()%2;} while (feld1[c][d]=0);
    feld1[c][d]=0;
    feld2[c][d]=1;

    for (x=0; x<3; x=x+1)
    {for (y=0; y<2; y=y+1)
    {printf ("%d ", feld1[x][y]);}
    printf ("\n");}
    printf("\n");

    for (x=0; x<3; x=x+1)
    {for (y=0; y<2; y=y+1)
    {printf ("%d ", feld2[x][y]);}
    printf ("\n");}
    printf("\n");

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    ich habe es auch so versucht:

    int w=1;

    while(w=1)
    {int c = rand()%3;
    int d = rand()%2;
    if (feld1[c][d]=1)
    {w=0;}
    else
    {w=1;}}
    feld1[c][d]=0;
    feld2[c][d]=1;

    kann das jemand verbessern oder mir eine andere lösung zeigen?



  • shapeless schrieb:

    while (feld[c][d]=0);
    

    ist eine endlosschleife, denn es ist eine zuweisung und kein vergleich.

    Trotzdem keine Endlosschleife, da der Ausdruck nicht wahr ist.

    @ dom90: Benutzt die [cpp]-Tags. So will niemand deinen Code lesen.



  • Tim schrieb:

    shapeless schrieb:

    while (feld[c][d]=0);
    

    ist eine endlosschleife, denn es ist eine zuweisung und kein vergleich.

    Trotzdem keine Endlosschleife, da der Ausdruck nicht wahr ist.

    @ dom90: Benutzt die [cpp]-Tags. So will niemand deinen Code lesen.

    Bin ich nun total fern jeder c++ Zeit die ich mal hatte, oder ist eine
    Zuweisung nicht definitiv wahr ?

    Warum sollte denn der Ausdruck nicht wahr sein ?
    ( wenn auch dieshier 2 endlosschleifen verursacht ):

    [cpp]#include <iostream>

    int main(){

    int a=0;
    while(a=2){
    std::cout<<"smth\n";
    break; // weil endlos
    }

    int foo [10][10];
    while(foo[0][0]=1){
    std::cout<<"smth else \n";
    }
    return true;

    }[/cpp]

    Oder war deine Aussage schon auf sein Beispiel bezogen ( welches ich noch
    nicht ganz gelesen hab ( eben wegen der fehlenden tags )

    PS: meine cpp tags gehen irgendwie nicht.



  • shapeless schrieb:

    Bin ich nun total fern jeder c++ Zeit die ich mal hatte, oder ist eine
    Zuweisung nicht definitiv wahr ?

    Nein, eine zuweisung hat den selben warheitswert wie der zugewiesene wert.
    /edit: Hm. Oder wie die lvalue nach der zuweisung? Bei dem Array ist das ein unterschied.



  • while (a=1) // immer true
    while (a=0) // immer false
    

    Es zählt letzlich der Rückgabewert der Zuweisung und die ist im ersten Fall true (=> 1) und im zweiten Fall false (=> 0).



  • Oha stimmt. so wars.
    wie gesagt zu lange her.
    dann hätt ich wenigstens mal mit 0 und nicht mit 2 testen sollen.
    however danke für die Erinnerungshilfe! ( an euch 2 ( bzw 3 ) )

    Dann zum OP:
    Es ist zwar keine Endlosschleife, aber dennoch ist der Vergleich in
    der Bedingung der Whileschleife falsch. ( semantisch nicht syntaktisch ).
    Ich gehe davon aus, dass du == und nicht = meinst, oder ?



  • vergleiche mit ==



  • Aja ist ja alles schön und gut,
    aber mein problem ist auch dass ich erst vor 3 tagen mit c angefangen habe.
    Ich habe jetzt in der bedingungung dass = mit dem == ausgetauscht, was allerdings nichts zu nützen scheint.

    Kann es vielleicht sein, dass es daran liegt dass, wenn die schleife wider durchlaufen wird trotzdem keine neuen random -zahlen ausgewürfelt werden und er deswegen immer wider das selbe feld prüft?

    Ich bin sehr dankbar wenn mir einer einfach klare anweisungen gibt, weil mein c-wissen noch sehr beschränkt ist.



  • poste mal deinen code schön formatiert



  • Hier etz mal das ganze progrämmchen in schöner form:

    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
         srand( (unsigned)time(NULL) );
       int feld1[3][2]=
       {{1,1},
       {1,1},
       {1,1}};
       int feld2[3][2]=
        {{0,0},
       {0,0},
       {0,0}};
       int c; int d;
       int a = (rand()%3);
       int b = (rand()%2);
       feld1[a][b]=0;
       feld2[a][b]=1;
    
        do
       {int c = rand()%3; 
           int d = rand()%2;} while (feld1[c][d]==0);
           feld1[c][d]=0;
           feld2[c][d]=1;
    system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Das Problem ist doch eher trivial, oder?( trotzdem zu hoch für mich)
    Kann mir irgendjemand den fehler zeigen?


Anmelden zum Antworten