Zahlenratenprogramm
-
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