Zahlen raten

Hallo Leute,

ich verstehe nicht warum wird noch verlangt dass man die Zahl eingeben soll, nachdem der Zahl schon erraten hat? Was ist an meinem Code falsch?

public class ZahlenRaten {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int unteregrenze, oberegrenze, zufall ,eingabe, zaeler = 0;
		
		unteregrenze =sc.nextInt();
		oberegrenze = sc.nextInt();
		
		 zufall = (int) (Math.random()*(oberegrenze - unteregrenze)+unteregrenze);
	       
	        do{
	            zaeler++;
	            System.out.println("N "+ zaeler +" Geben Sie die zahl ein");
	            eingabe = sc.nextInt();
	            int mitte =(oberegrenze-unteregrenze)/2 +unteregrenze;
	            if(zufall > mitte){
	            	
	                unteregrenze = mitte;
	                System.out.println(String.format("Zahl zwischen %s und %s eingeben", unteregrenze, oberegrenze));
	            }else if(zufall < mitte){
	            	
	                oberegrenze = mitte;
	                
	                System.out.println(String.format("Zahl zwischen %s und %s eingeben", unteregrenze, oberegrenze));
	            }else{
	                System.out.println(String.format("Sie haben die zahl beim %s Versuch erraten",zaeler));
	               
	            }
	 
	           
	        }while(eingabe != zufall);
	       
	    }

}

lg Anni

schau dir doch deinen Programmverlauf an, gib alle Werte aus,
oder auch direkt am Code halbwegs ablesbar,
eingabe wird überhaupt nicht verwendet, außer zum Schleifenabbruch ohne direkte Meldung,
nur durch Programmende bekommt man mit dass man den gesuchten Wert gefunden hat,

die Meldungen und überhaupt die Berechnung von Mitte jede Runde sind von der Eingabe unabhängig, laufen ganz alleine,
jede Runde Intervall halbiert bis ‘gefunden’, auch wenn man die ganze Zeit 0 eintippt

ich will vorerst nicht viel mehr erzählen außer Anregungen:
überlege dir, wie das Programm überhaupt funktionieren soll,
was soll in Situation X mit Werten … bei Eingabe Y konkret passieren?
was bei einer anderen Eingabe, überlege alle Möglichkeiten, außerhalb des Bereichs, ober/ unterhalb der ‘Mitte’ usw.

und dann programmieren, bisher wie gesagt wird eingabe gar nicht für Vergleiche mit etwa mitte verwendet,

das hängt in deinem if … else if…
wenn du das klar machst, was wohin gehört, dann sollte das auch klappen

				unteregrenze = mitte;
				System.out.println("bitte geben Sie die zahl mehr als "+mitte);
			}else {
				if(zufall < mitte){
				System.out.println("bitte geben Sie die zahl weniger als "+mitte);
				oberegrenze = mitte;
			}else{
				System.out.println("Sie haben die zahl beim " + zaehler+ " Versuch erraten");
			}}

ist der Code jetzt gut? mir bleibt trotzdem Rätsel, warum in der do reingekommen ist, nachdem die zahl erraten wurde

public class ZahlenRaten {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int unteregrenze, oberegrenze, zufall, eingabe, zaeler = 0;

		unteregrenze = sc.nextInt();
		oberegrenze = sc.nextInt();

		zufall = (int) (Math.random() * (oberegrenze - unteregrenze) + unteregrenze);

		do {
			zaeler++;
			System.out.println("N " + zaeler + " Geben Sie die zahl ein");
			eingabe = sc.nextInt();
			int mitte = (oberegrenze - unteregrenze) / 2 + unteregrenze;
			if (eingabe < unteregrenze || eingabe > oberegrenze) {
				System.out.println(String.format(
						"Bitte geben die die Zahl zwischen %s und %s ein ", unteregrenze,
						oberegrenze));
			} else {
				if (zufall > mitte) {

					unteregrenze = mitte;
					System.out.println(String.format(
							"Zahl zwischen %s und %s eingeben", unteregrenze,
							oberegrenze));
				} else {
					if (zufall < mitte) {

						oberegrenze = mitte;

						System.out.println(String.format(
								"Zahl zwischen %s und %s eingeben",
								unteregrenze, oberegrenze));
					} else {
						System.out.println(String.format(
								"Sie haben die zahl beim %s Versuch erraten",
								zaeler));

					}
				}
			}
		} while (eingabe != zufall);

	}

}

So richtig sinnvoll erscheint das Ganze nicht.
Der geratene Wert spielt für die Hinweise, die das Programm gibt, aktuell keine Rolle.
Wäre es nicht vielleicht sinnvoller, wenn das Programm nur beurteilen würde, ob der eingegebene Wert zu groß, oder zu klein ist ?

Edit:
Ich hab das nochmal genauer angeschaut…
das Programm behauptet, die Zahl sei gefunden worden, obwohl nur die “Mitte” der Zahl entspricht.
Überlege dir die Logik nochmal…

hi, glaub das müsste dir helfen, halt warum es Int so macht, kann ich dir leider net sagen…

 if (eingabe == zufall){  
            	System.out.println("größer: " + (zufall > mitte)); //false
            	System.out.println("kleiner: " + (zufall < mitte)); //true
            	System.out.println("Sie haben die zahl beim " + zaeler+ " Versuch erraten");
                
            }
            else if(zufall > mitte){
                unteregrenze = mitte;
                System.out.println("bitte geben Sie die zahl mehr als "+mitte);
            }else {
                System.out.println("bitte geben Sie die zahl weniger als "+mitte);
                oberegrenze = mitte;
            }

ich habe alles mit der hand aufgeschrieben und soll nichts falsches an diese Logik sein.
extra habe ich code verändert damit der hier übersichtlicher ist

public class ZahlenRaten {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int unter, ober, zufall, eingabe, zaeler = 0;

		unter = sc.nextInt();
		ober = sc.nextInt();

		zufall = (int) (Math.random() * (ober - unter) + unter);

		do {
			zaeler++;
			System.out.println("N " + zaeler + " Geben Sie die zahl ein");
			eingabe = sc.nextInt();

			if (eingabe < unter || eingabe > ober) {
				System.out.println("ausser intervalgrenze");
			} else {
				int mitte = (ober - unter) / 2 + unter;
				if (zufall > mitte) {

					unter = mitte;
					System.out.println("zwischen " + unter + "und" + ober);
				} else {
					if (zufall < mitte) {

						ober = mitte;

						System.out.println("zwischen " + unter + "und" + ober);
					} else {
						System.out.println(String.format(
								"Sie haben die zahl beim %s Versuch erraten",
								zaeler));

					}
				}
			}
		} while (eingabe != zufall);

	}
}

mal nen Vorschlag:

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int unteregrenze, oberegrenze, zufall, eingabe, zaehler = 0;
		System.out.println("Bitte geben sie die Untergrenze der Zufallszahl ein");
		unteregrenze = sc.nextInt();
		System.out.println("Bitte geben sie die Obergrenze der Zufallszahl ein");
		oberegrenze = sc.nextInt();
		if (oberegrenze < unteregrenze){
			int i = oberegrenze;
			oberegrenze = unteregrenze;
			unteregrenze = i;        	
		}
		zufall = (int) (Math.random() * (oberegrenze - unteregrenze) + unteregrenze);
		do {
			zaehler++;
			System.out.println("N " + zaehler + " Geben Sie die zahl ein");
			eingabe = sc.nextInt();
			int mitte = (oberegrenze - unteregrenze) / 2 + unteregrenze;
	 		if (eingabe >=unteregrenze && eingabe <= oberegrenze) {

	 		  if (zufall > mitte) {
				unteregrenze = mitte;
			  } else {
				// zufall <= mitte) 
				oberegrenze = mitte;
			  }
			 }
			 if (zufall != eingabe)
				System.out.printf(
						"Zahl zwischen %s und %s eingeben%n", unteregrenze,
						oberegrenze);
		} while (eingabe != zufall);
		System.out.printf(
				"Sie haben die zahl beim %s Versuch erraten%n",
				zaehler);
	}
}```

ich habe frage bei dem Code


public class ZahlenRaten {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int unter, ober, zufall, eingabe, zaeler = 0;

		unter = sc.nextInt();
		ober = sc.nextInt();

		zufall = (int) (Math.random() * (ober - unter) + unter);

		do {
			zaeler++;
			System.out.println("N " + zaeler + " Geben Sie die zahl ein");
			eingabe = sc.nextInt();

			 
				int mitte = (ober - unter) / 2 + unter;
				if (zufall > mitte) {

					unter = mitte;
					System.out.println("zwischen " + unter + "und" + ober);
				} else if (zufall < mitte) {

						ober = mitte;

						System.out.println("zwischen " + unter + "und" + ober);
					} else {
						System.out.println(String.format(
								"Sie haben die zahl beim %s Versuch erraten",
								zaeler));

					}
				
			
		} while (eingabe != zufall);

	}
}

warum ist diese Ausgabe?
**Sie haben die zahl beim 6 Versuch erraten
N 7 Geben Sie die zahl ein
**

warum springt wieder in do rein obwohl eingabe == Zufall?

*** Edit ***
@pappawinni dein code schaut besser aus. danke.
aber sind die Zeilen 33-36 notwendig?

Deine Ausgabe
Sie haben die zahl beim 6 Versuch erraten
N 7 Geben Sie die zahl ein

Entsteht, wenn die **Mitte ** der gesuchten Zahl entspricht, die richtige Zahl aber nicht eingegeben wurde.
eingabe == Zufall trifft eben nicht zu.
Das habe ich oben schon versucht zu sagen.
Die richtige Zahl wurde eingegeben, wenn die while-Schleife verlassen wird, denn das ist ja schließlich die Bedingung für das verlassen der Schleife.
Warum soll ich dann in der Schleife die Ausgabe machen, dass die Zahl gefunden worden sei ?
In der Schleife soll das Programm nur Hinweise geben.

Thema zu Ende? vorerst auf ‘gelöst’ gesetzt

das ursprüngliche Konzept war ja gar nicht so falsch wie ich dachte,
eine Variante habe ich zur Ergänzung habe ich auch noch…

public class Test {
    public static void main(String[] args)     {
        Scanner sc = new Scanner(System.in);
        int unteregrenze, oberegrenze, zufall, eingabe, zaeler = 0;

        unteregrenze = 50;
        oberegrenze = 90;
        System.out.println("Grenzen: " + unteregrenze + ", " + oberegrenze);
        zufall = (int)(Math.random() * (oberegrenze - unteregrenze) + unteregrenze);
        System.out.println("Zufall: " + zufall);
        while (true)    {
            zaeler++;
            System.out.println("N " + zaeler + " Geben Sie die zahl ein");
            eingabe = sc.nextInt();
            if (eingabe < unteregrenze || eingabe > oberegrenze)
            {
                System.out.println("betrunken? noch mal, so gehts ja nicht ");
                continue;
            }
            if (eingabe == zufall)
            {
                System.out.println(String.format("Sie haben die zahl beim %s. Versuch erraten", zaeler));
                // fertig
                break;
            }
            int mitte = (oberegrenze - unteregrenze) / 2 + unteregrenze;
            if (zufall > mitte)
            {
                unteregrenze = mitte;
                System.out.println(String.format("Zahl zwischen %s und %s eingeben", unteregrenze, oberegrenze));
            }
            else
            {
                oberegrenze = mitte;
                System.out.println(String.format("Zahl zwischen %s und %s eingeben", unteregrenze, oberegrenze));
            }
        }

    }
}