Hilfe! Programm für Wochentag

Lil:Offseet

Grünschnabel
Ich bräuchte ein Programm das diese Unterpunkte bearbeitet
Ich danke schon mal für jede Antwort.

Implementieren Sie ein Java-Programm, das für einen Tag (1..31), den Monat (1..12) und das Jahr den zugehörigen Wochentag bestimmt und auf dem Bildschirm ausgibt. Eingelesen werden soll das Datum in folgendem Format dd.mm.yyyy und NICHT als drei getrennte Eingaben.
 

Yaslaw

n/a
Moderator
Liest sich nach einer Hausaufgabe. Die musst du selber machen.
Beginn mal, wir können dir bei gezielten Fragen helfen.
 

Lil:Offseet

Grünschnabel
Liest sich nach einer Hausaufgabe. Die musst du selber machen.
Beginn mal, wir können dir bei gezielten Fragen helfen.
das habe ich daweil finde aber keine Lösung für das
Eingelesen werden soll das Datum in folgendem Format dd.mm.yyyy und NICHT als drei getrennte Eingaben.

Java:
import javax.swing.JOptionPane;
public class Datum{
      public static void main (String[] args){
       
        String t,m,j, ausgabe;
        int tag,monat,jahr;
        //jh steht für das Jahrhundert, d.h. die vorderen zwei Ziffern der Jahreszahl
        //ja steht für das Jahr im Jahrhundert, d.h. die beiden letzten Ziffern der Jahreszahl
        int jh, ja;
       
        t = JOptionPane.showInputDialog("Geben Sie den Tag ein:");
        m = JOptionPane.showInputDialog("Geben Sie den Monat als Zahl ein:");
        j = JOptionPane.showInputDialog("Geben Sie das Jahr ein. Es muss zwischen 1900 und 2099 liegen:");
         
        tag = Integer.parseInt(t);
        monat = Integer.parseInt(m);
        jahr = Integer.parseInt(j);
       
        //Abfrage, ob Datum korrekt eingegeben wurde
        if(tag < 1 || tag > 31 || monat< 1 || monat > 12 || jahr < 1900 || jahr > 2099){
            JOptionPane.showMessageDialog(null,"Sie haben ein falsches Datum eingegeben.\nStarten Sie das Programm neu.\nTschuess");
            System.exit(0);
        }
       
       
        jh = jahr/100;
        ja = jahr%100;
       
       
        //Monat ist Januar oder Februar
        if ((monat == 1) || (monat == 2)){
       
            monat = monat +9;
            ja--;
        }
        else
            monat = monat -3;
           
        //Berechnung
        tag = ((146097*jh)/4+(1461*ja)/4+(153*monat+2)/5+tag+1721119)%7;
       
        //Nr. des Tages legt den Wochentag fest, gelöst durch if
        ausgabe = "";
       
        if (tag == 0)
            ausgabe = "Montag";
           
        if (tag == 1)
            ausgabe = "Dienstag";
       
        if (tag == 2)
            ausgabe = "Mittwoch";
           
        if (tag == 3)
            ausgabe = "Donnerstag";
       
        if (tag == 4)
            ausgabe = "Freitag";
           
        if (tag == 5)
            ausgabe = "Samstag";
           
        if (tag == 6)
            ausgabe = "Sonntag";
         
        JOptionPane.showMessageDialog(null,"Der "+t+"."+m+"."+j+" ist ein "+ausgabe+".");
         
     }
     
}
 
Zuletzt bearbeitet von einem Moderator:

Zvoni

Erfahrenes Mitglied
Autsch!
Und dann gebe ich mal den 30. Februar ein.... lt. deinem Code wäre das eine zulässige Eingabe....
 

vfl_freak

Premium-User
Eingelesen werden soll das Datum in folgendem Format dd.mm.yyyy und NICHT als drei getrennte Eingaben.
warum machst Du es dann in drei Eingaben ??

Versuch mal diesen Codeteil umgangssprchlich zu beschreiben
Java:
//Monat ist Januar oder Februar
        if ((monat == 1) || (monat == 2)){
      
            monat = monat +9;
            ja--;
        }
        else
            monat = monat -3;

Java:
tag = ((146097*jh)/4+(1461*ja)/4+(153*monat+2)/5+tag+1721119)%7;
Vermeide solche magic numbers! Das blickst du doch selbst nicht mehr durch, oder ?? :sneaky:

Java:
if (tag == 0)
            ausgabe = "Montag";
           
if (tag == 1)
            ausgabe = "Dienstag";
       
 if (tag == 2)
            ausgabe = "Mittwoch";
       // usw.
dies schreit geradezu nach IF-ELSE oder gar nach SWITCH-CASE!
Bei Deiner Schreibweise (die durchaus gültig ist) werden immer alle 7 Vergleiche durchgeführt, auch wenn bspw. 'Tag == 0' ist!

VG Klaus
 

Lil:Offseet

Grünschnabel
warum machst Du es dann in drei Eingaben ??

Versuch mal diesen Codeteil umgangssprchlich zu beschreiben
Java:
//Monat ist Januar oder Februar
        if ((monat == 1) || (monat == 2)){
     
            monat = monat +9;
            ja--;
        }
        else
            monat = monat -3;

Java:
tag = ((146097*jh)/4+(1461*ja)/4+(153*monat+2)/5+tag+1721119)%7;
Vermeide solche magic numbers! Das blickst du doch selbst nicht mehr durch, oder ?? :sneaky:

Java:
if (tag == 0)
            ausgabe = "Montag";
          
if (tag == 1)
            ausgabe = "Dienstag";
      
if (tag == 2)
            ausgabe = "Mittwoch";
       // usw.
dies schreit geradezu nach IF-ELSE oder gar nach SWITCH-CASE!
Bei Deiner Schreibweise (die durchaus gültig ist) werden immer alle 7 Vergleiche durchgeführt, auch wenn bspw. 'Tag == 0' ist!

VG Klaus
ich hab das mit else if ausgebessert vielen dank
ich mache es mit drei getrennten eingaben weil ich sonst nicht drauf komme
tag = ((146097*jh)/4+(1461*ja)/4+(153*monat+2)/5+tag+1721119)%7; das hab ich verwendet weil ich sonst keine alternative gefunden habe
 

Zvoni

Erfahrenes Mitglied
Unabhängig von der verwendeten Programmiersprache würde ich wie folgt vorgehen:
1) Lese das Datum als eine Eingabe ein (wie in der Aufgabenstellung gefordert)
2) prüfen, ob es ein gültiges Datum ist (ich würde mal nach einer "IsDate"-Funktion suchen)
3) Falls gültiges Datum, wandle das Datum in EpochDays um --> Damit bekommt man die Anzahl Tage seit 01.01.1970
4) mache EpochDays modulo 7

zu Java: Wieso benutzt du nicht die integrierten Bibliotheken? Stichwort: java.time
 

Lil:Offseet

Grünschnabel
Unabhängig von der verwendeten Programmiersprache würde ich wie folgt vorgehen:
1) Lese das Datum als eine Eingabe ein (wie in der Aufgabenstellung gefordert)
2) prüfen, ob es ein gültiges Datum ist (ich würde mal nach einer "IsDate"-Funktion suchen)
3) Falls gültiges Datum, wandle das Datum in EpochDays um --> Damit bekommt man die Anzahl Tage seit 01.01.1970
4) mache EpochDays modulo 7

zu Java: Wieso benutzt du nicht die integrierten Bibliotheken? Stichwort: java.time
ich bin ja hier weil ich nicht auf die Nummer 1 komme
 

Zvoni

Erfahrenes Mitglied
Hä?
Wo liegt das Problem beim ShowInputDialog ein "11.02.2021" einzugeben?
Du musst nur einen String anstatt einem int als Variable deklarieren um das Ergebnis aufzunehmen
 

MausTipTop100

Grünschnabel
Ich würde die Eingabe wie folgt machen.
Zuerst würde ich mir den String holen.

Es gibt eine Methode in der String Klasse, die sich split nennt.
Ein Beispiel:
Java:
String str = ... // Datum im String
String[] splitted = str.split("."); // Splitte den String bei '.'

Dann kannst du dir deine Werte aus diesem Array holen.

Java:
int d = Integer.parseInt(splitted[0]);
int m = Integer.parseInt(splitted[1]);
int y = Integer.parseInt(splitted[2]);


Alternativ kannst du auch die Klasse SimpleDateFormat benutzen.

Java:
String str = ... // Datum im String
String pattern = "dd.MM.yyyy"; // Vorlage zur Eingabe des Datums

SimpleDateFormat format = new SimpleDateFormat(pattern);

Date date = null;
try {
     date = format.parse(str); // Speichere dein Datum in einer Date Instanz ab
} catch(ParseException e) {
     e.printStackTrace();
}
Calendar calendar = Calendar.getInstance(); // Hole dir eine Kalender Instanz
calendar.setTime(date); // Setze das Datum deines Kalenders

int d = calendar.get(Calendar.DAY_OF_MONTH); // Tag
int m = calendar.get(Calendar.MONTH) + 1; // Monat (+1, weil Januar '0' ist)
int y = calendar.get(Calendar.YEAR); // Jahr

Übrigens kannst du die Calendar Klasse sehr einfach zum Lösen deiner Aufgabe benutzen.
Mit freundlichen Grüßen,
MausTipTop100!
 
Zuletzt bearbeitet:

Neue Beiträge