Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Servus,

bin dabei Java zu lernen. Nun war die Aufgabe gestellt (im Studium) über eine Eingabe einer Jahreszahl die Freitage auszugeben, die in diesem eingegebenen Jahr auf einem 13ten fallen. Wie man es letztendlich löst ist einem frei überlassen. Hier mal mein Code:

******************************************

import java.util.GregorianCalendar;

import java.util.Date;

import java.text.DateFormat;

import javax.swing.*;

public class Calendar{

public static void main(String[] args) {

String Eingabe = JOptionPane.showInputDialog("Bitte Jahreszahl eingeben:");

int Jahr= Integer.parseInt(Eingabe);

System.out.println(Jahr);

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

// Erstellen der Gregorischen Kalenders

GregorianCalendar cal = new GregorianCalendar();

// Setzt den Kalender auf eingegebenes Jahr

cal.set(GregorianCalendar.YEAR, Jahr);

cal.set(GregorianCalendar.WEEK_OF_YEAR,1);

// Setzt den Kalender immer auf Freitag

cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);

// Nächster Freitag immer 7 tage zusätzlich

for (int i = 0; i<=52;i++) {

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

//Überprüfen ob Monatstag ein 13ter ist

if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) {

System.out.println(dateFormat.format(cal.getTime()));

}

}

}

}

******************************************

Hab aber noch so einige Probleme. Und zwar wenn ich das Jahr 987654321 Teste, bekomm ich was ganz falsches raus:

Samstag, 13. November 181450053

Bei größeren Jahreszahlen bekomm wird irgendwas falsch berechnet. Liegt das an dem Gregorian Calendar? Weiss jmd wie groß der in Java werden kann? Oder bin ich mit der Lösung absolut auf dem Holzweg??!?!

Für Tipps wäre ich dankbar!

gruß

unknwon

Geschrieben

Hallo,

habs mal unabhängig der Programmiersprache in PHP geschrieben. Nach meinen Prüfungen funktioniert das Programm. 987654321 ist allerdings zu hoch, keine Ahnung mit welchem Kalender man das überprüfen kann...

<?
function is_schaltjahr($jahr){
if(($jahr % 400) == 0 || (($jahr % 4) == 0 && ($jahr % 100) != 0))
return true;
else
return false;
}

function getDay($erg,$j)
{

$monate = array(0,31,28,31,30,31,30,31,31,30,31,30,31);

if(is_schaltjahr($j)==true)
{
$monate[2] = 29;
//echo "schaltjahr";
}

$temp=0;
for($i=0;$i<=12;$i++)
{
$temp=$monate[$i]+$temp;
$treffer = $temp +13;

if($treffer==$erg)
{
//echo "treffer = $treffer ";
//echo $monate[$i];
return $i;
}
}

return -1;
}


$j = $_GET['jahr'];

echo "Jahr: $j <br> ";

for($d=1;$d<=366;$d++)
{


// Formel von http://www-user.tu-chemnitz.de/~pester/Lehre/fortran/Wochentag.pdf
$temp = $d + 105 + ( (5 * $j - 1 - (($j-1)/100) * 100) / 4 ) + (($j-1)/400) - 2 * (($j-1)/100) ;
$erg = $temp % 7;



if($erg==2)
{
//echo "$d <br>";

$monat = getDay($d,$j)+1;
if($monat > 0 )
{

echo "<font color=green> <b>Treffer Monat $monat </b></font><br>";
}
}
}

echo "fertig";
?>[/PHP]

Geschrieben

Habe es nochmal überarbeitet und eine andere Quelle herbeigezogen.

Sollte nun funktionieren :)

Allerdings auch nicht bis 181450053

function is_schaltjahr($jahr){
if(($jahr % 400) == 0 || (($jahr % 4) == 0 && ($jahr % 100) != 0))
return true;
else
return false;
}

$monate = array(0,0,3,3,6,1,4,6,2,5,0,3,5);

$jahr = $_GET['jahr'];

for($i=0;$i<=12;$i++)
{
$anz_jahre = $jahr - 1900;
$anz_schalt = $anz_jahre / 4;
$versatz = $anz_jahre + $anz_schalt;

$monat = $monate[$i];

$tag = 12;
//12 // 13-1 =12

$temp = $versatz + $monat + $tag;
if(is_schaltjahr($jahr) == true && ( $i == 2 || $i ==1))
{
$temp--;
}
$erg = $temp % 7;

if($erg==4)
{

echo "<b> Monat:</b> $i <br>";
}
}[/PHP]

Mathematischer Zusammenhang von Kalender - Berechnung der Wochentage im Kopf

Geschrieben

bei mir scheinen auch nur die "kleineren" Jahre korrekt zu funktionieren.Aber der Prof will unbedingt große Jahre testen. Zum Beispiel die letzte Zahl im Integer bereich und so. N paar meiner Kommilitonen haben das mit nem 100-Zeiler gelöst...wollt halt n bisschen fauler sein :P. Mal schaun ob ichs irgendwie hinbekomme.

Aber danke für euer Interesse und den Posts. Wer Ideen hat, bitte noch melden ;).

gruß

unknwon

Geschrieben

Da sich der gregorianische Kalender wie schon erwähnt alle 400 Jahre wiederholt, würde ich die eingegebene Zahl vorab mit %400 herunterbrechen. Da bliebe nur die Frage, ob die Jahre 0-399 tatsächlich auch eine Periode des Kalenders darstellen. Falls nicht, müßte man noch das "Startjahr" dazuaddieren.

Dann hättest Du zumindest das Jahr in einem angenehmen Rahmen.

Geschrieben (bearbeitet)

Ich hätte da noch einen ganz anderen Lösungsansatz:

Berechne nach der Gaußschen Osterformel das Datum vom Ostersonntag. Damit hast du ein Datum und einen Wochentag. Mit diesem, dessen Unterschied zum 13. des entsprechenden Monats und den Monatsversätzen der Wochentage aus Shinumas Link kannst du dann weiterrechnen.

Das ist zwar "von hinten durch die Brust ins Auge", müsste aber für jedes Jahr klappen, da die Gaußsche Formel nicht auf einen Zeitraum begrenzt ist, sondern ausnahmslos für alle Jahre gilt (außer der Vatikan ändert die Vorraussetzungen fürs Datum).

Bearbeitet von Cobinja

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...