 | |
09.06.2008, 17:16
|
#1 (permalink)
| | PC Schrauber
Registriert seit: 11.05.2006
Beiträge: 131
| Warum eine Endlosschleife? Guten Tag,
ich habe mir vorgenommen mit einem Buch näher an Java ran zu kommen. Dort gibt es ein Beispielprogramm, was ich ihr unten seht. Leider kommt das Programm wohl aus der while-Schleife nicht raus, was ich nicht verstehe. PHP-Code: public class Zeichen { public static void main (String[] args) throws Exception { int c = 0; int anzahl = 0; while (c != -1) { c = System.in.read(); if (c != -1) { System.out.println ("ASCII-Code: " + c + " Zeichen: " + (char) c); anzahl = anzahl + 1; } } System.out.println ("nAnzahl, die irgendwie nich kommt evtl.?: " + anzahl); } }
Ist das ausreichend um Hilfe zu bekommen oder fehlt noch was?
PS.: Das Buch sagt, dass man Strg + Z drücken muss, damit System.in.read () -1 zurück gibt, was ich aus der Documentation aber nicht erkennen kann. | |
Geändert von Greeven (09.06.2008 um 17:22 Uhr)
|
| |
10.06.2008, 07:59
|
#2 (permalink)
| | Stickstoff Junkie
Registriert seit: 14.02.2005 Ort: 70 KM südlich Stuttg
Beiträge: 4.649
| AW: Warum eine Endlosschleife? Hi, ich bin jetzt nich so der ultra programmer, gleich gar nich in Java, aber ich hoffe mal ich kann dir helfen:
Eine While Schleife ist eine sogenannte "Kopfgesteuerte Schleife", d.h. die Schleife überprüft erst jedes mal die Bedinngung bevor es eigentlich losgeht. In deinem Fall wird das aber nich passieren, da deine variable "c" immer ungleich -1 sein wird, daher springt er gar nich in den 2. Teil rein sondern macht solange den 1. bis c mal verändert werden würde. while (c != -1) wird also immer true sein, weil c nie verändert wird.
Hoffe das is richtig und verständlich.
MfG
bigfoot996 | |
Geändert von bigfoot996 (10.06.2008 um 08:06 Uhr)
|
| |
10.06.2008, 08:18
|
#3 (permalink)
| | Extrem Tweaker
Registriert seit: 01.07.2002
Beiträge: 2.031
| AW: Warum eine Endlosschleife? Also ich würde vermuten, dass System.in.read() keine -1 zurückgibt.
lass doch mal testweise den eingelesenen int wieder ausgeben, noch vor dem if, dann siehst du ja ob da ein -1 kommt. | | |
| |
10.06.2008, 08:38
|
#4 (permalink)
| | Kaffeejunkie
Registriert seit: 01.05.2002 Ort: Augsburg
Beiträge: 5.035
| AW: Warum eine Endlosschleife? Zitat:
Zitat von bigfoot996 Hi, ich bin jetzt nich so der ultra programmer, gleich gar nich in Java, aber ich hoffe mal ich kann dir helfen:
Eine While Schleife ist eine sogenannte "Kopfgesteuerte Schleife", d.h. die Schleife überprüft erst jedes mal die Bedinngung bevor es eigentlich losgeht. In deinem Fall wird das aber nich passieren, da deine variable "c" immer ungleich -1 sein wird, daher springt er gar nich in den 2. Teil rein sondern macht solange den 1. bis c mal verändert werden würde. while (c != -1) wird also immer true sein, weil c nie verändert wird.
Hoffe das is richtig und verständlich.
MfG
bigfoot996 | Das stimmt so leider nicht.
C wird genau hier " c = System.in.read();" überschrieben.
Das mit der kopfgesteuerten Schleife hat dann den Einfluss, dass man in die Schleife mindestens einmal hinein gelangt und diese dann frühestens nach dem ersten Durchlauf terminiert.
Dass bei Strg + z ein -1 zurückgegeben wird wundert mich jetzt doch ein wenig. Hast Du es denn mal mit Strg + c probiert? Das ist normalerweise die Abbruchstastenkombination von Konsolenanwendungen und könnte evtl einen Fehlercode in der Art von -1 werfen. | | |
| |
10.06.2008, 08:50
|
#5 (permalink)
| | Stickstoff Junkie
Registriert seit: 14.02.2005 Ort: 70 KM südlich Stuttg
Beiträge: 4.649
| AW: Warum eine Endlosschleife? Zitat:
Zitat von EoN Das stimmt so leider nicht.
C wird genau hier " c = System.in.read();" überschrieben.
Das mit der kopfgesteuerten Schleife hat dann den Einfluss, dass man in die Schleife mindestens einmal hinein gelangt und diese dann frühestens nach dem ersten Durchlauf terminiert.
Dass bei Strg + z ein -1 zurückgegeben wird wundert mich jetzt doch ein wenig. Hast Du es denn mal mit Strg + c probiert? Das ist normalerweise die Abbruchstastenkombination von Konsolenanwendungen und könnte evtl einen Fehlercode in der Art von -1 werfen. | Hm mist, ich hätte doch den javakurs auch noch machen sollen xD
Aber es kommt ja auch drauf an weis er eingibt oder? wenn er jedes mal sowas eingibt das es ungleich -1 is dann geht er ja trotzdem nich aus dem while raus oder? | | |
| |
10.06.2008, 08:52
|
#6 (permalink)
| | Kaffeejunkie
Registriert seit: 01.05.2002 Ort: Augsburg
Beiträge: 5.035
| AW: Warum eine Endlosschleife? Zitat:
Zitat von bigfoot996 Hm mist, ich hätte doch den javakurs auch noch machen sollen xD
Aber es kommt ja auch drauf an weis er eingibt oder? wenn er jedes mal sowas eingibt das es ungleich -1 is dann geht er ja trotzdem nich aus dem while raus oder? | Richtig, ist halt die Frage was die Strg + irgendwas Tastenkombinationen zurückgeben. Da sind leider meine Javakenntnisse am Ende. | | |
| |
10.06.2008, 09:01
|
#7 (permalink)
| | Stickstoff Junkie
Registriert seit: 14.02.2005 Ort: 70 KM südlich Stuttg
Beiträge: 4.649
| AW: Warum eine Endlosschleife? Zitat:
Zitat von EoN Richtig, ist halt die Frage was die Strg + irgendwas Tastenkombinationen zurückgeben. Da sind leider meine Javakenntnisse am Ende. | Ach sei getröstet, ich kenn nichmal irgendwelche strg + xx Kombinationen xD Ich kenn mich in java absolut 0 aus, programmier so gut wie nur C# und selbst das noch miserabel
Für mein eigenes Verständniss nochmal: Meine Erklärung vorher was soweit richtig bis auf das das die Variable C doch verändert wird oder? Dann is sein Problem doch eig gar kein Problem, nur dass er halt nie das richtige eingibt das nich -1 rauskommt und er somit in den 2. Teil der Schleife geht oder? | | |
| |
10.06.2008, 09:20
|
#8 (permalink)
| | Kaffeejunkie
Registriert seit: 01.05.2002 Ort: Augsburg
Beiträge: 5.035
| AW: Warum eine Endlosschleife? Zitat:
Zitat von bigfoot996 Ach sei getröstet, ich kenn nichmal irgendwelche strg + xx Kombinationen xD Ich kenn mich in java absolut 0 aus, programmier so gut wie nur C# und selbst das noch miserabel
Für mein eigenes Verständniss nochmal: Meine Erklärung vorher was soweit richtig bis auf das das die Variable C doch verändert wird oder? Dann is sein Problem doch eig gar kein Problem, nur dass er halt nie das richtige eingibt das nich -1 rauskommt und er somit in den 2. Teil der Schleife geht oder?  | Ja es kommt anscheinend durch Strg + Z kein "-1" zurück. | | |
| |
10.06.2008, 10:12
|
#9 (permalink)
| | Overclocker
Registriert seit: 24.05.2002
Beiträge: 200
| AW: Warum eine Endlosschleife? Zitat:
Zitat von EoN Ja es kommt anscheinend durch Strg + Z kein "-1" zurück. | Also bei mir klappt das prima..
Ich hab es aber auf die Schnelle nirgendwo offiziell dokumentiert gefunden. Aber STRG+Z soll dafür sorgen, dass der InputStream der Tastatur beendet wird (EOF bzw. End of Stream).
Bei mir im Eclipse klappt das..
Edit: Hier stehen ein paar Sätze dazu: Ein-/Ausgabe Zitat: - Ende der Eingabe
Ctrl-Z signalisiert das Ende der Eingabe (end of file). Häufig ist mindestens unter DOS/Windows nach Ctrl-Z noch ein Enter nötig, damit das lesende Programm das Ctrl-Z auch erhält. | | | |
| |
10.06.2008, 10:38
|
#10 (permalink)
| | PC Schrauber
Registriert seit: 11.05.2006
Beiträge: 131
| AW: Warum eine Endlosschleife? Habe es mit Strg + fast die ganze Tastatur versucht. Schade, dass diese Abbruchkombinationen alle nicht funktionieren. So will es ja das Buch.
Schlimmer find ich, dass die eingefügten Ausgaben nicht erscheinen. Warum die Ausgaben nicht kommen, ist dann bestimmt etwas, was mir später noch erklärt wird. Eine Erklärung wäre trotzdem schön, weswegen die nicht kommen und Abbruchkombinationen müssten doch eigentlich irgendwo nachzulesen sein, oder? PHP-Code: public class Zeichen { public static void main (String[] args) throws Exception { int c = 0; int anzahl = 0;
System.out.println (c + " " + anzahl);
while (c != -1) { c = System.in.read(); System.out.print (c); System.out.println ("Wäre schön, wenn ich dies sehen würde:" + anzahl);
if (c != -1) { System.out.println ("ASCII-Code: " + c + " Zeichen: " + (char) c); anzahl = anzahl + 1; } } System.out.println ("nAnzahl: " + anzahl); } }
| | |
| |
10.06.2008, 10:48
|
#11 (permalink)
| | Overclocker
Registriert seit: 24.05.2002
Beiträge: 200
| AW: Warum eine Endlosschleife? Drückst du zwischendurch auch [Enter]? Der Input-Stream hat da wohl einen Puffer (bin mir fast sicher, dass man den irgendwo abschalten kann, hab ich aber nicht gefunden), der erst bei [Enter] geflusht wird.
Deine Ausgabe "0 0" erscheint? | | |
| |
10.06.2008, 11:40
|
#12 (permalink)
| | PC Schrauber
Registriert seit: 11.05.2006
Beiträge: 131
| AW: Warum eine Endlosschleife? Also zwischendurch Enter drücken würde nix bringen, da dann mein schon eingegebener Input nochmal gegeben wird. Du kannst auch "blablabla" eingeben, nicht nur Zahlen. Hab grad mit einem Kumpel drüber sinniert, der hatte es auch erst so aufgefasst. Bei ihm allerdings kamen - bis auf die letzte - die anderen Ausgaben. meine Ausgabe sieht wie folgt aus, nachdem ich "testbla" eingegeben habe und Enter gedrückt hab:
testbla
ASCII-Code: 116 Zeichen: t
ASCII-Code: 101 Zeichen: e
ASCII-Code: 115 Zeichen: s
ASCII-Code: 116 Zeichen: t
ASCII-Code: 98 Zeichen: b
ASCII-Code: 108 Zeichen: l
ASCII-Code: 97 Zeichen: a
ASCII-Code: 10 Zeichen:
Merkwürdig dabei ist, dass testbal am Anfang angezeigt wird, was ich nicht erwartet hätte und dass halt keine der anderen Ausgaben kommt. | | |
| |
10.06.2008, 11:48
|
#13 (permalink)
| | Overclocker
Registriert seit: 24.05.2002
Beiträge: 200
| AW: Warum eine Endlosschleife? Zitat: |
Merkwürdig dabei ist, dass testbal am Anfang angezeigt wird, was ich nicht erwartet hätte und dass halt keine der anderen Ausgaben kommt.
| javac vergessen? Sieht mir so aus, als hast du noch eine alte Class-Datei.. | | |
| |
10.06.2008, 13:04
|
#14 (permalink)
| | PC Schrauber
Registriert seit: 11.05.2006
Beiträge: 131
| AW: Warum eine Endlosschleife? Habe eine Entwicklunsumgebung (Kürzel dafür vergessen). Weiß nicht wie man auf sowas, wie du kommen könnte, da doch immer davor compiliert wird, oder nich? Muss ja. Aber drei Sterne kommen nicht von ungefähr.^^ Also habe ich in meinem Ordner zwei Classdateien gelöscht, die Zeichen.class hießen. Ausgeführt und es kam: PHP-Code: init: deps-jar: compile-single: run-single: java.lang.NoClassDefFoundError: punkt/Zeichen (wrong name: Zeichen) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$000(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) Exception in thread "main" Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)
Ich war schockiert, was ich angerichtet hab und löschte dies auch bei Netbeans und erstellte es neu. Das gleiche. Da fiel mir ein, dass es ja auch noch eine Javadatei gibt. Die hab ich dann auch gelöscht und quasi einen richtigen Neuanfang bezüglich diesem "Zeichen-Programm". Und nun seh ich zwar noch nicht die letzte Ausgabe, aber die davor schonmal. Nun jedoch meine Frage: Was hab ich nun eigentlich gemacht, weswegen der gleiche Code auf einmal anders behandelt wird?
So schauts also jetz aus: PHP-Code: 0 0 test 116 Wäre schön, wenn ich dies sehen würde: 0 ASCII-Code: 116 Zeichen: t 101 Wäre schön, wenn ich dies sehen würde: 1 ASCII-Code: 101 Zeichen: e 115 Wäre schön, wenn ich dies sehen würde: 2 ASCII-Code: 115 Zeichen: s 116 Wäre schön, wenn ich dies sehen würde: 3 ASCII-Code: 116 Zeichen: t 10 Wäre schön, wenn ich dies sehen würde: 4 ASCII-Code: 10 Zeichen:
| | |
| |
10.06.2008, 13:09
|
#15 (permalink)
| | Overclocker
Registriert seit: 24.05.2002
Beiträge: 200
| AW: Warum eine Endlosschleife? Ich benutze zwar kein Netbeans, aber die IDEs kommen schnell aus dem Tritt, wenn man am Projektverzeichnis irgendwas manuell löscht/ändert.
Dein Verhalten kann nur davon kommen, dass die class-Datei nicht neu generiert wurde. Vielleicht hast du bei dir kein automatisches Build aktiviert und es wurde nur beim allerersten Versuch eine Class-Datei erstellt?
Was passiert, wenn du den "Play"-Button in deiner IDE klickst, ist relativ weit konfigurierbar.
Meine Sternchen hier sagen übrigens recht wenig über mein Java-Können aus
Nur soviel, ich verdiene mein Geld mit programmieren ua. Java.
Edit:
Prüfe am besten das Datum von deiner Class Datei. Wenn sich das nicht ändert, wird die Datei auch nicht neu erstellt. Kannst ja im Netbeans mal nach "Build automatically" oder ähnliches ausschau halten. In deutsch müsste es sowas wie "Automatisches Erstellen" heißen. | |
Geändert von BenniG. (10.06.2008 um 13:21 Uhr)
|
| |  | | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | | | | Ansicht | Thema bewerten | Linear-Darstellung | |
Forumregeln
| Es ist dir erlaubt, neue Themen zu verfassen. Es ist dir erlaubt, auf Beiträge zu antworten. Es ist dir nicht erlaubt, Anhänge hochzuladen. Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr. | | |