Eingabe von Ganzen Zahlen oder Strings mit BufferedReader

Feal

Mitglied
Hi Forum,

Es geht um Folgende Aufgabe:

Ich soll ein Programm entwerfen, dass

a) Ne Ganze Zahl und ein Monat (Auch Ganze Zahl - Bspw.: 2) bekommt und dann ausgibt um welchen Monat es sich handelt und wieviel Tage der Monat hat. Wir sollen lediglich bei Februar aufpassen, dass der Monat nicht 31 Tage hat. Das habe ich in folgendem Code bereits erledigt.

Java:
import java.io.*;

public class b5_aufgabe2altern {
  public static void main (String[] args){
    try{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Geben Sie das Jahr an: ");
    String jahr = reader.readLine();
    int intjahr = (int)Integer.parseInt(jahr);

    System.out.println("Geben Sie den Monat an: ");
    String monat = reader.readLine();
    int intmonat = (int)Integer.parseInt(monat);



    int Monatsausgabe = 31;

        switch (intmonat) {

        case 2: Monatsausgabe = 28;
        break;
        }

    System.out.println("Das Jahr " + intjahr);
    System.out.println("Der Monat " + intmonat + " hat " + Monatsausgabe + " Tage.");

    }catch(Exception e){e.printStackTrace();}
  }
}

b) Erweitern Sie Ihr Programm so, dass der Monat statt als ganze Zahl auch über seinen Namen eingegeben werden kann.

Hier treten meine Probleme auf. Ich kann ja Februar nicht irgendwie in Int casten. Ausserdem bekomme ich eine NumberFormatException wegen ParseInt, was ich für mein Hauptprogramm aber benötige.

Ich bin mir nicht sicher, wie ich vorgehen soll.

Lg,
 
Mensch, warum schreibt jeden Tagebucheinträge und keine Fragen...
Ja, du kannst nicht "Februar" zu Int casten und ja, du bekommst eine Exception wenn du es versuchst. Und nein, du brauchst es nicht an dieser Stelle in dem Hauptprogramm.
 
Mach dir ne HashMap<String, Integer> und hol dir den Monat mit get("Monat")

Soweit sind wir noch nicht. Wir sollen es wohl eher "einfacher" lösen.

Kann ich nicht einfach hingehen, und ne If-Verzweigung machen:

Wenn Monat = Zahl von 1-12 dann mach int intmonat = (int)Integer.parseInt(monat);
Ansonsten Wenn Monat = Februar oder Januar oder...

switch anweisung (Monat)

case februar: Monatsangabe = 28;
break;

Irgendwie so ?
 
Switch kannst du nicht mit Strings vergleichen. Aber du kannst ja mit if-abfragen, was eingegeben wurde.
Code:
wenn eingabe 'januar' ist, dann monat = 1
wenn eingabe 'februar' ist, dann monat =2
...
 
Switch kannst du nicht mit Strings vergleichen. Aber du kannst ja mit if-abfragen, was eingegeben wurde.
Code:
wenn eingabe 'januar' ist, dann monat = 1
wenn eingabe 'februar' ist, dann monat =2
...

Sollen aber beide Methoden, also die Eingabe 2 sowie auch bspw Dezember, möglich sein.

Lg
 
Dann bau dir eine Methode
Code:
boolean isNumber(String s)
um zu überprüfen, ob es sich bei der Eingabe um eine Zahl oder ein Wort handelt. Noch besser wäre es, wenn du zusätzlich auch die eingabe>zahl-Methode komplett auslagerst.
 
An dieser Stelle XHelp, danke ich dir schonmal für deine Hilfe. Sei mir nich Böse, aber ich werde nun erstmal ins Bett gehen und darüber schlafen, war ein langer Tag.

Morgen gehts weiter!

Lg,
 
aus langweile. ich würd die Aufgabe so in der Art lösen:

Java:
import java.math.BigInteger;
import java.io.*;
import java.util.*;

public class Test {

	public static void main (String[] args) throws IOException {
		BufferedReader bisr = new BufferedReader(new InputStreamReader(System.in));
		String[] months = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
		Map<String, Integer> map = new HashMap<String, Integer>();
		for (int i = 0; i < 12; i++)
			map.put(months[i], i+1);

		Integer year = null;
		while (year == null) {
			System.out.print("Geben Sie das Jahr an (z.B. 2011)> ");
			String input = bisr.readLine();
			if (isInteger(input)) {
				year = Integer.parseInt(input);
			} else {
				System.out.println("Die Eingabe war keine Zahl");
			}
		}
		Integer month = null;
		while (month == null) {
			System.out.print("Geben Sie das Monat an (z.B. 1 oder Januar)> ");
			String input = bisr.readLine();
			month = map.get(input);
			if (month == null) {
				if (isInteger(input)) {
					month = Integer.parseInt(input);
				} else {
					System.out.println("Die Eingabe war kein gültiger Monat");
				}
			}
		}

		System.out.println("Der Monat " + months[month-1] + " im Jahr " + year + " hat " + getDays(month, year) + " Tage.");
	}

	private static int getDays(int month, int year) {
		if (month == 2 && isLeapYear(year))
			return 28;	
		return month == 2 ? 29 : month % 2 == 0 ? 30 : 31;
	}
	
	private static boolean isLeapYear(int year) {
		return year % 400 == 0 || (year % 100 != 0 && year % 4 == 0);
	}
	
	private static boolean isInteger(String s) {
		return s.matches("[0-9]+") && new BigInteger(String.valueOf(Integer.MAX_VALUE)).compareTo(new BigInteger(s)) > 0;
	}
}

Allerdings keine Garantie auf Richtigkeit 😉

edit: machte imho keinen Sinn eine readInt o.ä. auszulagern, weil ja einmal der Monat als String gelesen werden soll. Ansonsten sind so "Dauerschleifen-bis-richtige-Eingabe-kommt" eh immer sehr hässlich zu schreiben ..

edit2: für minusjahre müsste man eben die isInteger noch mit Integer.MIN_VALUE erweitern aber die Frage ist, ob das überhaupt Sinn macht.
 
Zuletzt bearbeitet:

Zurück
Oben