Zahlenraten



  • Hallo Leute,

    wir haben gerade in der Uni mit C++ begonnen, aber irgendwie fällt's mir schwer den Wald vor lauter Bäume zu finden (obwohl es nur Basics sind).
    Wir sollen folgende Aufgabe lösen:

    Schreiben Sie ein C++ Programm, welches eine Zahl errät, die sich der
    Benutzer gemerkt hat.
    Ausgehend vom Ursprungs-Zahlenbereich wird der aktuelle Ratebereich
    immer wieder in zwei Hälften geteilt (arithmetisches Mittel, mit ganzen
    Zahlen gerechnet) und die Zahl aus der Mitte des Bereichs angefragt. Je
    nach der Benutzereingabe wird dann mit der entsprechenden Hälfte des
    Ratebereichs weitergemacht.

    Der Testlauf würde dann so aussehen:

    Merken Sie sich eine Zahl zwischen 1 (inklusive) und 100 (exklusive)
    Aktueller Ratebereich: 1 bis 100
    Ist 50 ihre Zahl?
    (j) ja: gleich,
    (k) nein: meine Zahl ist kleiner,
    (g) nein: meine Zahl ist groesser.
    ? k // Benutzereingabe
    Aktueller Ratebereich: 1 bis 50
    Ist 25 ihre Zahl?
    (j) ja: gleich,
    (k) nein: meine Zahl ist kleiner,
    (g) nein: meine Zahl ist groesser.

    Seid bitte nicht zu hart mit mir, ich weiß, dass ich es über Schleifen lösen kann, jedoch fällt mir die Programmierung schwer. Vielen Dank vorab.

    VG



  • @calvinho
    Was hast du denn bis jetzt?


  • Mod

    Da hatte ich vor langer Zeit mal ein wunderbares Template-Metaprogramm geschrieben, das alle möglichen Pfade vorberechnet, so dass man ganz ohne Schleifen auskommt. Hat mehrere Minuten compiliert wenn man den Zahlenbereich bis 1000 nahm 😀

    Schade, ich finde es nicht mehr. Es muss hier noch irgendwo im Forum sein.



  • @DocShoe
    bin jetzt wieder bei 0.
    Hab's mit einer if-Schleife versucht, aber der Code wurde immer länger und brachte nicht das gewünschte Ergebnis.
    Wollte es mal mit einer while-Schleife versuchen, aber ich weiß nicht wie diese aussehen soll.

    PS: Ich will keinen fertigen Code abstauben. Ich möchte nur verstehen, wie und warum ich in diesem Fall vorgehen soll, da ich wohl noch was länger mit dem Zeug zu tun haben werde.


  • Mod


  • Mod

    @calvinho sagte in Zahlenraten:

    PS: Ich will keinen fertigen Code abstauben. Ich möchte nur verstehen, wie und warum ich in diesem Fall vorgehen soll, da ich wohl noch was länger mit dem Zeug zu tun haben werde.

    Du formulierst im Kopf oder auf Papier ganz genau das Vorgehen, wie du das machen würdest, wenn du von Mensch zu Mensch spielen würdest. Dann programmierst du das so.



  • @calvinho Du fängst mit einer unteren und einer oberen Grenze an

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


  • Ich glaube, man fängt mit

    int main()
    {
    }
    

    an. Und TE hat bisher nicht eine Zeile Code gepostet, da beweg ich mich nicht.



  • @SeppJ sagte in Zahlenraten:

    Ich hab's: https://www.c-plusplus.net/forum/topic/304235/zahlenratenprogramm/2

    Lustig 🙂

    Aber @calvinho: das solltest du dir noch nicht anschauen.

    Erstmal: es gibt keine if-Schleife. Wenn du eine "if-Schleife" durch eine "while-Schleife" (die gibt es) ersetzt, ist irgendwas komisch. Mit if bekommst du eine Verzweigung. Ein if selbst wiederholt nichts. Die erneute Abfrage passiert in einer Schleife.

    Also kannst du sowas machen:

    ratebereich festlegen = [1, 99]
    suchzahl einlesen
    forever:
       frage, ob gößer/kleiner/gleich als der Mittelwert
       if gleich: jubeln, schleife verlassen
       if größer, dann ratebereich neu festlegen mit (mittelwert, maximum des ratebereiches],
       sonst  ratebereich neu festlegen mit [minimum des ratebereiches, mittelwert),
    


  • Erstmal danke für die schnellen Antworten.

    @SeppJ
    Auf dein Programm bin ich tatsächlich auch schon gestoßen, allerdings darf ich nur das nutzen, was unserem Kenntnisstand entspricht.

    #include <iostream>
    using namespace std;

    int main()
    {
    int untere_Grenze = 1, obere_Grenze = 100, Mittelwert = (obere_Grenze + untere_Grenze) / 2, Wert = 0;
    char j, g, k;

    cout << "Merken Sie sich eine Zahl zwischen 1 (inklusive) und 100 (exklusive)." << endl << endl;
    cout << "Aktueller Ratebereich: " << untere_Grenze << " bis " << obere_Grenze << endl;
    cout << "Ist " << Mittelwert << " ihre Zahl?" << endl;
    cout << "(j) ja: gleich," << endl;
    cout << "(k)nein: meine Zahl ist kleiner," << endl;
    cout << "(g)nein: meine Zahl ist groesser." << endl;
    
    if (Wert == Mittelwert)
    {
    	cin >> j;
    	cout << "Die gesuchte Zahl ist " << Mittelwert << endl;
    }
    	 if (Wert > Mittelwert)
    	{
    		cin >> g;
    		cout << "Aktueller Ratebereich: " << Mittelwert << " bis " << obere_Grenze << endl;
    		cout << "Ist " << Mittelwert * 1.5 << " ihre Zahl?" << endl;
    		cout << "(j) ja: gleich," << endl;
    		cout << "(k)nein: meine Zahl ist kleiner," << endl;
    		cout << "(g)nein: meine Zahl ist groesser." << endl;
    	}
    		else if (Wert < Mittelwert)
    		{
    			cin >> k;
    			cout << "Aktueller Ratebereich: " << untere_Grenze << " bis " << Mittelwert << endl;
    			cout << "Ist " << Mittelwert / 2 << " ihre Zahl?" << endl;
    			cout << "(j) ja: gleich," << endl;
    			cout << "(k)nein: meine Zahl ist kleiner," << endl;
    			cout << "(g)nein: meine Zahl ist groesser." << endl;
    		}
    
     
    system("PAUSE");
    return 0;
    

    }

    Das hätte ich soweit, allerdings wird mir immer die letzte Verzweigung ausgegeben, egal welchen Buchstaben ich eingebe...



  • @calvinho sagte in Zahlenraten:

    wird mir immer die letzte Verzweigung ausgegeben,

    Welchen Wert hat Wertdenn?



  • @manni66
    was würdest du mir empfehlen? immerhin weiß ich jetzt wo der Fehler liegt..


  • Mod

    @calvinho sagte in Zahlenraten:

    @SeppJ
    Auf dein Programm bin ich tatsächlich auch schon gestoßen, allerdings darf ich nur das nutzen, was unserem Kenntnisstand entspricht.

    Du brauchst ja nur die Templates entfernen und dann hast du ein wunderbares rekursives Programm.



  • @calvinho sagte in Zahlenraten:

    was würdest du mir empfehlen?

    Ich weiß nicht was du mit Wert anstellen willst.



  • @manni66
    Ich wollte vergleichen, ob die gesuchte Zahl <, >, = Mittelwert ist.
    Aber so klappt das ja nicht



  • @calvinho sagte in Zahlenraten:

    @manni66
    Ich wollte vergleichen, ob die gesuchte Zahl <, >, = Mittelwert ist.
    Aber so klappt das ja nicht

    Da du die gesuchte Zahl nicht kennst kannst du sie auch nicht testen. Du wirst wohl irgendwie die Antwort des Benutzers auswerten müssen.



  • Kann ich das irgendwie so darstellen, dass:

    wenn die Benutzereingabe j / k / g lautet,
    dass dann Entsprechendes passiert?


  • Mod

    @calvinho sagte in Zahlenraten:

    Kann ich das irgendwie so darstellen, dass:

    wenn die Benutzereingabe j / k / g lautet,
    dass dann Entsprechendes passiert?

    Ja. "Wenn" heißt auf C++ "if".



  • Danke @SeppJ , das ist mir bewusst.
    Würdest du mir verraten, wie die if-Verzweigung aussehen könnte?


  • Mod

    @calvinho sagte in Zahlenraten:

    Danke @SeppJ , das ist mir bewusst.
    Würdest du mir verraten, wie die if-Verzweigung aussehen könnte?

    Du schreibst erst if; dann in runden Klammern, wann etwas passieren soll; dann in geschweiften Klammern, was passieren soll.

    Dein jetziger Ansatz wird niemals funktionieren. Bitte lies dir genau die Ratschläge durch, wie man so ein Programm schreiben könnte. Es wurde schon ziemlich genau alles gesagt, jede weitere Konkretisierung würde heißen, dass es dir jemand komplett hin schreibt.


Log in to reply