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

Der Grütz

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:

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!");
        }
    }
}

Hier wie es im Buch gelöst wurde:

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!");
        }
        }

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
 
mihe7

mihe7

Top Contributor
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");
}
 
Der Grütz

Der Grütz

Neues Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10
I Verständnisfrage zum Thema APIs Java Basics - Anfänger-Themen 6
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
hdi kleine Verständnisfrage lokale + Member Variable Java Basics - Anfänger-Themen 10
G [Verständnisfrage] flush() und close() Java Basics - Anfänger-Themen 6
A Verständnisfrage Sekunden/Tage Umrechnung Java Basics - Anfänger-Themen 3
hdi Verständnisfrage zu Zuweisung + Post-Inkrement Java Basics - Anfänger-Themen 3
hdi Verständnisfrage Java Basics - Anfänger-Themen 7
7 Java Interface - Verständnisfrage Java Basics - Anfänger-Themen 7
hdi Verständnisfrage: von main() ins Nirvana? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben