# Wochentag_Problem



## Lange (10. Nov 2011)

Hallo, für den Heutigen Tag kommt zwar der richtige Tag heraus.

Aber wenn ich z.B den 31.12.2016 in der Zukunft nehme geht es nicht mehr!

Kann mir jemand helfen den Fehler zu finden und auszubessern?


```
public class Wochentag {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int tag = 31, monat = 12, jahr = 2016;
		int tage = tag;
		
		for(int i = 1980; i <= jahr; i++){
			tage += (jahr % 4 == 0 && (jahr % 400 == 0 || jahr % 100 != 0))? 366 : 365;	
		}
		
		switch(monat){
		case 12:
			tage += 30; 
		case 11:
			tage += 31;
		case 10:
			tage += 30;
		case 9:
			tage += 31;
		case 8:
			tage += 31;
		case 7:
			tage += 30;
		case 6:
			tage += 31;
		case 5:
			tage += 30;
		case 4:
			tage += 31;
		case 3:
			tage += (jahr % 4 == 0 && (jahr % 400 == 0 || jahr % 100 != 0))? 29 : 28;
		case 2:
			tage += 31;
		}
		
		System.out.println("Der " + tag + "." + monat + "."+ jahr + " ist ein ");
		
		switch(tage % 7){
		case 0:
			System.out.println("Montag");
		break;
		case 1:
			System.out.println("Dienstag");
		break;
		case 2:
			System.out.println("Mittwoch");
		break;
		case 3:
			System.out.println("Donnerstag");
		break;
		case 4:
			System.out.println("Freitag");
		break;
		case 5:
			System.out.println("Samstag");
		break;
		case 6:
			System.out.println("Sonntag");
		break;
		}
	}
}
```


----------



## SlaterB (10. Nov 2011)

keine Idee, irgendwas selber rauszufinden?
gib doch zumindest auch den errechneten tage-Wert aus,
such dir ein Datum aus an dem es noch geht und dann eins an dem es nicht mehr geht, ok das hast du bereits,
aber jetzt verringere den Abstand so dass du zwei hinteranderligende Tage findest, das geht mit Intervallhalbierung,

Abstand zwischen Tage = 1000 Tage? bei 500 Tagen schauen, auch falsch -> zwischen 1 und 500 schauen, sonst zwischen 500 und 1000,
als nächstes Tag 250 oder 750 als Mitte wähen usw, in spätestens 10 Schritten einen Übergang gefunden

naheliegend ist natürlich, Übergänge zwischen Monaten und Jahren anzuschauen, da wirst du merkwürdige Sprünge der Anzahl Tage feststellen,
kannst du deine eigenen Berechnungen dahingehend nachvollziehen?

noch ein Tipp: fange am besten im Jahr 1980 an, da sollten die Tage klein sein (sind sie aber nicht unbedingt -> erster Hinweis  )


----------



## SlaterB (10. Nov 2011)

ach und noch ein besonder schwierig zu findener Fehler: 
in Zeile 10 prüfst du immer nur ob das Endjahr jahr ein Schaltjahr ist, nicht das Laufjahr i


----------



## nillehammer (10. Nov 2011)

Grundsätzlich hilft es auch, den Gesamtalrorithmus in Teilschritte zu zerlegen und diese in Methoden abzuarbeiten. Das hat folgende Vorteile:
- Das Ergebnis von Methoden kann isoliert getestet werden. So lässt sich ein Fehler besser eingrenzen
- Über den Methodennamen lässt sich der Sinn/das Konzept hinter einem bestimmten Stück Code sichtbar machen und das ohne Kommentare.
- Codeduplizierung wird vermieden.
Das beste Beispiel dafür in Deinem Code ist folgende Zeile:
[Java]
(jahr % 4 == 0 && (jahr % 400 == 0 || jahr % 100 != 0))? 
[/Java]
Man könnte sie refactoren zu:
[Java]
static boolean isSchaltjahr(final int jahr) {
 return jahr % 4 == 0 && (jahr % 400 == 0 || jahr % 100 != 0);
}
[/Java]
- Wenn jetzt irgendwo in Deinem Code der Aufruf isSchaltjahr(2000) steht, weiß jeder, was Du prüfen willst.
- Du kannst die Methode gezielt mit Testdaten aufrufen und bist danach sicher, dass hier kein Fehler steckt.
Gleiches könntest Du auch mit der for-Schleife machen, in der Du die Tage von Jahren aufaddierst und mit dem switch-Statement, mit dem Du die Tage von Monaten aufaddierst.


----------



## Lange (11. Nov 2011)

Danke an alle die mir geholfen haben.

Der fehler lag wirklich daran, dass ich nur das endjahr überpfüft habe ob es ein Schaltjahr ist und nicht die Laufvariable i. Zum anderen geht es nicht bis <= sondern nur bis < da sonst schon 366 tage am. 1.1.1980 dazu gezählt werden würde.

Bei tage = tag ist auch falsch es muss tage += tag; heißen, da es mir sonst die hochgezählten Tagen mit tag einfach überschreibt.

Jetzt funktioniert es einwandfrei.


----------

