# Eingabe über Scanner einlesen und automatisch beenden



## serendipity (19. Nov 2009)

Hallo @all,

ich habe ein Programm geschrieben, dass Gleitkommazahlen vom Nutzer einliest (über java.util.scanner), diese in einem Array speichert und anschließend das Array durchläuft und prüft, ob die eingegebenen Zahlen aufsteigend sortiert sind. Der Nutzer beendet die Eingabe entweder vorzeitig durch Eingabe eines nichtnumerischen Wertes oder es wird automatisch nach 8 Zahlen abgebrochen.

Das Ganze funktioniert auch wunderbar, solange der Nutzer seine Zahlen durch RETURN trennt. Wenn man allerdings Leerzeichen als Trennung verwendet (was der Scanner ja trotzdem als separate Eingaben erkennt), wird das Einlesen nicht automatisch nach 8 Eingaben beendet. 

Hier mal der Code zur Verdeutlichung:


```
// VORBEREITUNG
		double[] zahlenfolge = new double[8];
		int anzahl = 0;
		double vorigeZahl = Double.MIN_VALUE, aktuelleZahl;
		boolean istSortiert = true;		
		java.util.Scanner s = new java.util.Scanner(System.in);
		// Anfangsmeldung
		System.out.println("<A2: Pruefung auf aufsteigende Sortierfolge>\n"
				+ "     max. 8 Gleitkommazahlen Zahlen eingeben, "
				+ "nichtnumerische Eingabe ist Eingabeende");
		
		// HAUPTTEIL
		// Einlesen
		while ((anzahl < zahlenfolge.length) && s.hasNextDouble()) {
			zahlenfolge[anzahl] = s.nextDouble();
			anzahl++;
		}
		System.out.println("Es wurden " + anzahl + " Zahlen eingelesen.");
		
		// Auswerten
		// Pruefen auf sortierte Zahlenfolge wenn mind. 1 Zahl eingegeben wurde
		if(anzahl != 0){
			for(int i = 0; i < anzahl; i++) {
				aktuelleZahl = zahlenfolge[i];
				if (vorigeZahl > aktuelleZahl) istSortiert = false;
				vorigeZahl = aktuelleZahl;
			}
			// Ausgabe
			System.out.print("Die Zahlenfolge ist ");
			
			if (!istSortiert) System.out.print("NICHT ");
			System.out.println("aufsteigend sortiert.");			
		}
		else System.out.println("Bitte geben Sie mindestens eine Zahl ein.");
```

Das Problem tritt irgendwie in der while-Schleife auf... Seltsamerweise greift die Abbruchbedingung, wenn man mehr als 8 per Leerzeichen getrennte Zahlen eingibt und er liest auch wirklich nur die ersten 8 Zahlen ins Array. Dh. die while-Schleife wird danach nicht mehr ausgeführt, aber er springt aus irgendeinem Grund nicht zur nächsten Anweisung... Der Nutzer kann also fröhlich locker weiter Zahlen eingeben, bis er schließlich irgendwann ein nichtnumerisches Zeichen oder RETURN eingibt.

Vielleicht kann mir jemand einen Tipp geben?

viele grüße,
sara


----------



## SlaterB (19. Nov 2009)

solange nicht Return gedrückt wird kannst du tippen was dir Spaß macht, das Programm bekommt nichts davon mit,
etwa so wie 'Antwort eintippen hier im Forum', vor dem Antworten-Button weiß das Forum davon auch nix,


----------



## bygones (19. Nov 2009)

SlaterB hat gesagt.:


> solange nicht Return gedrückt wird kannst du tippen was dir Spaß macht, das Programm bekommt nichts davon mit,
> etwa so wie 'Antwort eintippen hier im Forum', vor dem Antworten-Button weiß das Forum davon auch nix,



waere das Forum n Google Wave Client waere dieser Vergleich falsch ;-)


----------



## serendipity (19. Nov 2009)

dh, wenn ich das richtig verstehe: der scanner liefert erst die einzelnen tokens für die while-schleife, wenn ich return drücke?
gibts denn irgendeinen weg, wie ich trotzdem - mit leerzeichen - die eingabe auf 8 zahlen beschränken könnte?


----------



## SlaterB (19. Nov 2009)

in while eine Variable i hochzählen, i<8 oder ähnlich als zusätzliche Bedingung ins while,

oder eine for-Schleife


----------



## serendipity (19. Nov 2009)

Ja, das habe ich doch: meine "anzahl" variable wird bei jedem durchlauf inkrementiert und sollte also für den abbruch sorgen. machts ja auch, wenn ich eben immer mit return die zahlen voneinander trenne...aber eben nicht bei leerzeichen.


----------



## SlaterB (19. Nov 2009)

hab nicht genau vorher nachgeschaut,

na dann wird doch wohl die Schleife nicht über 8 hinauslaufen oder?
vielleicht hängt sie an einer Scanner-Eingabe,

prüfe per System.out.println(), wie viele Schleifendurchläufe es gibt


----------



## serendipity (20. Nov 2009)

ok, also ich verstehs nicht! hab jetzt mal eine Ausgabe in die while-Schleife gebastelt, wie vorgeschlagen. Wenn ich jede Zahleneingabe mit return bestätige wird jedes Mal mein println ebenfalls ausgegeben (wie erwartet). wenn ich aber nun die zahlen nur durch leerzeichen getrennt eingebe, wird nichts zwischen den einzelnen zahlen ausgegeben (kann also ungehindert mehr als 8 eingeben), sondern erst, wenn ich return (oder nichtnumerisches zeichen) eingebe, werden meine println's alle nacheinander ausgegeben. also so etwa:

mit return:
zahl1 (return)
"Es wurde 1 Zahl eingegeben"
zahl 2 (return)
"Es wurden 2 Zahlen eingegeben"
...

mit leerzeichen:
zahl1 (leerzeichen) zahl2 (lehrzeichen) ... zahlx (return)
"Es wurde 1 Zahl eingegeben"
"Es wurde 2 Zahl eingegeben"
...
"Es wurde x Zahl eingegeben"

wenn ich mir aber das array anzeigen lasse (nach der while-schleife), sind da in jedem der fälle immer nur die (ersten) 8 Zahlen drin. also scheinbar führt er im falle des leerzeichens die while-schleife erst hinterher aus (bis die abbruch bedingung greift).. warum???


----------



## SlaterB (20. Nov 2009)

> also scheinbar führt er im falle des leerzeichens die while-schleife erst hinterher aus

hinter was?
erst nach dem Return?
da wären wir wieder bei der ersten Antwort:



SlaterB hat gesagt.:


> solange nicht Return gedrückt wird kannst du tippen was dir Spaß macht, das Programm bekommt nichts davon mit,
> etwa so wie 'Antwort eintippen hier im Forum', vor dem Antworten-Button weiß das Forum davon auch nix,


----------



## serendipity (20. Nov 2009)

ok, verstanden. aber dann bin ich wieder bei meiner fragen vom anfang:



> gibts denn irgendeinen weg, wie ich trotzdem - mit leerzeichen - die eingabe auf 8 zahlen beschränken könnte?



woraufhin dann dein vorschlag mit der zähler-variable kam


----------



## SlaterB (20. Nov 2009)

tja, ich bezog mich darauf, den while-Schleifen-Code zu beschränken usw.

wieviel der User eintippt kannst du nicht begrenzen, ganz böse verknüpfen da eine 1 GB-Textdatei als Eingabe 
nur die Verarbeitung im Programm liegt in deiner Hand


----------



## serendipity (22. Nov 2009)

ok, der einwand ist berechtigt. da es sich aber um eine uni-hausaufgabe handelt, muss ich mir über solche feinheiten keine gedanken machen^^ ich wollts eben nur perfekt machen.

nach etwas genauerer überlegung habe ich jetzt auch meinen denkfehler gefunden: java.util.scanner liest zeilenweise ein und erst nach beendigung einer zeile zerlegt es diese in die einzelnen tokens, richtig? dann ist auch klar, warum meine abbruchbedingung mit der return-variante einwandfrei funktioniert, nicht aber bei trennung der tokens durch leerzeichen...
sicher gibt es da auch einen work-around, aber ich muss mich ja an meine vorgaben halten  dann muss ich mich damit so jetzt zufrieden geben, schätze ich.

danke für die hilfreichen tipps!


----------

