Hilfe bei if Funktion (Anfänger)

05/30/2016 16:47 FlareEniX#1
Hallo,

ich bin gerade dabei Java zu lernen und komme bei dieser Übungsaufgabe nicht weiter. Das Programm soll überprüfen ob sich bei der Eingabe um ein Schaltjahr handelt. Für die Überprüfung gilt folgendes:
Ist die Jahreszahl durch 4 teilbar, dann ist es ein Schaltjahr, außer die Jahreszahl ist gleichzeitig auch durch 100teilbar, dann ist das Jahr kein Schaltjahr - es sei denn, die Jahreszahl ist gleichzeitig auch durch 400 teilbar, dann ist es doch wieder ein Schaltjahr

Code:
/* Schaltjahr: Das Programm überprüft ob das eingegebene Jahr
* ein Schaltjahr ist.
*/
import javax.swing.*;
public class Schaltjahr {
public static void main (String[] args) {
double d;
String eingabe;
eingabe = JOptionPane.showInputDialog("Gib das Jahr ein ");
d = Double.parseDouble(eingabe);
if ((d % 4 == 0) & (d % 100 == 0) && (d % 400 = 0) ) {
JOptionPane.showMessageDialog(null,"Es ist ein Schaltjahr");
} else {
if ((d % 4 == 0) & (d % 100 == 0) )) {
JOptionPane.showMessageDialog(null, "Es ist kein Schaltjahr");
}
} else {
if (d % 4 == 0) {
JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
}
}
}
}
Jedoch kann ich das Programm noch nicht starten da folgende Fehler auftreten:

Code:
D:\Java\Programme\JavaUebung03>javac Schaltjahr.java
Schaltjahr.java:16: error: illegal start of expression
if ((d % 4 == 0) & (d % 100 == 0) )) {
^
Schaltjahr.java:19: error: 'else' without 'if'
} else {
^

2 errors
05/30/2016 18:10 minearth#2
Hallo,

du hast in deinem IF-Statement ein & und ein = vergessen (bei d % 400 == 0). Außerdem sind keine zwei else-Statements möglich, ich würde das dann wie folgt als if-else schreiben:

Code:
/* Schaltjahr: Das Programm überprüft ob das eingegebene Jahr
* ein Schaltjahr ist.
*/

import javax.swing.*;

public class Schaltjahr {
    public static void main(String[] args) {
        double d;
        String eingabe;
        eingabe = JOptionPane.showInputDialog("Gib das Jahr ein ");
        d = Double.parseDouble(eingabe);
        if ((d % 4 == 0) && (d % 100 == 0) && (d % 400 == 0)) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
        } else if (d % 4 == 0) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
        } else {
            JOptionPane.showMessageDialog(null, "Es ist kein Schaltjahr");
        }
    }
}
Alternativ kannst du auch auf die JDK-Methode zurückgreifen:

Code:
/* Schaltjahr: Das Programm überprüft ob das eingegebene Jahr
* ein Schaltjahr ist.
*/

import javax.swing.*;
import java.util.GregorianCalendar;

public class Schaltjahr {
    public static void main(String[] args) {
        int d;
        String eingabe;
        eingabe = JOptionPane.showInputDialog("Gib das Jahr ein ");
        d = Integer.parseInt(eingabe);
        GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
        if(cal.isLeapYear(d)) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr!");
        } else {
            JOptionPane.showMessageDialog(null, "Es ist kein Schaltjahr!");
        }
    }
}
06/01/2016 04:15 ComputerBaer#3
Quote:
Originally Posted by minearth View Post
Code:
        if ((d % 4 == 0) && (d % 100 == 0) && (d % 400 == 0)) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
        } else if (d % 4 == 0) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
        } else {
            JOptionPane.showMessageDialog(null, "Es ist kein Schaltjahr");
        }
Da hast du aber etwas falsch gemacht, bei dir sind auch die 100 Jahre ein Schaltjahr. Außerdem ist das Jahr defintiv auch durch 4 und 100 teilbar, wenn die 400 geht, das muss man dann nicht mehr extra prüfen. Ich korrigere das mal und mache es etwas kleiner.

Code:
/* Schaltjahr: Das Programm überprüft ob das eingegebene Jahr
* ein Schaltjahr ist.
*/

import javax.swing.*;

public class Schaltjahr {
    public static void main(String[] args) {
        String eingabe = JOptionPane.showInputDialog("Gib das Jahr ein ");
        double d = Double.parseDouble(eingabe);
        if (d % 400 == 0 || (d % 4 == 0 && d % 100 != 0)) {
            JOptionPane.showMessageDialog(null, "Es ist ein Schaltjahr");
        } else {
            JOptionPane.showMessageDialog(null, "Es ist kein Schaltjahr");
        }
    }
}
06/01/2016 08:54 NotThatBad#4
mal ganz unabhängig von deiner frage, wieso fängst du denn gleich mit gui's an? wär's denn nicht sinnvoller, ganz normale konsolenprogramme zu schreiben, um java richtig zu lernen?
06/01/2016 16:48 minearth#5
Quote:
Originally Posted by ComputerBaer View Post
Da hast du aber etwas falsch gemacht, bei dir sind auch die 100 Jahre ein Schaltjahr. Außerdem ist das Jahr defintiv auch durch 4 und 100 teilbar, wenn die 400 geht, das muss man dann nicht mehr extra prüfen.
Oh, stimmt, hab' nur in aller schnelle den Code umstrukturiert, ohne auf die Logik zu achten, sry
06/01/2016 18:11 algernong#6
Quote:
Originally Posted by NotThatBad View Post
mal ganz unabhängig von deiner frage, wieso fängst du denn gleich mit gui's an? wär's denn nicht sinnvoller, ganz normale konsolenprogramme zu schreiben, um java richtig zu lernen?
Konsoleneingaben sind komplizierter als das, was er verwendet.
06/04/2016 00:58 Achat#7
Quote:
Originally Posted by FlareEniX View Post
Hallo,

ich bin gerade dabei Java zu lernen und komme bei dieser Übungsaufgabe nicht weiter. Das Programm soll überprüfen ob sich bei der Eingabe um ein Schaltjahr handelt.
Wenn du bei so einer Übungsaufgabe nicht eigenständig weiter kommst, dafür einen Thread eröffnen musst, solltest du es lieber gleich lassen. 1 Minute Google hätte die Antwort gebracht.

Mit GUIs anzufangen ist keine gute Idee.

Warum kann man es nicht richtig machen?
Code:
public static void main(String[] args) {
	for(int year = 1900; year < 2020; year++)
		System.out.println(year + " isLeapYear: " + isLeapYear(year));

}

public static boolean isLeapYear(int year) {
	Calendar calendar = Calendar.getInstance();
	calendar.set(Calendar.YEAR, year);
	return calendar.getActualMaximum(Calendar.DAY_OF_YEAR) > 365 ? true : false;
}
Quote:
Originally Posted by FlareEniX View Post
Für die Überprüfung gilt folgendes:
Ist die Jahreszahl durch 4 teilbar, dann ist es ein Schaltjahr, außer die Jahreszahl ist gleichzeitig auch durch 100teilbar, dann ist das Jahr kein Schaltjahr - es sei denn, die Jahreszahl ist gleichzeitig auch durch 400 teilbar, dann ist es doch wieder ein Schaltjahr
Wenn das wirklich so in der Übung vorgegeben ist, es mit Modulo zu machen, für diesen Anwendungsfall, ab in die Tonne mit den Übungen.
In Java gibt es für so ziemlich alles Standardbibliotheken. Mit denen man sich vertraut machen sollte.
06/04/2016 01:51 FlareEniX#8
Quote:
Originally Posted by Achat View Post
Wenn du bei so einer Übungsaufgabe nicht eigenständig weiter kommst, dafür einen Thread eröffnen musst, solltest du es lieber gleich lassen. 1 Minute Google hätte die Antwort gebracht.

Mit GUIs anzufangen ist keine gute Idee.

Warum kann man es nicht richtig machen?
Code:
public static void main(String[] args) {
	for(int year = 1900; year < 2020; year++)
		System.out.println(year + " isLeapYear: " + isLeapYear(year));

}

public static boolean isLeapYear(int year) {
	Calendar calendar = Calendar.getInstance();
	calendar.set(Calendar.YEAR, year);
	return calendar.getActualMaximum(Calendar.DAY_OF_YEAR) > 365 ? true : false;
}


Wenn das wirklich so in der Übung vorgegeben ist, es mit Modulo zu machen, für diesen Anwendungsfall, ab in die Tonne mit den Übungen.
In Java gibt es für so ziemlich alles Standardbibliotheken. Mit denen man sich vertraut machen sollte.
Woher nimmst du dir das recht zu meinen ich soll es dann lassen? Ich habe mich über eine Stunde selber damit beschäftigt und natürlich auch gegoogelt. Aber es ging ja nicht darum einfach eine Anwendung zu schreiben mit der ein Schaltjahr überprüft wird, sondern um die korrekte Verwendung der IF Funktion und ich wollte wissen wieso es bei mir nicht geht, bzw. wo mein Fehler liegt um durch einen "Aha Effekt" zu lernen. Ich brauch sicherlich kein Programm mit dem ich das Schaltjahr berechne.
Wo wir gleich bei Punkt 2 währen. Mag gut sein, dass es in Java Bibliotheken für so was gibt. Aber ist dir vielleicht in den Sinn gekommen, dass gerade das lösen dieser Aufgabe eine gute Übung für eine if Funktion ist? Wenn du dich mit Menschen beschäftigen möchtest die es richtig machen, dann öffne doch in Zukunft keinen Thread bei dem schon Anfänger im Titel steht.

An die ganzen anderen: nochmal herzlichen Dank :)
06/04/2016 02:45 Achat#9
Quote:
Originally Posted by FlareEniX View Post
Woher nimmst du dir das recht zu meinen ich soll es dann lassen?
Aus eigener Erfahrung. Ich hätte damals keinen Thread aufgemacht.
Und daraus:

Quote:
Originally Posted by FlareEniX View Post
Ich habe mich über eine Stunde selber damit beschäftigt und natürlich auch gegoogelt.
[Only registered and activated users can see links. Click Here To Register...].
Bitweiser Operator ist etwas anderes als logischer Vergleich. Eine Stunde war offensichtlich nicht genug.

Quote:
Originally Posted by FlareEniX View Post
um durch einen "Aha Effekt" zu lernen.
Bei zehn Stunden Lösung suchen und Tutorials/Handbücher/Doku lesen, im Vergleich zu einer Stunde, dann die Leute hier mal machen lassen, wo ist der Lerneffekt wohl größer?
Programmieren lernst du nicht über Nacht, nimm dir Zeit.

Quote:
Originally Posted by FlareEniX View Post
Wenn du dich mit Menschen beschäftigen möchtest die es richtig machen, dann öffne doch in Zukunft keinen Thread bei dem schon Anfänger im Titel steht.
Wenn ich dir hier gut zurede, Lösung präsentiere, ist dir nur für den Moment geholfen.
Es bringt dich aber nicht weiter.
Programmieren lernen ist learning-by-doing, lernen durch ausprobieren.
Du brauchst mehr Durchhaltevermögen. Den Willen, das Problem alleine zu lösen.
Egal ob es jetzt 100 Stunden sind. Grundlagen muss man aufbauen. Um auf diesen nachher wiederum aufbauen zu können.
In einer Stunde lerne ich auch nicht Autofahren.


P.S.: Für kleineres gibt es den [Only registered and activated users can see links. Click Here To Register...] ;)
06/04/2016 11:28 KingDingD0ng#10
Quote:
Originally Posted by Achat View Post
Aus eigener Erfahrung. Ich hätte damals keinen Thread aufgemacht.
Und daraus:


[Only registered and activated users can see links. Click Here To Register...].
Bitweiser Operator ist etwas anderes als logischer Vergleich. Eine Stunde war offensichtlich nicht genug.


Bei zehn Stunden Lösung suchen und Tutorials/Handbücher/Doku lesen, im Vergleich zu einer Stunde, dann die Leute hier mal machen lassen, wo ist der Lerneffekt wohl größer?
Programmieren lernst du nicht über Nacht, nimm dir Zeit.


Wenn ich dir hier gut zurede, Lösung präsentiere, ist dir nur für den Moment geholfen.
Es bringt dich aber nicht weiter.
Programmieren lernen ist learning-by-doing, lernen durch ausprobieren.
Du brauchst mehr Durchhaltevermögen. Den Willen, das Problem alleine zu lösen.
Egal ob es jetzt 100 Stunden sind. Grundlagen muss man aufbauen. Um auf diesen nachher wiederum aufbauen zu können.
In einer Stunde lerne ich auch nicht Autofahren.


P.S.: Für kleineres gibt es den [Only registered and activated users can see links. Click Here To Register...] ;)

Du (TE) solltest dir das nicht als hate Comment o.ä. einbilden, eher als nett gemeinte Hilfe.
Er hat recht, learning by doing is dabei das aller beste. Selbst wenn du mehrere Stunden oder sogar Tage davor sitzt.
Stell dir mal vor ein Fullstack Developer hat ein Problem und weiß nichtmehr weiter. Was macht er? Googlen, debuggen, testen, lernen.

Wenn du wirklich "gut" werden willst oder in der Branche mithalten willst darfst du NIEMALS(!) aufhören zu lernen.

#nohate

Greetz