Bedingung anders formulieren



  • volkard schrieb:

    if ( a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i && a!=j && b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i && b!=j && c!=d && c!=e && c!=f && c!=g && c!=h && c!=i && c!=j && d!=e && d!=f && d!=g && d!=h && d!=i && d!=j && e!=f && e!=g && e!=h && e!=i && e!=j && f!=g && f!=h && f!=i && f!=j && g!=h && g!=i && g!=j && h!=i && h!=j && i!=j )
    

    Ist ja wohl voll "ugly kid joe" - geht's noch gräßlicher?



  • pointercrash() schrieb:

    Ist ja wohl voll "ugly kid joe" - geht's noch gräßlicher?

    als array und durcheinander vielleicht.

    z[1]!=z[5] && z[0]!=z[2] && z[1]!=z[2] && z[8]!=z[9] && z[0]!=z[1] && z[3]!=z[7] && z[5]!=z[7] && z[4]!=z[6] && z[3]!=z[9] && z[1]!=z[8] && z[2]!=z[4] && z[3]!=z[8] && z[4]!=z[7] && z[6]!=z[8] && z[2]!=z[9] && z[4]!=z[8] && z[3]!=z[6] && z[6]!=z[9] && z[2]!=z[6] && z[2]!=z[3] && z[0]!=z[9] && z[2]!=z[5] && z[2]!=z[8] && z[4]!=z[9] && z[4]!=z[5] && z[0]!=z[8] && z[0]!=z[7] && z[1]!=z[4] && z[0]!=z[6] && z[0]!=z[5] && z[0]!=z[3] && z[2]!=z[7] && z[7]!=z[8] && z[5]!=z[6] && z[1]!=z[3] && z[6]!=z[7] && z[3]!=z[5] && z[0]!=z[4] && z[7]!=z[9] && z[1]!=z[9] && z[5]!=z[9] && z[5]!=z[8] && z[1]!=z[7] && z[1]!=z[6] && z[3]!=z[4]
    

    ist zwar nicht c, aber gemacht hab ich das mit

    int const max=10;
    	vector<string> v;
    	for(int i=0;i<max;++i){
    		for(int j=i+1;j<=max-1;++j){
    			strstream o;
    			o<<"z["<<i<<"]!=z["<<j<<"]"<<'\0';
    			v.push_back(o.str());
    		}
    	}
    	random_shuffle(v.begin(),v.end());
    	copy(v.begin(),v.end(),ostream_iterator<string>(cout," && "));
    


  • Ich habe eine 5-fach geschachtelte for-Schleife. Mein Ziel ist es jetzt nur wenn alle Zahlen unterschiedlich sind das es die Bedingung ausführt.

    for{
     for{
      for{
       for{
         if()
    }
    }
    }
    }
    

    Ich habe versucht mit fflush() den Puffer zu löschen-aber es ging nicht.
    Danke für das bsp.



  • pro schrieb:

    Gäbe es auch eine kürzere bzw. einfachere Möglichkeit.

    wenn du es schaffst, daß deine zahlen inm einem array stehen, und nicht a b c... heißen. haste gewonnen und alles geht.
    zum beispiel

    int doppel=0;
    {
      int anz[10]={0};
      int i;
      for(i=0;i<10;i++){
        if(anz[i]>0){
          doppel=1;
          break;
       }
       anz[i]++;
    }
    if(doppel)...
    


  • pro schrieb:

    Ich habe eine 5-fach geschachtelte for-Schleife. Mein Ziel ist es jetzt nur wenn alle Zahlen unterschiedlich sind das es die Bedingung ausführt.

    dann gehts ja. auch noch einfacher.

    for(int a=0;a<=9;a++){
    	for(int b=0;b<=9;b++){
    		if(b==a) continue;
    		for(int c=0;c<=9;c++){
    			if(c==a or c==b) continue;
    			for(int d=0;d<=9;d++){
    				if(d==a or d==b or d==c) continue;
    				for(int e=0;e<=9;e++){
    					if(e==a or e==b or e==c or e==d) continue;
    					printf(...);
    				}
    			}
    		}
    	}
    }
    


  • Super, Danke.

    Eine Sache habe ich noch. Wenn ich zb "1 2 m 3 4" eingebe, gibt es mir immer nach einem Buchstaben 0 aus. und bleibt in einer Endlosschleife hängen.

    Eingabe: 1 2 m 3 4
    Ausgabe: 1 2 0 0 0

    int a[5];
    
    do
    {
    printf();
    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    }while(a[]<1 || a[]>9 || usw.);
    


  • pro schrieb:

    Hallo

    ich habe die Bedingung a != b != c != d != e.

    Wie könnte ich das am einfachsten in eine if-Bedingung schreiben.

    MfG

    Etwa so:

    bool NotDouble (float  *aNumber,
                    int     iCount)
    {
          int    iLoop_0    = 0,
                 iLoop_1    = 0;
          bool   fNotDouble = true;
    
          while ((iLoop_0 < iCount) && (fNotDouble == true))
          {
                    iLoop_1 = iLoop_0 + 1;
                    while ((iLoop_1 < iCount) && (fNotDouble == true))
                    {
                            if (aNumber [iLoop_0] == aNumber [iLoop_1])
                                    fNotDouble = false;
                            else
                                    iLoop_1++;
                    }
                    iLoop_0++;
            }
    
            return fNotDouble;
    }
    

    Du musst dann nur Deine A, B ... in das Uebergabearray schreiben.



  • pro schrieb:

    Super, Danke.

    Eine Sache habe ich noch. Wenn ich zb "1 2 m 3 4" eingebe, gibt es mir immer nach einem Buchstaben 0 aus. und bleibt in einer Endlosschleife hängen.

    Eingabe: 1 2 m 3 4
    Ausgabe: 1 2 0 0 0

    int a[5];
    
    do
    {
    printf();
    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    }while(a[]<1 || a[]>9 || usw.);
    

    Du solltest scanf immer (es sei denn Du bist ganz (!) sicher) nach dem Rueckgabewert abfragen.

    if (scanf("%d %d %d %d %d", a[0], a[1], a[2], a[3], a[4]) != 5)
        printf ("Vertippt?\n")
    


  • @hartmut

    Ich prüfe ja scanf auf den Rückgabewert.

    int a[5];
    
    do
    {
    printf();
    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    }while(a[0]<1 || a[0]>9 || a[1] usw.);
    

    Hier prüfe ich ob der Wert zwischen 1 und 9 ist. Wenn ich eine größere Zahl eingebe funktioniert es auch. Das Problem ist wenn ich einen Buchstaben eingebe wie m wird das angeblich als 0 erkannt und die Arrays nach dem Buchstaben werden auch mit 0 befüllt.

    Da weiß ich nicht wo das Problem ist. Wieso wird einem Buchstaben eine 0 zugewiesen und die restlichen Arrays auch mit 0 befüllt. Und das nächste Problem ist dass es bei scanf nicht wieder stehen bleibt für eine Eingabe sondern es passiert eine Schleife ohne abbruch.



  • pro schrieb:

    @hartmut

    Ich prüfe ja scanf auf den Rückgabewert.

    Eben nicht:

    int scanf ( const char * format, ... );

    [...]

    On success, the function returns the number of items succesfully read. This count can match the expected number of readings or fewer, even zero, if a matching failure happens.

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/



  • Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    [cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');[cpp]



  • Um die Reihen der Moeglichkeiten zu vervollstaendigen bliebe noch der Weg ueber eine verkettete Liste und eine doppelte Rekursion (auch als Stack-Stress-Test):

    typedef struct NumberContainerSingle
    {
            int    iNo;
    
            NumberContainerSingle  *pNext = NULL;
    }
    
    bool IsDoubleSingle (NumberContainerSingle   *pCurrent, 
                         int                      iNo)
    {
            if (pCurrent->iNo == iNo)
                    return true;
    
            if (pCurrent->pNext != NULL)
                    return IsDoubleSingle (pCurrent->pNext, iNo);
            else
                    return false;
    }
    
    bool IsDouble (NumberContainerSingle   *pCurrent)
    {
            if (pCurrent == NULL)
                    return false;
    
            if (pCurrent->pNext != NULL)
            {
                    if (IsDoubleSingle (pCurrent->pNext, pCurrent->iNo) == false)
                            return IsDouble(pCurrent->pNext);
                    else
                            return true;
            }
            else
                    return false;
    }
    

    (Nur der Vollstaendigkeit halber) - Edit: Ist schon spaet ...



  • pro schrieb:

    Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');
    
    typedef struct NumberContainerSingle
    {
            int    iNo;
    
            NumberContainerSingle  *pNext = NULL;
    } 
    
    NumberContainerSingle *ReadNoIn (void)
    {
        char                   cChar    = 'X';
        bool                   fEnd     = false;
        NumberContainerSingle *pReturn  = NULL,
                              *pCurrent = NULL,
                              *pTemp;
    
    do
    {
        do
        {
            cChar = getc ();
            if (cChar == '/n')
                fEnd = true;
        }
        while ((cChar >= '0') && (cChar <= '9') && (fEnd == false))
    
        if (fEnd == false)
        {
            pTemp = malloc (sizeof (NumberContainerSingle));
            if (pTemp == NULL)
            {
                fprintf (stderr, "No Heap\n");
                abort ();
            }
            else if (pReturn == NULL)
                pReturn = pTemp;
            else
                pCurrent->pNext = pTemp;
    
            pCurrent = pTemp;
            pCurrent->iNo = cChar - '0';
        }
    }
    while (fEnd == false);
    
    return pReturn;
    }
    


  • Doppelt



  • pro schrieb:

    Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
    Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.

    [cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
    while ((c = getchar()) != '\n');[cpp]

    feherhafter code.
    %d und nicht &d, &a[n] und nicht a[n] 🙄



  • Danke für die Antworten.

    @hartmut

    Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.

    @problemerkenner
    Das waren nur Tippfehler.

    So sieht der Code aus. Ich habe wie schon erwähnt diese Zeile eingefügt

    while ((c = getchar()) != '\n');
    

    . Das Problem ist, seitdem ich diese Zeile hinzugefügt habe muss ich am Ende 2x Enter drücken. Ich glaube das hat etwas mit dem Puffer zu tun.

    Und wie schon erwähnt bei scanf wenn ich jetzt mehr Zahlen eintippe wird der Puffer einfach geleert. Aber wenn ich nur 2 anstatt der 5 Zahlen eintippe und Enter drücke bleibt das Programm hängen. Wahrscheinlich weil es noch auf die restlichen scanf wartet.

    Kann man das irgendwie ausbessern. Wenn ich nur 2 anstatt 5 Zahlen eingebe und Enter drücke soll es im Programm weitermachen.

    .
    .
    .
    .
                do
                {
                    printf ("\n");
    
                    scanf ("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]); 						
    while ((c = getchar()) != '\n');
    
    .
    .
    .
    
            printf ("Spiel wiederholen, \"Enter\" drücken!\n\n");
            getchar();
            scanf ("%c", &enter);
    
        }
        while (enter=='\n');
    


  • Jepp, scanf wartet auf die restlichen Zahlen. Nimm fgets und sscanf.

    Gruß,
    B.B.



  • pro schrieb:

    Danke für die Antworten.

    @hartmut

    Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.

    Was ist da unklar? 😕


Anmelden zum Antworten