# Programmierung eines Geburtstagskalenders - Problem bei der Eingabe der Daten



## Juliaantonia_ (29. Okt 2014)

Hallo!  

Ich sitze gerade wieder einmal bei meiner Softawareentwicklungshausübung und soll einen Geburtstagskalender programmieren, welcher später dann durch eingabe des Geburtstages den Wochentag des heuriegen Geburtstages ausgibt. 

In meiner Angabe steht, dass das Monat und der Tag als "M or MM"  und "D or DD" eingelesen werden kann. Also 02.01.1995 oder 1.2.1995 (beides erlaubt) 

Ich bin mir jetzt nicht sicher, wie ich das programmiere, dass ich beide Eingabeformen erlauben kann. 
Ich habe jetzt mal eine Variante probiert, bin mir aber nicht sicher, ob diese erlaubt und richtig ist, bzw. treten bei mir bei 08 und 09 Fehler auf. (The literal 08 of type int is out of range) 
Wie kann ich diese Fehler ausbessern? 


```
public class Birthdaycalendar {

		public static void main(String[]args)
	{
		System.out.print("Enter your birth year (YYYY):");
		short y = Input.readShort();					
		System.out.print("Enter your birth month (M or MM, 0..12):");
		byte m = Input.readByte();  
		System.out.print("Enter your birth day (D or DD, 0..31):"); 
		byte d = Input.readByte(); 
		
		if (y<=1582 || y>=2014) { 
				System.out.print("Invalid year"); }
		else if (m>12 ||m<01) { 
				System.out.print("Invalid month");}
	
		else if (m==1 || m==01 || m==03 || m==3 || m==5 || m==05 || m==7|| m==07
				|| m==8 || m==08 || m==10 || m==12 && d>=0 && d<=30)
				{ System.out.print("Invalid numder of days for this month!");
				}
		
		else if (m==4 || m==04|| m==6 || m==06 || m==9 || m==09 || m==11 && (d>=0 && d>30))
				{System.out.print("Invalid numder of days for this month!");
				}
			
		else if (y%4 == 0 && (y%100 != 0 || y%400 == 0) && m==2|| m==02 && d>=29 && d>=0) 
				{System.out.print("Invalid numder of days for this month!");
				}
		
		else if (y%4 != 0 && (y%100 == 0 || y%400 != 0) && m==2 || m==02 && d>=28 && d>=0) 
				{System.out.print("Invalid numder of days for this month!");
				}
		
		else { System.out.print("Valid Birthdate");
		}
		}
```



Schon mal vielen Dank für euer Bemühen! 
LG Julia


----------



## Joose (29. Okt 2014)

Warum willst du für die Tage und Monate ein Byte einlesen?
Lies einfach einen String ein und parse ihn zu einer Zahl.



Juliaantonia_ hat gesagt.:


> ```
> public class Birthdaycalendar {
> 
> public static void main(String[]args)
> ...



Deine Überprüfungen in den if-Abfrage sind teilweise falsch bzw. unlogisch
siehe: "d>=29 && d>=0"

Auch fehlende Klammern sorgen für falsche Ergebnisse.
siehe:".... m==10 || m==12 && d>=0 && d<=30"
Das && knüpft stärker als das ||


----------



## Juliaantonia_ (29. Okt 2014)

Ich habe byte genommen, da diese ja von -128 bis 127 reichen und die Zahl der Tage bzw. Monate immer in diesem Bereich liegt. Habe das deshalb gemacht, weil mir bei dir letzten Übung punkte abgezogen wurden weil ich int genommen habe obwohl short ausgereicht hättem darum gabe ich jetzt gleich den kleinsten Wertebereich genommen. 

Wie funktioniert das String einlesen und zu einer Zahl zuparsen? (Habe leider noch so gut wie gar keine Programmiererfahrung   ) 


Die Abfrage ist wirklich unnötig, habe sie jetzt ausgebessert. 
Kann man die Eingabe mit dem M==01, m==1 usw. so machen oder gibt es hier auch eine andere Lösung?


Hab die Klammern jetzt ausgebessert: 
	
	
	
	





```
else if ((m==1 || m==01 || m==03 || m==3 || m==5 || m==05 || m==7|| m==07
				|| m==8 || m==08 || m==10 || m==12) && d>=0 && d<=30)
				{ System.out.print("Invalid numder of days for this month!");
				}
		
		else if ((m==4 || m==04|| m==6 || m==06 || m==9 || m==09 || m==11) &&  && d>30)
				{System.out.print("Invalid numder of days for this month!");
				}
			
		else if (y%4 == 0 && (y%100 != 0 || y%400 == 0) && (m==2|| m==02 )&& d>=29) 
				{System.out.print("Invalid numder of days for this month!");
				}
		
		else if (y%4 != 0 && (y%100 == 0 || y%400 != 0) && (m==2 || m==02) && d>=28 ) 
				{System.out.print("Invalid numder of days for this month!");
				}
```


----------



## stg (29. Okt 2014)

Parse doch direkt zu einem Date?


```
String[] dates = {"02.01.1995", "2.01.1995", "02.1.95", "02.1.1995"};
SimpleDateFormat sdf = new SimpleDateFormat("d.M.y");
for (String date : dates) {
    try {
        System.out.println(sdf.format(sdf.parse(date)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
```

Ausgabe:

```
2.1.1995
2.1.1995
2.1.1995
2.1.1995
```


----------

