Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.



  • Hi, ich habe folgende Aufgabenstellung: Der Benutzer soll eine Zahl 1-100 eingeben und dann diese Zahl erraten. Ich mache das über do while schleifen und if bedingungen. Leider komme ich an dieser Stelle einfach nicht mehr weiter und daher die Frage an euch: Habe ich einen richtigen Ansatz, oder bin komplett auf der falschen Schiene. Die Vorschläge sind immer flasch und ich komm einfach nicht drauf:D
    int zahl = 0;
    char antwort = ' ';
    int max = 100;
    int min = 1;
    int vorschlag = 50;

    do
    {
    	cout << "Bitte geben Sie eine Zahl zwischen 1-100 ein: " << endl;
    	cin >> zahl;
    } while (zahl == 0 || zahl > 100);
    
    
    
    do {
    
    
    	cout << "Aktueller Ratebereich: " << min << " - " << max << endl;
    	cout << "(j) - ja: gleich " << endl;
    	cout << "(k) - nein: kleiner " << endl;
    	cout << "(g) - nein: groesser " << endl;
    	cout << "ist ihre Zahl: " << vorschlag << endl; // errechne den Durchschnitt
    	cin >> antwort;
    
    	// oder ich muss es ausführlicher machen mit den if-anweisungen?
    
    	if (antwort == 107) //wenn kleiner ist (k)
    	{
    		//int neu_max = max;
    		max = (max / 2); // das funktioniert
    		vorschlag = (max - min) / 2; // das funktioniert
    
    		if (antwort == 103) // durch breakpoints herausgefunden: compiler Überspringt die if-bedingung
    		{
    			min = (max / min) / 2; //%?
    			int vorschlag = ((max - min) / 2);
    
    		}
    	}
    
    
    
    	else {
    		if (antwort == 103) // wenn größer ist (g)
    		{
    			int neu_min = min;
    			min = (max / 2); //Fehler : bleibt bei 50
    			vorschlag = (max - min) / 2;
    			if (antwort == 107)
    			{
    				max = (max - min) / 2; 
    				int neuvorschlag = (max - min) / 2; // FEHLER wert ist 25 sollte aber in der ersten Runde 75 sein.
    			}
    
    		}
    	}
    
    	if (antwort == 106)
    	{
    		break;
    	}
    
    
    
    } while (antwort != 106);
    
    
    cout << "Ihre Zahl lautet: " << vorschlag << endl;

  • Mod

    Ich behaupte mal: Du hast die Aufgabenstellung falsch verstanden. Erklär beispielsweise mal den Sinn davon, vorher nach der richtigen Lösung zu fragen! Üblich ist bei diesem Ratespiel, dass man zu einem Vorschlag fragt, ob dieser kleiner gleich der richtigen Lösung ist oder nicht, bis man sicher ist, die korrekte Lösung gefunden zu haben.

    Gewöhn' dir bitte sofort ab, Buchstaben als Zahlen darzustellen. Das ist unleserlich, fehleranfällig, und unportabel, und es gibt nicht einen einzigen Grund dafür, das so zu tun.

    Computer überspringen nichts, sie tun genau das, was du ihnen sagst. Wenn in Zeile 27 etwas anderes passiert, als du denkst, dann hast du dem Computer etwas anderes gesagt, als du denkst. Tipp: Dein Programm ist ja schon halbwegs richtig eingerückt, daher ist der Programmfluss ja sogar halbwegs nachvollziehbar. Beantworte dir selber die Frage: Welchen Wert hat antwort in Zeile 27? Was und warum hast du in Zeile 38 anders gemacht?

    Andere Dinge, die sofort ins Auge fallen sollten: Welchen Wert kann antwort in Zeile 59 niemals haben, wenn es Zeile 54 gibt?



  • @SeppJ
    1)"Erklär beispielsweise mal den Sinn davon, vorher nach der richtigen Lösung zu fragen!"
    ==>Was genau meinst du mit vorher? Zunächst soll ja die Hälfte aller möglichen Werte 1-100 ausgeschlossn werden darum wird direkt gefragt, ob der Wert 50 ist. Oder wie meinst du das?

    "2)Üblich ist bei diesem Ratespiel, dass man zu einem Vorschlag fragt, ob dieser kleiner gleich der richtigen Lösung ist oder nicht, bis man sicher ist, die korrekte Lösung gefunden zu haben" ==> Das gedenke ich ja zu tun, indem ich immer einen bestimmten Bereich ausschließe ( siehe 1))

    1. ich verwende char, weil in der Aufgabenstellung buchstaben für Entscheidungen eingegeben werden sollen:
      k=kleiner, g=größer und j=ja

    4)"Computer überspringen nichts, sie tun genau das, was du ihnen sagst. Wenn in Zeile 27 etwas anderes passiert, als du denkst, dann hast du dem Computer etwas anderes gesagt, als du denkst. Tipp: Dein Programm ist ja schon halbwegs richtig eingerückt, daher ist der Programmfluss ja sogar halbwegs nachvollziehbar. Beantworte dir selber die Frage: Welchen Wert hat antwort in Zeile 27? Was und warum hast du in Zeile 38 anders gemacht?"
    ==> Ja ich denke dass da auch irgendwo der Fehler liegt, ... ich schau mir das schon so lange an, aber ich komm einfach icht drauf. Jeder gedanke an eine For schleife endet im sinnlosen. Könntest du mir konkret sagen, was genau ab Zeile 37 falsch ist? Meinst du etwas, dass Zeile 38 eine eigene If-Anweisung bilden sollte und kein Else Zweig



  • Im Grunde folgt diese Aufgabe doch dem Prinzip der Intervalhalbierung oder? Man nimmt die Mitte und fragt ob die Antwort entweder korrekt ist oder kleiner. Wenn sie beides nicht ist, ist sie im oberen Interval und man nimmt dieses als Min und Max an und halbiert wieder und fragt. Richtig?



  • @It0101 Korrekt 🙂
    nur sind meine Anweisungen nicht richtig und ich finde dne Fehler nicht 😃
    Zumindest wenn es darum geht, wenn die Zahl größer ist.
    Bei kleiner funtiniert es halbwegs



  • @mmm_1482_
    zu 1. du solltest die 50 (schon in der Schleife aus max und min berechnen)
    zu 2. 'k' (achte auf die einfachen ' ) ist ein int also eine Ganzzahl. Den kannst du in deinem Vergleich hinschreiben.

    if (antwort == 'k') ist deutlich lesbarer (und portabler) als die 107

    zu 3. (siehe Zeile 6)
    @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    if (antwort == 107) //wenn kleiner ist (k)
     	{
     		//int neu_max = max;
     		max = (max / 2); // das funktioniert
     		vorschlag = (max - min) / 2; // das funktioniert
      // Hier ist immer noch das if (antwort == 107) gültig. Es gibt keine Änderung der Variablen *antwort*. Warum sollte die nächste Bedingung plötzlich wahr sein?
     		if (antwort == 103) // durch breakpoints herausgefunden: compiler Überspringt die if-bedingung
     		{
     			min = (max / min) / 2; //%?
     			int vorschlag = ((max - min) / 2);
     
     		}
     	}
    


  • @DirkB
    2. ==> okay werd ich mir angewöhnen da habt ihr recht 🙂
    3. ==> sollte ich in dem Fall eine For schleife um die verschachtelte If-Anweiung setzen?



  • @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    nur sind meine Anweisungen nicht richtig und ich finde dne Fehler nicht

    Das einzige was du berechnen musst, ist der Mittelwert.
    Den neuen Min- oder Max-Wert bekommst du durch eine einfache Zuweisung.
    Wann du welchen Wert an Max oder Min zuweist kannst du nochmal überlegen.

    Vielleicht bringen dich ja Zeile 42 und 45 in deinem Code auf die Spur.



  • @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    1. ==> sollte ich in dem Fall eine For schleife um die verschachtelte If-Anweiung setzen?

    Warum überhaupt das verschachtelte if ?



  • @DirkB
    Meine Überlegung dazu war, dass sich durch zb die erste eingabe kleider oder größer, auch eine Möglichkeit ergeben muss, falls im Bereich kleiner doch (g) nochmal G verwendet werden muss Beispiel bei der Zahl 45
    bei 50 = kleiner eingeben
    dann haben wir den wert 25
    bei 25 =größer eingeben ( = das wollte ich mit der Verschachtelung eigentich bewirken )



  • @DirkB der Mittelwert sollte eigentlich auch durch Zeile 42 und 45 berechnet werden .. Mittelwert ist doch (max-min)/2 oder nicht? 😃



  • @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    @DirkB
    Meine Überlegung dazu war, dass sich durch zb die erste eingabe kleider oder größer, auch eine Möglichkeit ergeben muss, falls im Bereich kleiner doch (g) nochmal G verwendet werden muss Beispiel bei der Zahl 45

    Dafür ist die Schleife da.
    Vor 5 Tagen war das Thema schon mal da: https://www.c-plusplus.net/forum/topic/350174/zahlenraten

    untere_Grenze = 1, obere_Grenze = 100
      
    tue (Schleifenanfang)
       Daraus bestimmst du den Mittelwert.
       Fragst den Benutzer
       Je nach Nutzereingabe ('g' oder 'k') bestimmst du die untere oder die obere Grenze neu gesetzt wird
     solange die Eingabe ungleich 'j' ist, machst du weiter (in der Schleife).
    

    @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    @DirkB der Mittelwert sollte eigentlich auch durch Zeile 42 und 45 berechnet werden .. Mittelwert ist doch (max-min)/2 oder nicht? 😃

    Ja. Aber da steht doch zweimal die Gleiche Berechnung. Also ist max doch auch nur der Mittelwert (Vorschlag).



  • @DirkB okaay... also irgendwo verstehe ich was ihr meint aber es ist noch nicht ganz druchgedrungen 😃 ich schau mir das jetzt nochmal alles genau an. Also ist eurer meinung nach keine Verschachtelung notwendig? Ich denke ich werde das nochmal alles überdenken.
    Aber vielen Dank, dass ihr euch die Zeit genommen habt 🙂


  • Mod

    @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    @SeppJ
    1)"Erklär beispielsweise mal den Sinn davon, vorher nach der richtigen Lösung zu fragen!"
    ==>Was genau meinst du mit vorher? Zunächst soll ja die Hälfte aller möglichen Werte 1-100 ausgeschlossn werden darum wird direkt gefragt, ob der Wert 50 ist. Oder wie meinst du das?

    Erkläre die Zeilen 1-5.



  • Das ist damit der Mensch nicht bescheissen kann 🤣



  • @SeppJ das ist für Die Überprüfung der Eingabe da. Solange der Nutzer einen Wert über 100 oder 0 eingibt, soll die Anweisung ausgeführt werden



  • du solltest dir vor allem mal gedanken über den programmablauf machen. wenn die zahl z.b. größer als 50 ist, ist min 50, ist die kleiner als 50, so ist max 50 bzw. allgemein ist das immer die eigegebene zahl. und die mitte ist dann glaube ich min + (max - min) / 2 bzw. max - (max - min) / 2.

    nimm dir mal ein blatt papier (mit den zahlen von 1 - 10) und spiel das ganze durch!



  • @mmm_1482_ sagte in Bisektion Zahlen 1-100. Ist mein Ansatz komplett Falsch? Wo liegt der Fehler für die falschen Vorschläge.:

    @SeppJ das ist für Die Überprüfung der Eingabe da. Solange der Nutzer einen Wert über 100 oder 0 eingibt, soll die Anweisung ausgeführt werden

    Warum muss der Nutzer überhaupt eine Zahl eingeben?



  • @DirkB weil es teil der aufgabenstllung ist, das die eingegeben Zahl erraten werden soll (durch ausschlussverfahren)



  • @Wade1234 hab ich ... mein logisches Denkvermögen ist echt nicht gut 😃 ich bin auch echt kein mathematiker/informatiker mensch. Nur gehört dieses eine Fach zu meinem Studium dazu -.- und ich bin zurzeit im Drittversuch und dreh langsam durch :` D ich studiere eigentlich nur etwas mit medien XD und bin eher der künstlerische kreative nicht nach logik basierende mensch


Log in to reply