Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen

Der Grütz

Neues Mitglied
Hallo zusammen,

ich bin gerade dabei über das Buch "Programmieren lernen mit Java" von Hans Peter Habelitz Java zu lernen.
Dabei bin ich noch recht am Anfang bei if else Verzweigungen. Die Lektion wird mit Übungsaufgaben abgeschlossen, wobei ich bei einer ein Verständnisproblem habe. Um genau zu sein, habe ich die Aufgabe gelöst und das Programm funktioniert auch, doch es scheint so, als ob ich deutlich zu kompliziert gedacht habe. Der Code in der Lösung zur Aufgabe ist deutlich weniger komplex. Ich verstehe jedoch nicht wie dieser funktionieren kann, denn mir erscheint das zu einfach, bzw. sieht es für mich so aus, als ob nicht alle Fälle korrekt abgedeckt sind.

Die Aufgabe lautet, man soll ein Programm erstellen, in das man eine Jahrezahl eingibt, worauf das Programm prüft, ob es ein Schaltjahr ist und dies entsprechend ausgibt. Dabei ist zu beachten, dass ein Schaltjahr durch 4 teilbar ist. Außer es ist gleichzeitig auch durch 100 teilbar, dann ist es kein Schaltjahr. Es sei denn die Jahreszahl ist gleichzeitig durch 400 teilbar, dann ist es ein Schaltjahr. Hier einmal mein Code, wie ich das gelöst hatte:

[CODE lang="java" title="Schaltjahr"]import javax.swing.JOptionPane;

public class Schaltjahr {
public static void main (String[] args) {

var jahr = JOptionPane.showInputDialog(null,
"Bitte gib eine Jahreszahl ein: ");
var jahrParsed = Integer.parseInt(jahr);
var teilbar4 = jahrParsed % 4;
var teilbar100 = jahrParsed % 100;
var teilbar4u100 = teilbar4 + teilbar100;
var teilbar400 = jahrParsed % 400;

if (teilbar4 == 0) {
if (!(teilbar4u100 == 0)) {
JOptionPane.showMessageDialog(null,
"Das Jahr "+jahr+" ist ein Schaltjahr!");
} else {
if ((teilbar4 == 0) && (teilbar100 == 0) && (teilbar400 == 0)) {
JOptionPane.showMessageDialog(null,
"Das Jahr "+jahr+" ist ein Schaltjahr!");
} else {
JOptionPane.showMessageDialog(null,
"Das Jahr "+jahr+" ist kein Schaltjahr!");
}
}
} else {
JOptionPane.showMessageDialog(null,
"Das Jahr "+jahr+" ist kein Schaltjahr!");
}
}
}[/CODE]

Hier wie es im Buch gelöst wurde:

[CODE lang="java" title="Lösung"]var jahr = Integer.parseInt(JOptionPane
.showInputDialog("Geben Sie eine Jahreszahl ein:"));
if ((jahr % 400) == 0) {
JOptionPane.showMessageDialog(null, "Das Jahr " + jahr
+ " ist ein Schaltjahr!");
} else {
if ((jahr % 100) == 0) {
JOptionPane.showMessageDialog(null, "Das Jahr " + jahr
+ " ist kein Schaltjahr!");
} else {
if ((jahr % 4) == 0) {
JOptionPane.showMessageDialog(null, "Das Jahr " + jahr
+ " ist ein Schaltjahr!");
} else {
JOptionPane.showMessageDialog(null, "Das Jahr " + jahr
+ " ist kein Schaltjahr!");
}
}[/CODE]

Dass ich das mit den Variablen etwas umständlich gelöst habe ist soweit klar. Was ich nicht verstehe sind die if abfragen, bzw. die Ausdrücke die hier abgeprüft werden. Ich habe das Gefühl, dass das so wie es im Buch gelöst wurde nicht hinhauen kann, oder ich habe einen totalen Denkfehler.

Vielleicht kann mir jemand auf die Sprünge helfen, wo ich hier gedanklich falsch abgebogen bin, bzw. mir erklären, warum die Lösung aus dem Buch funktioniert.

Viele Grüße
Chris
 
Ohne mir jetzt Deinen Code näher angesehen zu haben: teilbar4u100 ist überflüssig, denn wenn eine Zahl durch 100 teilbar ist, dann ist sie erst recht durch vier teilbar. Aus dem Grund ist die Reihenfolge im Buch auch gut gewählt.

Wenn eine Zahl durch 400 teilbar ist, dann erst recht durch 100 und durch vier. Also macht es Sinn, zuerst auf Teilbarkeit durch 400 zu prüfen, denn dann ist in jedem Fall ein Schaltjahr gegeben.

Ansonsten ist die Zahl nicht durch 400 teilbar und es kann sich nur um ein Schaltjahr handeln, wenn das Jahr durch vier aber nicht durch 100 teilbar ist.

Weil eine Zahl, die durch 100 teilbar ist, erst recht durch vier teilbar ist, macht es wieder Sinn, diesen Fall zuerst abzuprüfen. Ist die Zahl nämlich durch 100 teilbar, steht sofort fest, dass es kein Schaltjahr ist.

Ansonsten ist die Zahl weder durch 400 noch durch 100 teilbar. Übrig bleibt also nur noch zu prüfen, ob die Zahl durch 4 teilbar ist.

Würde man die Reihenfolge umdrehen, würde zuerst geprüft werden, ob die Zahl durch vier teilbar ist. Das sagt aber noch nichts darüber aus, ob sie nicht auch durch 100 oder 400 teilbar ist. Der Code wird dann etwas unschöner:
Java:
if (jahr % 4 == 0) {
    // dann kann es sich überhaupt nur um ein Schaltjahr handeln.
    if (jahr % 100 == 0) { 
        // dann kann es sich möglicherweise nicht um ein Schaltjahr handeln
        if (jahr % 400 == 0) {
            // ok, es ist ein Schaltjahr
            System.out.println(jahr + " ist Schaltjahr");
        } else { 
            // es ist doch kein Schaltjahr
            System.out.println(jahr + " ist kein Schaltjahr");
        }
    } else { 
        // es muss sich um ein Schaltjahr handeln, da jahr nicht durch 100 und damit auch nicht durch 400 teilbar ist
        System.out.println(jahr + " ist ein Schaltjahr");
    }
} else {
    // da das Jahr nicht durch 4 teilbar ist, kann es kein Schaltjahr sein.
    System.out.println(jahr + " ist kein Schaltjahr");
}
 
Danke, ich habe meinen Denkfehler erkannt. Und zwar habe ich im Kopf jeden Fall für sich geprüft, statt zu überlegen ob wie Du sagst die Jahreszahl, wenn sie durch 100 teilbar ist, automatisch auch durch 4 teilbar ist. Da habe ich vor lauter Bäumen den Wald nicht mehr gesehen.

Danke Dir für Deine ausführlich Antwort und Deine Mühe!

LG
Chris
 

Zurück
Oben