Problem bei Zahlenspielerei (Anfängerfrage - wahrscheinlich dummer Fehler)



  • 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_unten testen... 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-faq
    

    ich 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 = 10

    Die gedachte Zahl ist 6
    Er sagt 5, du gibst 1 ein -> größer
    Er sagt 7 du gibst 0 ein -> kleiner

    Damit 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 eingegrenzt
    

    also 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 : P

    ahja...

    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.


Anmelden zum Antworten