Input/Output Eine Zahl eingeben mit Ausnahmen

  • Themenstarter Themenstarter Mindblaster
  • Beginndatum Beginndatum
M

Mindblaster

Gast
Hallo, ich muss über die Ferien ein Programm schreiben und bin nun auf ein Problem gestüzt.

In meinem Program soll man eine Zahl größer/gleich 5 eingeben. Wenn man eine kleinere Zahl oder einen Buchstaben eingibt soll das Programm etwas auf der Konsole ausgeben und man soll dann die Möglichkeit haben wieder etwas einzugeben. Dies soll geschehen bis man etwas >= 5 eingibt.

Nun habe ich folgenden Code geschrieben:
Java:
 import java.util.InputMismatchException;
import java.util.Scanner;

public class Gameboard {
	public static void main(String args[]){
		int size = 9;
		Scanner s = new Scanner(System.in);
		do {
			System.out.println("Gib die GrцЯe des Spielbretts an (grцЯer als 5)!");
			try {
				s.nextInt();
			} catch (InputMismatchException e) {
				System.out.println("Gib mal normale Zahl ein!");
				}
			
			} while (!(s.hasNextInt()) || s.nextInt() < 5);
		size = s.nextInt();
		System.out.println(size);
	}
}

Habe keine Ahnung wieso der Zyklus, wenn ich was falsches eingebe mir nicht wieder die Möglichkeit gibt etwas einzutippen...Oder muss ich das mit switch cas machen?
 
Probier mal das:

Java:
public class Gameboard {
   public static void main(String args[]){
	   int size = 0;
	   Scanner s = new Scanner(System.in);
	   do {
		   System.out.println("Gib die Größe des Spielbretts an (größer als 5)!");
		   try {
			   size = s.nextInt();
		   } catch (InputMismatchException e) {
			   System.out.println("Gib mal normale Zahl ein!");
		   }
	   } while (size < 5);
	   System.out.println(size);
   }
}

Pentalon
 
Im catch block muss ein s.next() stehen, da s.nextInt() nichts liest wenn du z.B. Buchstaben anstelle von Zahlen eingibst. s.next() entfernt dann diese Buchstaben aus dem Eingabebuffer.
Du kannst übrigens Umlaute in den Quellcode schreiben. Du musst halt nur aufpassen, dass javac auch die selbe Kodierung verwendet wie dein Editor. z.B. wenn dein Editor im UTF8 Format speichert, rufst du javac so auf "javac -encoding "utf8" Gameboard.java". Desweiteren musst du noch im Code die Kodierung der Windows Konsole angeben (cp850).

Java:
import java.util.InputMismatchException;
import java.util.Scanner;
import java.io.PrintStream;
 
public class Gameboard {
    public static void main(String args[]) {
        try {
            System.setOut(new PrintStream(System.out, true, "cp850"));
        } catch(Exception e) {
            e.printStackTrace();
        }
        int size = 0;
        Scanner s = new Scanner(System.in);
        do {
            System.out.println("Gib die Größe des Spielbretts an (größer als 5)!");
            try {
                size = s.nextInt();
            } catch (InputMismatchException e) {
                size = 0;
                s.next();
                System.out.println("Gib mal normale Zahl ein!");
            }
        } while (size <= 5);
        System.out.println(size);
    }
}
 
Hey, vielen Dank!!! Jetzt hat es geklappt. Übrigens ich habe den ersten try/catch Block weggelassen und es geht trotzdem 🙂

Vielen Dank noch Mal und guten Rutsch!!!
 
Hey Leute, wünsch euch erst Mal ein Frohes Neues.
Hab leider wieder Probleme mit meinem Programm.
Leider habe ich es zuerst voll unstrukturiert geschrieben (alles in der Main Methode).
Nun habe ich versucht alles in separate Methoden aufzuteilen. Dabei kam ich zu einem Problem.
Nun ich habe folgenden Code geschrieben:

[Java]
import java.util.Scanner;
import java.util.InputMismatchException;

public class Game {
static Scanner inputSize = new Scanner(System.in);
static Scanner inputXCord = new Scanner(System.in);
static Scanner inputYCord = new Scanner(System.in);
static int size;
public static void main(String[] args) {
createEmptyBoard();

}

public static int inputNewSize() {
do {
System.out.println("Gib als Ziffer die Größe des Spielbretts an (mindestens 5)!");
try {
size = inputSize.nextInt();
if (size < 5) {
System.out.println("Die Spiel hat " + (size) + " Felder. Das ist zu wenig");
} else {
System.out.println("Die Spiel hat " + (size) + " Felder.");
}
} catch (InputMismatchException e) {
size = 0;
inputSize.next();
}
} while (size < 5);
return size;
}

public static void createEmptyBoard() {
int [][] board = new int[inputNewSize()][inputNewSize()];
for (int i = 0; i < inputNewSize(); i++){
for (int j = 0; j < inputNewSize(); j++) {
board[j] = 0;
}
}
System.out.println(board[1][2]);
}
}
[/Java]

Nun mein Problem ist jetzt, dass es egal ist, wasich für Scanner inputSize eingebe, ich werde nochmal gefragt einen Wert einzugeben. Auch wenn ich einen Wert größer als 5 eingegeben habe.
Habe keine Ahnung wieso das so passiert 🙁
 
Hey Leute, wünsch euch erst Mal ein Frohes Neues.
Hab leider wieder Probleme mit meinem Programm.
Leider habe ich es zuerst voll unstrukturiert geschrieben (alles in der Main Methode).
Nun habe ich versucht alles in separate Methoden aufzuteilen. Dabei kam ich zu einem Problem.
Nun ich habe folgenden Code geschrieben:

[Java]
import java.util.Scanner;
import java.util.InputMismatchException;

public class Game {
static Scanner inputSize = new Scanner(System.in);
static Scanner inputXCord = new Scanner(System.in);
static Scanner inputYCord = new Scanner(System.in);
static int size;
public static void main(String[] args) {
createEmptyBoard();

}

public static int inputNewSize() {
do {
System.out.println("Gib als Ziffer die Größe des Spielbretts an (mindestens 5)!");
try {
size = inputSize.nextInt();
if (size < 5) {
System.out.println("Die Spiel hat " + (size) + " Felder. Das ist zu wenig");
} else {
System.out.println("Die Spiel hat " + (size) + " Felder.");
}
} catch (InputMismatchException e) {
size = 0;
inputSize.next();
}
} while (size < 5);
return size;
}

public static void createEmptyBoard() {
int [][] board = new int[inputNewSize()][inputNewSize()];
for (int i = 0; i < inputNewSize(); i++){
for (int j = 0; j < inputNewSize(); j++) {
board[j] = 0;
}
}
System.out.println(board[1][2]);
}
}
[/Java]

Nun mein Problem ist jetzt, dass es egal ist, wasich für Scanner inputSize eingebe, ich werde nochmal gefragt einen Wert einzugeben. Auch wenn ich einen Wert größer als 5 eingegeben habe.
Habe keine Ahnung wieso das so passiert 🙁

Im Grunde will ich einfach einen Array erstellen, dessen Größe von dem Benutzer bestimmt werden soll.
Dieser Array soll dann in jedem Feld zuerst 0 sein.
 
[...]
[Java]
[...]
static Scanner inputSize = new Scanner(System.in);
static Scanner inputXCord = new Scanner(System.in);
static Scanner inputYCord = new Scanner(System.in);
[...]
[/Java]
[...]

Das ist höchst :exclaim: :question: :exclaim: unperformant. 😵
Java:
// wenn dann schon 
static Scanner input = new Scanner(System.in);
// obwohl Scanner für Einsteiger sowieso viel zu Mächtig sein soll.

String wayne = input.next();
int x = input.nextInt();

------------------

[JAVA=26]inputSize.next();[/code]

Du "holst" dir zwar eine Zahl so "herein" die wird aber nirgendswo abgespeichert :bloed: ( Smiley ist nicht böse gemeint. Ich finde den einfach nur total cool 😀 )
 
Zuletzt bearbeitet von einem Moderator:
Das ist höchst :exclaim: :question: :exclaim: unperformant. 😵
Java:
// wenn dann schon 
static Scanner input = new Scanner(System.in);
// obwohl Scanner für Einsteiger sowieso viel zu Mächtig sein soll.

String wayne = input.next();
int x = input.nextInt();

------------------

[JAVA=26]inputSize.next();[/code]

Du "holst" dir zwar eine Zahl so "herein" die wird aber nirgendswo abgespeichert :bloed: ( Smiley ist nicht böse gemeint. Ich finde den einfach nur total cool 😀 )

Ok, wenn ich richtig verstehe, dann brauche ich für alle Eingaben nur einen Scanner?
 
Ok, wenn ich richtig verstehe, dann brauche ich für alle Eingaben nur einen Scanner?

Es geht auch mit einem BufferedReader:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author hütte
 */
public class ZahlSuchen {

    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static int nächsteZahl(int von, int bis) throws IOException {
        while (true) {
            try {
                System.out.printf("Zahl zwischen %d und %d eingeben: ", von, bis);
                int z = Integer.parseInt(reader.readLine());
                if (z < von || z > bis) {
                    System.out.printf("%d zu klein oder zu groß.%n", z);
                } else {
                    return z;
                }
            } catch (NumberFormatException nfe) {
                System.out.println(nfe);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        boolean[] bolArr = new boolean[(int) (Math.random() * 101.0)];
        int versuche = 0;
        int fehler = 0;
        int zahl;
        while ((zahl = nächsteZahl(0, 100)) != bolArr.length & ++versuche == versuche) {
            if (zahl < bolArr.length) {
                System.out.println("Eingabe kleiner als gesuchte Zahl.");
                if (bolArr[zahl]) {
                    System.out.printf("Eingabe bereits eingegeben. %d Fehler.%n", fehler);
                    fehler++;
                } else {
                    bolArr[zahl] = true;
                }
            } else {
                System.out.println("Eingabe größer als gesuchte Zahl.");
            }
        }
        System.out.println("Richtige Eingabe: " + zahl);
        System.out.println("Versuche        : " + versuche);
        System.out.println("Fehler          : " + fehler);
    }
}

Die Länge des Arrays (zwischen 0 und 100) muss erraten werden. Die Versuche werden mitgezählt. Liegt eine Eingabe unter der Arraylänge und wurde sie bereits gemacht, wird ein Fehler berechnet.

Die while-Schleife ist umständlich formuliert.

Aber ich würde die Logik nicht aus der Main auslagern bei diesem kurzen Programm. 🙂
 

Zurück
Oben