Zahlenratenprogramm
-
Das Programm soll eine Zahl zwischen 1 und 100 erraten können. Eigentlich funzt es sehr gut aber wenn man sich z.B. 81 denkt, kann das Programm die zhal nicht erraten. Ich hab leider keine Idee, wie ich das Programm zum Laufen bringen soll. danke für eure hilfe
mfg gregor#include<iostream>
using namespace std;
int main() {
cout<< "Denken sie sich eine Zahl zwischen 1 und 100" << endl;
int untereGrenze=0;
int obereGrenze=100;
int Mittelwert=50;
int auswahl;
while (untereGrenze!=obereGrenze-1) // -1 damit die Schleife ordungsgemäß abbricht
{ Mittelwert=(untereGrenze+obereGrenze)/2; // Bildung des Mittelwerts der Grenzencout<< "Ist ihre Zahl groesser als " << Mittelwert << " geben sie 1 ein ansonsten eine andere Zahl ." << endl;
cin>> auswahl;while (cin.fail())
{cout<< "Bitte eine Zahl" << endl;
cin.clear();
cin.ignore(256,'\n');
cin>> auswahl;}if (auswahl==1)
{ untereGrenze=Mittelwert; } // Grenzen werden je nach Eingabe angepasst
else
obereGrenze=Mittelwert; // So wird auch der Mittelwert verändert und so auch die Abfrage}
cout<< "Ist ihre Zahl " << Mittelwert << "?" << endl;
system ("pause");
return 0;}
-
Wenn eine Zahl größer als die nachgefragte Zahl ist, dann ist deine neue Untergrenze die nachgefrage Zahl + 1.
Hier noch ein Klassiker der TMP:
#include <iostream> using namespace std; template <unsigned lower, unsigned upper> struct zahlenraten { void operator()() { const unsigned middle = (lower + upper) / 2; cout << "Liegt die Zahl oberhalb von " << middle << "(J/N)? "; char yesorno; cin >> yesorno; if (yesorno == 'n' or yesorno == 'N') zahlenraten<lower, middle>()(); else zahlenraten<middle+1, upper>()(); } }; template<> template <unsigned number> struct zahlenraten<number, number> { void operator()() { cout << "Die Zahl lautet " << number << ".\n"; } }; int main() { const unsigned lower = 0, upper = 10000; cout << "Denke dir eine Zahl zwischen " << lower << " und " << upper << ".\n"; zahlenraten<lower, upper>()(); }
Kann eine Weile zum compilieren brauchen
-
Funzt irgendwie immer noch nich so richtig. Wenn ich es so mache wie du es mir gesagt hast und ich mir jetzt z.B die 75 denke bricht die Schleife niemals ab.
es fragt mich dann irgendwann ist ihre Zahl größer als 75? was sie ja nicht ist und so hau ich ewig auf die 2 und die Schleife bricht nie ab.
-
Wie wärs damit?
Achtung, Spaßversuch!#include <iostream> #include <random> #include <ctime> std::mt19937 randEngine; template<class type> type xrand(type min, type max) { std::uniform_int_distribution<type> scatter(min, max); return scatter(randEngine); } exec(short min, short max) { for(short current(xrand(min, max));max != min;current = xrand(min, max)) { std::cout << "Liegt die Zahl oberhalb von " << current << "? (J/j = Ja)\n"; if(tolower(getchar()) == 'j') min = current + 1; else { max = current; if(max - min == 1) break; } std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } std::cout << "Ergebnis: Zahl ist " << current << '\n'; } int main() { randEngine.seed(std::time(nullptr)); exec(0, 100); }
-
Du musst noch die Abbruchbedingung anpassen:
while (untereGrenze!=obereGrenze)
Das heißt, du bist fertig, wenn du die Zahl eindeutig eingekesselt hast. Die geratene Zahl ist dann natürlich nicht der (an der Stelle noch nicht aktualisierte) Mittelwert, sondern die untere oder die obere Grenze (egal, sind ja beide gleich).
Anderes Thema: Eine elegantere Schreibweise für deine Eingabefehlerkorrektur ist:
while(!(cin>> auswahl)) { cout<< "Bitte eine Zahl" << endl; cin.clear(); cin.ignore(256,'\n'); }
Dies ersetzt deine ganze Eingabeprozedur (also auch das vorherige
cin>> auswahl
), ganz ohne Codewiederholungen.
-
SeppJ schrieb:
Du musst noch die Abbruchbedingung anpassen:
while (untereGrenze!=obereGrenze)
Das heißt, du bist fertig, wenn du die Zahl eindeutig eingekesselt hast.
Der Unterschied kann auch eins Betragen, nicht?
SeppJ schrieb:
Anderes Thema: Eine elegantere Schreibweise für deine Eingabefehlerkorrektur ist:
while(!(cin>> auswahl)) { cout<< "Bitte eine Zahl" << endl; cin.clear(); cin.ignore(256,'\n'); }
Dies ersetzt deine ganze Eingabeprozedur (also auch das vorherige
cin>> auswahl
), ganz ohne Codewiederholungen.256? Also Bitte, Sepp! Du weißt: es gibt Hobbylose Menschen (wie mich).
Zudem ehren wir Murphy und sein Motto.
-
Hacker schrieb:
SeppJ schrieb:
Du musst noch die Abbruchbedingung anpassen:
while (untereGrenze!=obereGrenze)
Das heißt, du bist fertig, wenn du die Zahl eindeutig eingekesselt hast.
Der Unterschied kann auch eins Betragen, nicht?
Und welche von beiden ist es dann?
SeppJ schrieb:
Anderes Thema: Eine elegantere Schreibweise für deine Eingabefehlerkorrektur ist:
while(!(cin>> auswahl)) { cout<< "Bitte eine Zahl" << endl; cin.clear(); cin.ignore(256,'\n'); }
Dies ersetzt deine ganze Eingabeprozedur (also auch das vorherige
cin>> auswahl
), ganz ohne Codewiederholungen.256? Also Bitte, Sepp! Du weißt: es gibt Hobbylose Menschen (wie mich).
Zudem ehren wir Murphy und sein Motto.Das habe ich von ihm übernommen. Ich wollte schließlich die Semantik des Programms nicht verändern. Es tut exakt das gleiche wie vorher, nur der Code ist besser lesbar. Vielleicht ist die 256 wichtig für ihn.
-
SeppJ schrieb:
Hacker schrieb:
SeppJ schrieb:
Du musst noch die Abbruchbedingung anpassen:
while (untereGrenze!=obereGrenze)
Das heißt, du bist fertig, wenn du die Zahl eindeutig eingekesselt hast.
Der Unterschied kann auch eins Betragen, nicht?
Und welche von beiden ist es dann?
Bei der Version die wir beide gemacht haben: die größere.
SeppJ schrieb:
SeppJ schrieb:
Anderes Thema: Eine elegantere Schreibweise für deine Eingabefehlerkorrektur ist:
while(!(cin>> auswahl)) { cout<< "Bitte eine Zahl" << endl; cin.clear(); cin.ignore(256,'\n'); }
Dies ersetzt deine ganze Eingabeprozedur (also auch das vorherige
cin>> auswahl
), ganz ohne Codewiederholungen.256? Also Bitte, Sepp! Du weißt: es gibt Hobbylose Menschen (wie mich).
Zudem ehren wir Murphy und sein Motto.Das habe ich von ihm übernommen. Ich wollte schließlich die Semantik des Programms nicht verändern. Es tut exakt das gleiche wie vorher, nur der Code ist besser lesbar. Vielleicht ist die 256 wichtig für ihn.
[/quote]
Dann hättest du aber gleich 1 schreiben können, dann hättest du 2 Zeichen gespart!
Edit: Diese quotes bringen mich noch um... Puhh..
-
Warum hat Hacker plötzlich nur noch 63 Beiträge?
-
OT@Incocnito: Er wollte offenbar seine Postanzahl wieder näher an sein Können bringen: http://www.c-plusplus.net/forum/304071
-
Hacker schrieb:
SeppJ schrieb:
Hacker schrieb:
SeppJ schrieb:
Du musst noch die Abbruchbedingung anpassen:
while (untereGrenze!=obereGrenze)
Das heißt, du bist fertig, wenn du die Zahl eindeutig eingekesselt hast.
Der Unterschied kann auch eins Betragen, nicht?
Und welche von beiden ist es dann?
Bei der Version die wir beide gemacht haben: die größere.
Nö. Probier zum Beispiel mal, wie du auf 0 kommst. Das ist auch nicht die einzige Ausnahme, aber da ist es am offensichtlichsten.
Dann hättest du aber gleich 1 schreiben können, dann hättest du 2 Zeichen gespart!
Dann täte das Programm aber was anderes. Was ist daran so schwer zu verstehen?
-
Gut die Abbruchbedingung hab ich verändert.
Danke für eure Hilfe.
Aber das Programm scheitert immer noch wenn ich mir z.B. 50 oder 81 ausdenke, sagt er bei 50 51 und bei 81 80 weil er die Zahl vorher schon ausgeschlossen hat.
Könnt ihr mir bitte helfen das Problemn zu lösen?
-
So ungefähr sollte es mit beiden Verbesserungen (und noch ein paar Kleinigkeiten) aussehen:
#include<iostream> using namespace std; int main() { int untereGrenze=0; int obereGrenze=100; cout<< "Denken sie sich eine Zahl zwischen " << untereGrenze << " und " << obereGrenze << endl; // Weniger Hardcoding. while (untereGrenze != obereGrenze) // Abbruch, wenn vollständig eingekreist { int mittelwert=(untereGrenze+obereGrenze) / 2; // Konsistent sein in der Schreibweise! Variablen so lokal wie möglich! cout<< "Ist ihre Zahl groesser als " << mittelwert << " geben sie 1 ein ansonsten eine andere Zahl ." << endl; int auswahl; // Variablen so lokal wie möglich while (!(cin>> auswahl)) { // Einheitlich Einrücken! Wie genau, ist mehr oder weniger egal. Aber konsequent sein! cout<< "Bitte eine Zahl" << endl; cin.clear(); cin.ignore(256,'\n'); } if (auswahl==1) untereGrenze=mittelwert + 1; // Da größer, kann der mittelwert selber ausgeschlossen werden else obereGrenze=mittelwert; } cout<< "Ihre Zahl ist " << untereGrenze << "!" << endl; // Aussage, keine Frage. }
Das funktioniert auch für 50 und 81.
-
danke für die hilfe jetzt funktioniert alles