# Schaltjahr Berechnung



## Wusaa (13. Apr 2007)

Hallo,

habe folgende Aufgabe

Entwickeln Sie ein Programm, welches von einem gegebenen Jahr ermittelt, ob dieses ein Schaltjahr ist oder nicht. 

Eingabe:
Beliebiges Jahr N ab 1583 

Ausgabe:
N ist Schaltjahr oder N ist kein Schaltjahr 

Ich komme blöder Weise nicht mal auf einen ansatz, weil das das erste programm ist das wir "selbst" programmieren sollen. 
Könnte mir bitte jemand weiterhelfen?

MfG


----------



## Leroy42 (13. Apr 2007)

```
boolean istSchaltJahr = jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0)
```


----------



## DP (13. Apr 2007)

```
int jahr = 2007;
System.out.println(new GregorianCalendar().isLeapYear(jahr));
```


----------



## Verjigorm (13. Apr 2007)

Ansatz:

Schaltjahr alle 4 Jahre:


```
if (jahr % 4 == 0)
{...}
else
{...}
```

% <-- Modulo Operator (google hilft  )

Tipp: Nicht jedes "4. Jahr" ist ein Schaltjahr, es gibt da ne Ausnahme 


edit: hapüh, ich war zu langsam


----------



## Leroy42 (13. Apr 2007)

Oder meinen bool'schen Ausdruck umgangssprachlich formuliert.

Ein Jahr ist *genau dann* ein Schaltjahr, wenn
die Jahreszahl durch 4 teilbar ist *und dann* entweder
nicht durch 100 teilbar ist *oder sonst* durch 400 teilbar ist.


----------



## Ariol (13. Apr 2007)

mit modulo

jahr % 4 = 0 -> schaltjahr
jahr % 400 = 0 -> schaltjahr
aber:
jahr % 100 = 0 -> kein schaltjahr


----------



## Leroy42 (13. Apr 2007)

Ariol hat gesagt.:
			
		

> mit modulo
> 
> jahr % 4 = 0 -> schaltjahr
> jahr % 400 = 0 -> schaltjahr
> ...



Und wie codierst du _aber_ Java-technisch?


----------



## Ariol (13. Apr 2007)

geschachtelt wie dus gemacht hast:

```
public boolean istSchaltjahr(int jahr)
{
   if(jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0) return true;
   return false; 
}
```


----------



## Gast (13. Apr 2007)

http://de.wikipedia.org/wiki/Schaltjahr
wikipedia.....sogar mit code...


----------



## Leroy42 (13. Apr 2007)

Bin gerade auf etwas merkwürdiges gestoßen.

Wieso funktioniert

```
for (int j : new int[] {16, 17, 100, 400})
			System.out.printf("%d %s%n", j, j%4==0 && (j/4%25 != 0 || j/4/25%4 == 0));
```

aber nicht

```
for (int j : new int[] {16, 17, 100, 400})
			System.out.printf("%d %s%n", j, j%4==0 && j/4%25 != 0 || j/4/25%4 == 0);
```
(ohne Klammerung des zweiten Teils)

Ich dachte immer && und || haben gleiche Präzedenz und *müssen* immer von
links nach rechts ausgewertet werden..

Was mache/denke ich falsch?  :shock:


----------



## Ariol (13. Apr 2007)

ja, aber durch die klammer wird zuerst das || und dann das && aufgelöst


----------



## Leroy42 (13. Apr 2007)

Ariol hat gesagt.:
			
		

> ja, aber durch die klammer wird zuerst das || und dann das && aufgelöst



Aha!

Die Auswertung erfolgt zwar nach Kurzschluß-Verfahren, aber die
Operatoren sind rechts-assoziativ.

Dann habe ich kurz vorm Wochende doch  noch was gelernt


----------



## Ariol (13. Apr 2007)

Leroy42 hat gesagt.:
			
		

> Ariol hat gesagt.:
> 
> 
> 
> ...



Hmm, wusst ich nicht....

Ich setz immer Klassen so wies sein muss, dann ists auch verständlicher


Hab rausgefunden worans liegt:

Wenn man Integer benutzt ergibt 17/4 = 4

Das ganze ist einfach nur ein Rundungsfehler!
also doch lieber:


```
for (int j : new int[] {16, 17, 100, 400})
System.out.printf("%d %s%n", j, j%4==0 && (j%100 != 0 || j%400 == 0));
```
 
oder

```
for (int j : new int[] {16, 17, 100, 400})
System.out.printf("%d %s%n", j, j%4==0 && j%100 != 0 || j%400 == 0);
```

benutzen


----------



## Leroy42 (13. Apr 2007)

Richtig!

Hat aber nichts mit Rundungsfehler zu tun

Ich wollte  *absichtlich* das _Vorwissen_, daß
die Jahreszahl bereits durch 4 teilbar ist, verwenden.

Im übrigen sind die Operatoren natürlich _rechts_-assoziativ.  

Menno! Bin ich heute blöd oder was:   

Ich meinte *links*-assoziativ


----------



## Ariol (13. Apr 2007)

ja, aber du kannst das Vorwissen nicht nutzen, wenn du das Vorwissen nicht hast.

du kannst natürlich auch double-Werte benutzen (geht das mit Modulo??). Dann gehts, aber auch wieder ohne Vorwissen.


----------



## Guest (16. Apr 2007)

wie lautet denn dann nun der komplette code, sodass ich ihn in eclipse kompilieren und ausführen kann?


----------



## Leroy42 (16. Apr 2007)

Na so wie Ariol ihn gepostet hat:

```
public boolean istSchaltjahr(int jahr) { 
   return jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0); 
}
```


----------



## Guest (16. Apr 2007)

wenn ich den code so eingebe und dann auf Run --> Java Applikation --> Main Class gehe, finde ich bei Main Class keine Class die ich nehmen kann?!


----------



## Leroy42 (16. Apr 2007)

Run ==> Run as ==> Java Application


----------



## Guest (16. Apr 2007)

Run --> Run as  

ist leer, da steht nix drin  :roll: 

und

Run --> Java Applikation 
dann Name eingeben, und unten bei Main Class müsste ich ja was auswählen können, is aber nicht der fall  :autsch: 

???


----------



## Leroy42 (16. Apr 2007)

Als vollständiges Programm:



```
public class Test {
	public static boolean istSchaltjahr(int jahr) {
		return jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0);
	}
	public static void main(String[] args) { 
		for (int i : new int[]  {2000, 2100, 2007, 2008})
			System.out.printf("%d ist %sein Schaltjahr%n", i, istSchaltjahr(i) ? "" : "k");
	}
}
```


----------



## Guest (16. Apr 2007)

kannst du mir bitte mal die Zeile


```
System.out.printf("%d ist %sein Schaltjahr%n", i, istSchaltjahr(i) ? "" : "k");
```

erläutern, ich versteh das mit dem %d und %sein... bzw "k" nicht?!


----------



## Ariol (16. Apr 2007)

hast du überhaupt eine Mainmethode????


----------



## masta // thomas (16. Apr 2007)

Das sind Platzhalter. Schau doch einfach mal in die API...


----------



## schalentier (16. Apr 2007)

```
public class Test {
    public static boolean istSchaltjahr( int jahr ) {
        if( jahr%400 == 0 ) {
            // Jahr ist durch 400 teilbar --> Schaltjahr
            return true;
        } // no else
        if( jahr%4 == 0 ) {
            // Jahr ist durch 4 teilbar --> Schaltjahr
            if( jahr%100 == 0 ) {
                // aber nicht, wenn das jahr auch durch 100 teilbar ist
                return false;
            } else {
                return true;
            }
        } // no else 
        return false;
    }
    
    public static void main(String[] args) {
        int jahre[] = new int[]{ 1600, 1980, 1972, 1720, 1700, 1800 , 2000, 2100, 2007, 2008 };

        for( int jahr : jahre ) {
            if( istSchaltjahr( jahr ) ) {
                System.out.println(jahr + " ist ein Schaltjahr" );
            } else {
                System.out.println(jahr + " ist kein Schaltjahr" );
            }
        }
    }
}
```


Das tut das gleiche wie das andre Programm, nur fuer nen Anfaenger vielleicht etwas einfacher zu verstehen. ;-)


----------

