Fallabfrage optimieren
-
Hallo!
Ich würde gerne die unten stehende Abfrage optimieren, vereinfachen oder einen möglichen Fehler, den ich noch nicht gesehen habe ausbessern.
Ziel des Programms ist es, eine Ober- und eine Untergrenze zufällig im Bereich von 1 - 1000 zu generieren.
Genau in der Mitte dieser Grenzen liegt die gesuchte Zahl, die vom Benutzer geraten werden soll. Hierbei soll je nach Eingabe ein entsprechender Hinweis zurückgegeben werden.Liegt der geratene Wert: 1. unterhalb der Untergrenze:"viel zu klein"
2. innerhalb der Grenzen, näher an der Untergrenze als an
der Mitte: "zu klein"
3. innerhalb der Grenzen, näher an der Mitte als an der
Untergrenze:" ein bisschen zu klein"Und das selbe im Grunde auch nochmal für die Obergrenze. Also komme ich auf 6 Fallunterscheidungen, (bzw. 7 für 'richtig geraten')
Hier mein aufs wesentliche gekürzter C-Code:
int randomNumber() { int randomnumber1; int randomnumber2; int a=1; int b=1000; randomnumber1 = (rand() % (b+1-a))+a; randomnumber2 = (rand() % (b+1-a))+a; if (randomnumber1 > randomnumber2) // in d steht die untere Grenze, in c die obere Grenze { c = randomnumber1; d = randomnumber2; } else { d = randomnumber1; c = randomnumber2; } mitte = (d+c)/2; return 0; } void fallabfrage() { do{ eingabe(); if (input < d) printf ("Viel zu klein!\n"); // Danach muss mein Input größer als d sein. else { if(input > c) printf("Viel zu gro\xE1!\n"); // Danach muss mein input kleiner als c sein. else { if((input > mitte) && (( c-mitte)/2) > input - mitte) printf ("Ein bisschen zu gro\xE1\n"); // Hier teile ich das Intervall nach rechts in 2 gleichgroße Stücke und vergleiche den Input else { if (((input > d) && (input< c)) && ((input-d) < (mitte - input)) || (input==d)) printf ("Zahl ist zu klein\n"); //Danach ist die Zahl mindestens näher an der Mitte oder größer else { if((input < mitte) && (( mitte-d)/2) > mitte - input) printf ("Ein bisschen zu klein\n"); else { if(((input > d) && (input< c)) && ((c-input) < (input - mitte)) || (input==c)) printf ("Zahl ist zu gro\xE1\n"); else { if(input == mitte) { printf("Richtig geraten!\nUntergrenze: %d\nObergrenze: %d\n", d,c); getchar(); } } } } } } } }while(input != mitte); }
Das Programm funktioniert soweit aber wenn Jemand Zeit und Lust hätte sich das mal anzuschauen und mir sagen könnte, wie man das vielleicht erheblich kürzen könnte wäre das super.
Grüße!
Aaron
-
Habs mir jetzt nicht wirklich komplett angeguckt, aber eine Kleinigkeit schonmal:
So viele verschachtelte ifs finde ich schwer zu lesen. Wenn du die Einrücktiefe reduzieren willst, kannst du folgende Transformation anwenden:
while (a) { if (b) foo(); else { if (c) bar(); else { ... } } }
->
while (a) { if (b) { foo(); break; } if (c) { bar(); break; } ... }
-
Dobi schrieb:
while (a) { if (b) foo(); else { if (c) bar(); else { ... } } }
->
while (a) { if (b) { foo(); break(); } if (c) { bar(); break(); } ... }
break
ist keine Funktion
->while (a) { if (b) { foo(); } else if (c) { bar(); } else { ... } }
-
@transformer: Oh, haha, danke. Das kommt davon wenn man selbst solchen Popelscode nicht testet vorm Posten. Vergessen habe ich natürlich folgendes.
#define break() break
Habs korrigiert.
-
Einmal geteilt (drüber/drunter?) und eine Hilfsvariable eingeführt.
void fallabfrage(){ if(input<mitte){ int schwelle = d + (mitte-d)/2; if(input<d) puts("Viel zu klein"); else if(input<schwelle) puts("Zu klein"); else puts("Ein wenig zu klein"); } else if(mitte<input){ // 1337 Version mit ?: Operator int schwelle = mitte + (c-mitte)/2; const char* str = c<input ? "Viel zu gross" : schwelle<input ? "Zu gross." :"Ein wenig zu gross"; puts(str); } else puts("richtig"); }