# Datum-Programm NextDay



## Anfänger22 (16. Mrz 2011)

Schreiben Sie ein Java-Programm (Klasse NextDay), welches durch Eingabe des Tages, des Monats und des Jahres das Datum des nächsten Tages berechnet und ausgibt. Dazu ist es notwendig, dass Sie eine Klasse Date mit den Attributen Tag, Monat und Jahr de nieren. Es soll möglich sein ein Objekt dieser Klasse durch einen Konstruktor mit genau diesen Parametern (Tag, Monat, Jahr) zu erzeugen. Die Klasse Date soll die Methode public Date getNextDay() besitzen, die ein neues Objekt der Klasse Date zurückgibt, das den nächsten Tag im Kalender repräsentiert. Überlegen Sie welche weiteren (evtl. privaten) Methoden zur Berechnung des Folgetages benötigt werden. Achtung, berücksichtigen Sie die folgenden Punkte:

    * Ein Jahr ist ein Schaltjahr, wenn es durch 4 aber nicht zugleich durch 100 teilbar ist. Ist das Jahr durch 400 teilbar, ist es aber wieder ein Schaltjahr.

    * Das Ausgangsdatum soll durch Kommandozeilenargumente übergeben werden. Programmstart von der Konsole (Die ersten 3 Kommandozeilenargumente sollen für den Tag, den Monat und das Jahr verwendet werden):

java NextDay <Tag> <Monat> <Jahr>
Beispielaufruf und -ausgabe:
java NextDay 12 12 2004
Der naechste Tag ist der 13.12.2004.

    * Die Eingabe sollte auch auf Korrektheit geprüft werden! Falls einefehlerhafte Datumskonstellation (z.B. 32 12 2007) eingegeben wurde, soll die Ausnahme InvalidDateArgumentsException geworfen werden. De nieren Sie diese Klasse in geeigneter Form als Subklasse der Klasse java.lang.Exception.

    * Verwenden Sie für die Repräsentation der Monate einen geeigneten Aufzählungstyp (enum).


NUN WIE MUSS ICH DA VORGEHEN....

GregorianCalender oder ähnliches dürfen wir NICHT importieren...

ich weiß, dass wenn es durch 0,100 und 400 teilbar ist, dass es dann ein Schaltjahr ist...

brauche mal ein paar tipps wie ich da vorgehen sollte....

danke schon mal


----------



## Gast2 (16. Mrz 2011)

Mach doch erstmal die offensichtlichen Dinge. Sprich schon mal die Enum für die Monate. Da kannst du auch gleich die Anzahl der Tage pro Montag definieren und ob der Monat "Schaltjahr-Sensitiv" ist, sprich nur der Februar.

Dann guck mal ob du von dem 12 10 auf den 13 10 und vom 31 03 zum 01 04  kommst.


----------



## Murray (16. Mrz 2011)

1. Du addierst 1 zum Tagesdatum
2. Du prüfst, ob das Ergebnis größer ist als die Anzahl der Tage im jeweiligen Monat (hier kommt natürlich das Schaltjahr ins Spiel). 
3. War das neue Tagesdatum nicht zu groß, dann bist du schon fertig.
4. War es aber zu groß, dann setzt du das Tagesdatum auf 1 und erhöhst den Monat um 1
5. Ist der Monat nicht größer als 12, dann bist du fertig.
6. War der Monat größer 12, dann setzte Monat auf 1 und erhöhe das Jahr im 1


----------



## Anfänger22 (16. Mrz 2011)

fassy hat gesagt.:


> Mach doch erstmal die offensichtlichen Dinge. Sprich schon mal die Enum für die Monate. Da kannst du auch gleich die Anzahl der Tage pro Montag definieren und ob der Monat "Schaltjahr-Sensitiv" ist, sprich nur der Februar.
> 
> Dann guck mal ob du von dem 12 10 auf den 13 10 und vom 31 03 zum 01 04  kommst.




wie mache ich das...jedes einzelne Monat einzeln aufzählen

zum bsp 

januar 31
februar 28 && 29
 usw??

kann ich das denn mit case machen?

bitte um einen ansatz


----------



## Murray (16. Mrz 2011)

Inwieweit hier enums helfen, erschließt sich mir noch nicht.

Was du aber brauchst, ist eine Methode, mit der du die Anzahl der Tage in einem Monat ermitteln kannst. Da dabei auch die Frage "Schaltjahr oder nicht?" eingeht, brauchst du auch dazu eine entsprechende Berechnung.


```
private int getDaysInMonth( int month, int year) {
  return ...
}

private boolean isLeapYear( int year) {
   return ....
}
```


----------



## Gast2 (16. Mrz 2011)

Murray hat gesagt.:


> Inwieweit hier enums helfen, erschließt sich mir noch nicht.



Naja, zum Beispiel so:


```
public enum Month {

	JANUARY(31),
	FEBRUARY(28),
	MARCH(31);
	
	private int days;
	
	Month(int days){
		this.days = days;
	}
	
	public int getDays() {
		return days;
	}
	
}
```

Ob das wirklich sinnvoll ist? Nunja...


----------



## Murray (16. Mrz 2011)

fassy hat gesagt.:


> Ob das wirklich sinnvoll ist? Nunja...



Wenn es die Schwierigkeit mit dem Februar, bei dem die Tageszahl eben auch noch vom Jahr abhängt, nicht gäbe, dann vielleicht. Aber wenn man doch irgendwo eine Fallunterscheidung braucht, dann helfen die Enums m.E. eher wenig.


----------



## Anfänger22 (16. Mrz 2011)

ja aber wie soll ich denn bitte vorgehen

kann mir mal jemand schrittweise erklären wie da vorzugehen ist?
danke im voraus


----------



## Murray (16. Mrz 2011)

In der Aufgabenstellung steht doch schon einiges:
1. Klasse Date mit Attributen Tag, Monat, Jahr deklarieren
2. In dieser Klasse einen Konstruktor definieren, der Parameter für diese drei Attribute akzeptiert
3. In der Klasse eine Instanzmethode definieren, die ein neues Date-Objekt für den nächsten Tag liefert.

```
public Date getNextDay() {
   return new Date( ...); //--- wie man hier vorgeht, hatte ich weiter oben schon beschrieben
}
```

Dann soll noch eine main-Methode geschrieben werden, die drei Parameter (Tag,Monat,Jahr) übernimmt, daraus ein Date-Objekt erzeugt, daran die getNextDay()-Methode aufruft und das Ergebnis ausgibt (Tip: für letzteres könnte es sinnvoll sein, in der Klasse date die toString()-Methode entsprechend zu implementieren).

Damit müsstest du doch zumindest einen Ansatz hinbekommen, oder?


----------



## Anfänger22 (16. Mrz 2011)

Murray hat gesagt.:


> In der Aufgabenstellung steht doch schon einiges:
> 1. Klasse Date mit Attributen Tag, Monat, Jahr deklarieren
> 2. In dieser Klasse einen Konstruktor definieren, der Parameter für diese drei Attribute akzeptiert
> 3. In der Klasse eine Instanzmethode definieren, die ein neues Date-Objekt für den nächsten Tag liefert.
> ...



sag mir mal ob das eine gute idee ist =D

attribut tag,monat, jahr erstellen;
tag einlesen;
monat mit switch case auswählen;
jahr einlesen;

jetzt weiß ich nicht wie ich meinem programm sagen soll, wieviele tage ein monat hat...und dass wenn ich um 1 erhöhre, dass er dann zum bsp vom 31.1. auf den 1.2 spring =/


----------



## Murray (16. Mrz 2011)

Geh schrittweise vor:
Schritt 1: Date-Klasse mit den drei Attributen deklarieren
Schritt 2: Konstruktor implementieren, der die drei Attribute initialisiert
Schritt 3: main-Methode implementieren, die Tag, Monat und Jahr als (String!)-Argumente übergeben bekommt, diese in ints wandelt (->Integer.toString()) und daraus ein Date-Objekt erzeugt ( = den in Schritt 2 implementierten Konstruktor aufruft)

Danach kannst du dich damit auseinandersetzen, wie man die getNextDay()-Methode implementieren kann. Erst dann wird interessant, welches Jahr ein Schaltjahr ist und wieviele Tage ein bestimmter Monat hat.


----------



## Gast2 (16. Mrz 2011)

Murray hat gesagt.:


> Wenn es die Schwierigkeit mit dem Februar, bei dem die Tageszahl eben auch noch vom Jahr abhängt, nicht gäbe, dann vielleicht. Aber wenn man doch irgendwo eine Fallunterscheidung braucht, dann helfen die Enums m.E. eher wenig.



Stimmt schon. Aber es ist nunmal Teil der Aufgabe. Das einfach weglassen ist ja auch nicht. Man ja auch beliebige andere Attribute an die Enum hängen (Monatsnummer, Tage im Schaltjahr, Nachfolgemonat, etc....). Ich denke mal deswegen steht da ja auch *ein geeigneter Aufzählungstyp*.


----------



## Murray (16. Mrz 2011)

fassy hat gesagt.:


> Stimmt schon. Aber es ist nunmal Teil der Aufgabe. Das einfach weglassen ist ja auch nicht.


Stimmt, das hatte ich übersehen. Wenn hier ein enum-Typ explizit gefordert wird, dann sollte man das natürlich auch machen.


----------

