Bedingung anders formulieren
-
Hallo
ich habe die Bedingung a != b != c != d != e.
Wie könnte ich das am einfachsten in eine if-Bedingung schreiben.
MfG
-
Kommt drauf an ...
brauchst Du es nur für rein binär abbildbare Typen oder soll das bei double/float auch funktionieren?Du meinst schon das Ergebnis, daß keine Var mit auch nur irgendeiner inhaltsgleich ist?
-
Ja genau,
es gilt für int-Zahlen von 0-9 und keine soll doppelt vorkommen.
-
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 )
-
Hallo volkard,
danke für das Ergebnis. Gäbe es auch eine kürzere bzw. einfachere Möglichkeit.
Was kann man anstatt fflush() in Linux verwenden.
-
Einfacher wäre wohl sortieren und dann durchlaufen und auf Duplikate checken.
fflush() gibt es auch unter Linux. Falls du fflush(stdin) meinst, das steht in der FAQ.
-
Hmm, ich seh' jetzt nur eine ellenlange if- Zeile oder etwas lesbarer gestaffelte if's ... alles unschön.
Woher kommen die Zahlen, vielleicht kannst Du schon an frührerer Stelle Doubletten vermeiden?
Geht's Dir um's if, um Performance oder einfach die Tipparbeit?
-
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 beispielint 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 0int 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 0int 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.
-
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