JAVA simpler programmfehler

AW: JAVA simpler programmfehler - suche hilfe

Ich will nicht den Buhmann spielen, aber welche Grundlagen hast Du?
Ich fürchte Du wirst eine ziemlich ekelhafte Lernkurve erfahren, wenn Du auf die Art weitermachst.
Bei den ersten Posts drängt sich auf, dass Dir das Thema "Rückgabewerte von Funktionsaufrufen" nicht so ganz klar ist. Bei den Weiteren kommen noch ganz andere Fragen.
Vom Ansatz her hast Du doch folgendes:
Ein Feld (also ein Abfolge von Elementen), das Daten enthält.
Das ist der String, dessen Inhalt Du prüfen willst, er besteht aus einer Folge von einzelnen Zeichen.
Du willst jetzt die Anzahl der Zeichen betrachten.
Dafür gibt es die Methode "length()", als Methode der String-Klasse.
Wenn Du also ein String Objekt hast, kannst die mit "<Objektname>.length()" diese Methode für das Stringobjekt aufrufen.
Der "Rückgabewert" enthält dann die gesuchte Information.
Genauere Beschreibung der Methode: http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html#length()
Die Methode gibt also einen "int"-Wert zurück. (die Anzahl der Zeichen).
Diesen Wert kannst Du zuweisen und dann weiterverarbeiten.
Wenn Dein String "12345" ist, dann gibt
identnummer.length(); den Wert "5" zurück, und
stringlaenge=identnummer.length();
speichert diesen Wert in der Variable "stringlänge".
Die Prüfung der Länge läuft dann allgemein so ab:

Code:
solange Abbruchbedingung nicht erfüllt:
     einlesen des Strings
     ermitteln der länge
     vergleichen der länge mit dem gewünschten wert
         wenn länge in ordnung -> abbruchbedingung auf "erfüllt" setzen
         wenn länge nicht in ordnung -> abbruchbedingung bleibt "unerfüllt"
Dieser Ablauf wird solange wiederholt, bis die Abbruchbedingung erfüllt ist.
Damit landest Du in Java ungefähr hier:
Code:
BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
		boolean lengthOK = false;
		String identnummer = "";
		while( lengthOK == false ){
			try{
				System.out.println("Identnummer eingeben: ");
				identnummer = ein.readLine();
			}catch(Exception e){

			}
			if( 6 == identnummer.length() ){
				lengthOK = true;
			} else {
				System.out.println("Ungültige Länge. Die Identnummer muss aus 6 Ziffern bestehen");
			}
		}
Die Prüfung kannst Du dann beliebig erweitern. Dabei kommt es eigentlich nur drauf an, die verschiedenen Tests sinnvoll zu verschachteln.
Für die Prüfung der Zeichen "läufst" (iterierst) Du über das Feld mit den Daten.
Du betrachtest also jedes einzelne Zeichen des Strings und kontrollierst, ob es eine Zahl ist oder nicht.
Findest Du ein Zeichen, das keine Zahl ist, ist der String ungültig und die Eingabe muss wiederholt werden.
Die Methode "isDigit()" ist insofern besonders, da sie ohne ein konkretes Objekt aufgerufen werden kann.
mit "Character.isDigit('a');" kann direkt ein Zeichen geprüft werden. "Character" ist dabei der Name der Klasse, in der die Methode enthalten ist.
(Schau Dir an, was "statische Methoden" sind!)
Genauso kannst Du die Methode aber auch bei einem beliebigen Character-Objekt aufrufen.
Code:
Character c = new Character('a');
boolean value = c.isDigit('0');
Für die Prüfung spielt der Wert 'a' im Character dann keine Rolle mehr, da das zu prüfende Zeichen der Methode direkt übergeben wird.
(Deswegen auf jeden Fall genauer anschauen und lernen.)
Mit der zweiten verschachtelten Prüfung landet man dann etwa hier:
Code:
BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
boolean stringOK = false;
String identnummer = "";
		
while (stringOK == false) {
	try {
		System.out.println("Identnummer eingeben: ");
		identnummer = ein.readLine();
	} catch (Exception e) {
                // Fehlerbehandlung...
	}
	if (6 == identnummer.length()) {
		stringOK = true;
		for (int i = 0; i < 6; i++) {
			char value = identnummer.charAt(i);
			if (Character.isDigit(value) == false) {
				stringOK = false;
				System.out.println("Ungültiges Zeichen: \"" + value + "\"");
			}
		}
	} else {
		System.out.println("Ungültige Länge. Die Identnummer muss aus 6 Ziffern bestehen");
	}
}
System.out.println("Identnummer: \"" + identnummer + "\" ist in Ordnung.");

Du solltest Dir wirklich erstmal die Grundlagen erarbeiten, sonst wirst Du anstrengende, zeitraubende und entmutigende Probleme bekommen.

-- -- muckelzwerg
 
AW: JAVA simpler programmfehler - suche hilfe

import java.lang.Integer;

int zahl = 0;
while(zahl < 100000 || zahl > 999999){ // falls Zahl kleiner 100.000 oder größer 999.999
try{
System.out.println("Identnummer eingeben: (6 Ziffern) ");
String identnummer = in.readLine(); // String einlesen
int zahl = Integer.parseInt (identnummer);//String.toInt sozusagen
}catch(Exception e){
System.out.println("Nur Zahlen erlaubt"); // Falls etwas keine Zahl ist
}}

So ist es vlt. einfacher
 
Zuletzt bearbeitet:
AW: JAVA simpler programmfehler - suche hilfe

Sicher. Und wenn Du weiter nach oben scrollst, findest Du eine Lösung mit Regexp, die noch einfacher ist.
Aber was hat er davon? Willst Du ihm jetzt alle Programme schreiben, wenn seine nicht funktionieren?
Dazu kommt, dass Du ein paar unsaubere Stellen verwendet hast.
Das implizite Wissen "die Zahl liegt zwischen 100000 und 999999" funktioniert zwar, ist aber nicht unbedingt toll.
Dann sollte das Ganze so auch nicht kompilieren, weil Du zahl zweimal deklariert hast.
Du verwendest ExceptionCode um einen ganz gewöhnlichen Ablaufpfad zu implementieren, das sollte auch nicht unbedingt sein. Zudem müsstest Du dann auf jeden Fall die verschiedenen Exceptions unterscheiden
und getrennt behandeln. Du hast quasi den "Fehler" und den "Zahl nicht ok" Fall zusammengefügt.
Wenn Du das noch anpasst und die Länge wie gefordert explizit überprüfst, sieht Deine Variante bis auf den parseInt() eigentlich ziemlich gleich aus.
Trotzdem ist parseInt() natürlich eine gute Idee, aber es bringt ja nichts, seinen Ansatz zu ignorieren nur weil es anders auch geht.

mfG

-- -- muckelzwerg
 
AW: JAVA simpler programmfehler - suche hilfe

Sicher. Und wenn Du weiter nach oben scrollst, findest Du eine Lösung mit Regexp, die noch einfacher ist.
Aber was hat er davon? Willst Du ihm jetzt alle Programme schreiben, wenn seine nicht funktionieren?

Nein, aber sollte jetzt ein kleiner Hilfsansatz sein.

Dazu kommt, dass Du ein paar unsaubere Stellen verwendet hast.
Das implizite Wissen "die Zahl liegt zwischen 100000 und 999999" funktioniert zwar, ist aber nicht unbedingt toll.
Dann sollte das Ganze so auch nicht kompilieren, weil Du zahl zweimal deklariert hast.

ach da ja ok^^

Du verwendest ExceptionCode um einen ganz gewöhnlichen Ablaufpfad zu implementieren, das sollte auch nicht unbedingt sein. Zudem müsstest Du dann auf jeden Fall die verschiedenen Exceptions unterscheiden
und getrennt behandeln. Du hast quasi den "Fehler" und den "Zahl nicht ok" Fall zusammengefügt.

=) OK das sollte man nicht tun

Wenn Du das noch anpasst und die Länge wie gefordert explizit überprüfst, sieht Deine Variante bis auf den parseInt() eigentlich ziemlich gleich aus.
Trotzdem ist parseInt() natürlich eine gute Idee, aber es bringt ja nichts, seinen Ansatz zu ignorieren nur weil es anders auch geht.

mfG

Vlt. war sein Ansatz ja ursprünglich
Int XXX = (Int) StringIdent

Nur weil dann eine Fehlermeldung kam cannot convert vom String to Int oder so etwas hat er dies umgeschrieben, er sagte ja auch das ursprünglich ohne die for - schleife es funktionierte (also komplett ohne Prüfung).
 
Tage später... :)

Also ich wollte nochmal kurz für alle, die hier Interesse bekunden sollten, meine Lösung posten...
Anbei bedanke ich mich für eure Antworten und Erklärungen - TüV und so weiter war nich verkehrt ;)

QC

char pruefen;
int i,zahl;

do
{
zahl=0;
System.out.print("Identnummer :");
identnummer=ein.readLine();
if(identnummer.length()==6) // Festlegung der Bedingung: 6.Stellig
{
for(i=0;i<6;i++)
{
pruefen = identnummer.charAt(i); //Prüfung der einzelnen Eingaben
if(Character.isDigit(pruefen)) //Prüfen auf Ziffer
{
zahl++;
}
else
{
System.out.print("\nEingabe nicht korrekt!\nBitte geben Sie eine 6-stellige Ziffer ein!\n\n");
}
}
}
else
{
System.out.print("\nEingabe nicht korrekt!\nBitte geben Sie eine 6-stellige Ziffer ein!\n\n");
}
}
 
Na da verheimlichst du der Welt aber ein bisschen Quellcode ;)
Es ist übrigens besser, wenn du die code-Funktion des Forums benutzt, um die Einrückungen zu erhalten. So ist das anstrengend zu lesen.
 
Was mir grad ins Auge springt:
"Ziffern" sind einzelne Schriftzeichen.
Da sollte "Zahl" oder vielleicht besser "Nummer" stehen.

-- -- muckelzwerg
 
Zurück
Oben