Problem bei Zahlenspielerei (Anfängerfrage - wahrscheinlich dummer Fehler)
-
also g ist nur dazu da dass der Mensch dem Programm sagen kann ob die gedachte zahl größer oder oder kleiner als m ist. Wenn für g eine 1 eingegeben wird dann wird für die Anfangsvariable der Mittelwert genommen und bei 0 wird für die Endvariable der Mittelwert genommen. Danach wird im nächsten Durchlauf m neu als Mittelwert zwischen a und e berechnet. So soll die zahl immer weiter eingegrenzt werden bis Anfangswert (a) und Endwert (e) die gleiche ganze Zahl sind.
g wird bei jedem Durchlauf "geleert" weil sie ja bei jedem durchlauf wieder neu eingeführt wird.So solls zumindest sein
-
Denke das problem liegt hier:
do{ ..... } while(a=e); //Sollte das nicht (a!=e) heissen?Wenn ich es so compile mit (a!=e), dann geht er solange weiter bis er die Zahl gefunden hat.
-
#include <iostream> int main() { int grenze_unten; std::cin >> grenze_unten; // Anfangswert int grenze_oben; std::cin >> grenze_oben; //Endwert int versuch; int zaehler(0); int relation; //hier wäre ein enum sicherlich sehr viel sinnvoller ^^ //>0 größer //0 richtig //<0 kleiner do { versuch = (grenze_unten + grenze_oben) /2; //mittelwert std::cout << versuch; std::cin >> relation; if(relation < 0) grenze_oben = versuch; if(relation > 0) grenze_unten = versuch; ++zaehler; } while (relation); std::cout << "Deine Zahl ist: " << versuch << " und ich habe nur " << zaehler << " Versuche gebraucht!" << std::endl; system("pause"); //wieso man es so nicht machen sollte: siehe konsolen-faq }bb
Man könnte Relation noch in die Schleife packen, die beiden Bedingungen auf <= und >= ändern und auf
grenze_oben != grenze_untentesten... Weiß nicht, was da besser wäre...Ich habe versucht, bessere Variablen-Namen zu nutzen und alles sehr simpel zu halten - falls es dennoch zu hoch für dich ist, solltest du mal fragen...
-
UI es funktioklappt danke schön für die Hilfe.. Ich glaub ich habe inzwischen entdeckt dass ich while und until verwechselt habe

-
unskilled schrieb:
system("pause"); //wieso man es so nicht machen sollte: siehe konsolen-faqich mach es so weil sich ohne das mein AntiVir meldet
-
Es klappt, obwohl du nur das = in ein != geändert hast?
glaub ich nicht?
was machst du, wenn der pc das richtige ergebnis getippt hat?
richtig - du hast nich ma die möglichkeit, dem zu sagen, dass es richtig ist, weil du nur größer oder kleiner kennst und keines zutrifft - allerdings machst du dann nichts, wenn keines zutrifft...bb
edit:
antivir
lol?
also meins meldet sich bei so etwas nicht:
std::cin.clear(); std::cin.ignore( std::cin.rdbuf()->in_avail() ); std::cin.get();was bitte machst du denn, dass sich antivir meldet und was sagt es denn dann? Oo
-
es hat irgendetwas mit einem kill-befehl gesagt.. kann natürlich auch sein dass es nur ein zufall war und gar nichts damit zu tun hat.
doch es klappt weil ich ihm ja dann sage dass die richtige Zahl größer UND kleiner ist was dazu führt dass erst der anfangswert und dann der endwert auf m gesetzt wird somit ist a!=e nicht erfüllt und er geht aus der schleife raus
-
unskilled hat da durchaus recht, so funktioniert es nicht.
@unskilled Wobei deiner Version muss man ja auch sagen das die Zahl richtig ist. So wie ich den Code von Alexandra interpretiere mit dem
while(a!=e)Sollte das Programm das ja selber auf die Reihe kriegen. Letztlich müsste man ja nur prüfen:
while(e-a > 2) // Ausgabe ist dann std::cout << a+1 << std::endl;Dann würde er es selber merken.
#edit:
Mach mal:
a = 0
e = 10Die gedachte Zahl ist 6
Er sagt 5, du gibst 1 ein -> größer
Er sagt 7 du gibst 0 ein -> kleinerDamit ist die 6 als Ergebnis schon klar er sagt allerdings wiederum 6.
-
ja, das war mit sicherheit zufall... kannst es ja ma ausprobieren...
Alexandra schrieb:
doch es klappt weil ich ihm ja dann sage dass die richtige Zahl größer UND kleiner ist
do { int g; // zum feststellen ob die zahl größer oder kleiner als m ist (1 = größer / 0 = kleiner) m=(a+e)/2; // m soll der mittelwert zw. anfangswert und endwert sein std::cout<<m; std::cin>>g; switch(g) { case 1: a=m; // die gedachte zahl ist größer als m also soll der anfangswert auf m gesetzt werden (endwert bleibt gleich) break; case 0: e=m; // die gedachte zahl ist kleiner als m also soll der endwert auf m gesetzt werden (anfangswert bleibt gleich) break; default: break; }; c=c+1; // nur ein kleiner zähler um zu sehen wieviele versuche es gebraucht hat (spielerei) } while(a!=e); // anfangswert entspricht dem endwert => zahl weit genug eingegrenztalso mal paar anmerkungen: da er niemals 2 mal die gleiche zahl nacheinander rät (es sei denn, untere grenze == obere grenze), kannst du nicht größer und kleiner auf einmal angeben...
außerdem hast du ihn dann um einen versuch beschissen : Pahja...
Wobei deiner Version muss man ja auch sagen das die Zahl richtig ist.
Und wie spielst du Zahlenraten?
Sagst du auch immer, dass der andere die falsche Zahl hat, auch wenn er die richtige erraten hat? Oo
Natürlich muss man ihm sagen, dass es die richtige Zahl ist - genau, wie man ihm sagen muss, dass die Zahl zu klein oder zu groß ist... ~~nimm bei dem bsp. mal 5 als gesuchte zahl und versuch, dass das prgramm auf 5 kommt (also bei der meldung, dass es die zahl rausbekommen hat)... -.-
bb
-
ja das wäre mein nächster Gedanke gewesen mit dem e-a>2 aber jetzt funktioniert schomal das Grundgerüst jetzt ist der Rest nur noch Kosmetik ^^
also der erste Fehler war while und until verwechsderlt

der zweite war die Erkennung der richtigen Zahl (Gemurkse mit größér UND kleiner)Danke an Alle kann geclosed werden.
-
Zugegebenermaßen, da hab ich wohl nen Denkfehler gehabt...
Das funktioniert alles nur solange er die gesuchte Zahl nicht anzeigt, du hast Recht.