Zahlenratespiel in Fortran 95

  • Ok, also dann hier mal eine Aufgabe, mit der ich noch nen kleines Problem habe...


    Entwickeln sie einen Algorithmus zu einem Spielprogramm, welches eine von einem menschlichen Mitspieler ausgedachte ganze Zahl aus einem vorgegebenen Intervall [u,o] mit möglichst wenigen Versuchen errät. Dabei sollen zunächst zwei Zahlen u und o nach einer entsprechenden Eingabeaufforderung so lange eingelesen werden, bis u < o gilt.


    Ihr Spielprogramm soll nun wiederholt auf ein Zahl aus diesem Intervall tippen, wobei der menschliche Mitspieler jeweils antwortet, ob diese Zahl richtig, zu klein oder zu groß ist (ohne dabei zu mogeln). Das Spielprogramm erwartet vom menschlichen Mitspieler als Tastatureingabe das Zeichen "=", wenn es die richtige Zahl erraten hat, ansonsten das Zeichen "<" bzw. ">", wenn die getippte Zahl zu klein bzw. zu groß war.


    Sobald die gadachte Zahl erraten wurde, soll die Anzahl der vom Spielprogramm benötigten Rateversuche mit begleitendem Kommentar ausgegeben werden. Falls eine Eingabe des menschlichen Mitspielers früheren Eingaben widerspricht, soll der Algorithmus dies erkennen und das Spielprogramm nach Ausgabe einer entsprechend formulierten Meldung beendet werden. Anderenfalls soll gefragt werden, ob der Mitspieler ein weiteres Mal spielen möchte. Entsprechend der Antwort (Eingabe) ist ein neues Spiel zu beginnen oder das Spielprogramm zu beenden.


    möglichst wenige Rateversuche erreicht man ja, wenn man von dem jeweiligen Intervall den Mittelwert bestimmt.


    Hier mal das Programm, welches ich geschrieben habe:


    PROGRAM zahlenraten

    IMPLICIT NONE
    INTEGER :: u, o, mittelwert, i
    CHARACTER :: zeichen, nochmal

    DO
    DO
    WRITE(*,*) 'Geben Sie die untere Grenze des Intervalls an.'
    READ(*,*) u
    WRITE(*,*) 'Geben Sie die obere Grenze des Intervalls an.'
    READ(*,*) o
    IF (u<o) EXIT
    END DO


    mittelwert=(u+o)/2
    WRITE(*,*) 'Tipp: ', mittelwert
    i=1
    READ(*,*) zeichen

    DO WHILE(zeichen/='=')
    IF (zeichen=='<') THEN
    o=mittelwert
    ELSEIF (zeichen=='>') THEN
    u=mittelwert
    END IF
    IF (mittelwert==(u+o)/2) THEN
    WRITE(*,*) 'Fehler'
    EXIT
    ELSE
    mittelwert=(u+o)/2
    WRITE(*,*) 'Tipp: ', mittelwert
    i=i+1
    READ(*,*) zeichen
    END IF
    END DO

    WRITE(*,*) 'Anzahl der Rateversuche: ', i

    WRITE(*,*) 'Noch ein Spiel?'
    READ(*,*) nochmal
    IF (nochmal=='n') THEN
    EXIT
    END IF
    END DO

    END PROGRAM zahlenraten


    Mein Problem ist jetzt, wie ich diese Fehlermeldung einbauen soll? Wir hatten das, wie oben zu sehen, mal mit einer if-Schleife versucht, das funktioniert aber so nicht.


    Vielleicht hat ja jemand eine Idee, wie das zu lösen ist.


    mfg Conny


    P.S.: Sollte jemand das Programm benötigen bzw. den Compiler, dann bitte nochmal bei mir melden, hab den glaub mit ca. 10MB

  • Erstmal ein paar Zwischenfragen:
    Sind nur ganze Zahlen erlaubt, oder wieviele Kommastellen sind nötig?
    Und bei ganzen Zahlen: Wie entscheidest du den Mittelwert, wenn keine ganze Zahl rauskommt?


    Ich denke mir mit dem Fehler folgendes:


    Du passt doch das Intervall immer mit deinem Mittelwert an, und zwar so das sich ja nur eine Grenze ändert. Entweder der Mittelwert wird zur oberen oder zu unteren Grenze.
    Das bedeutet auch das die obere Grenze immer kleiner wird, und NIE größer werden kann, und die untere Grenze immer größer wird und NIE kleiner werden kann.


    Bei nur ganzen Zahlen tritt also irgendwann der Fall ein, dass nur noch eine Zahl übrig bleibt. Wenn der Benutzer da immernoch größer oder kleiner eingibt, hat er irgendwannn oder ebengerade eine falsche Eingabe gemacht.
    Ok, die Falscheingabe wird nicht sofort registriert, aber eben am Schluss, und zwar dann wenn nur noch eine Möglichkeit besteht.


    Vorher ist es gar nicht möglich die Falscheingabe zu registrieren, weil er ja nur sagt ob die Zahl größer oder kleiner ist (er sagt ja nicht um wieviel), und damit die Eingrenzung weiter geht.

  • Das Integer bedeutet quasi, dass nur natürliche Zahlen zugelassen sind. Ich hab es noch nicht mit ganzen Zahlen getestet.


    Und wir haben auch festgestellt, dass Kommawerte, immer auf ganze Stellen gerundet werden, also so etwas wie 4,5 ist nicht möglich, das folgt aus dem Integer. Ich kann dir jetzt aber nicht sagen, ob das nun aufrundet oder nicht, aber ich denk mal schon.


    Was du geschrieben hast, hab ich mir auch schon überlegt, aber ich weiss nicht wie ich das in das Programm hineinbringen soll. Er gibt ja auch einen Fehler aus, aber das wirklich nur am Ende und das soll ja gerade nicht sein, sondern sobald der Fehler auftritt.


    mfg Conny

  • Natürliche Zahlen sind ja ganze Zahlen. Und mit negativen würde das sicher auch funktionieren.


    Das Problem ist, das man solche einen Fehler während der Eingabe nicht feststellen kann. Denn es soll doch gepüft werden, ob die Eingabe früheren Eingaben widerspricht. Das geht aber erst, wenn wenn nur noch eine Zahl übrig bleibt, und es genau diese Zahl nicht ist.


    Denn solange man noch weiter Einschränken kann, solange ist auch die Aussage des Benutzers gültig.
    Das bedeutet, wenn der Benutzer < sagt, und es geht immer noch kleiner, dann muss man das als richtig annehmen.
    Erst wenn das Programm z.B. als Mittelwert 6 präsentiert, und die
    obere Grenze ist 7 und die untere 5, und der Benutzer sagt größer, dann ist als einzige Zahl noch die 7 übrig. Sagt der Benutzer da jetzt < oder > , dann macht er eine Falschaussage, da er hier das = eingeben muss. Denn es ist die letzte Zahl. (Was er ja nicht weiß, aber er muss ja diese Zahl sich gedacht haben, oder aber er hat vorher schon nicht richtig geantwortet.)


    Man bekommt also nur raus, das er widersprüchliche Aussagen gemacht hat, aber nicht wann.