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");
    }
    

Log in to reply