Unknwon Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 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 Zitieren
Amstelchen Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 GregorianCalendar deckt dati von 4716 BC bis 5000000 AD ab. sei dir ehrlich - 987 millionen jahre in der zukunft interessiert doch keinen, ob ein freitag auf einen 13. fiel s'Amstel Zitieren
Unknwon Geschrieben 14. Juni 2008 Autor Geschrieben 14. Juni 2008 naja..der prof will das schon ....mir wärs ja egal! aber trotzdem danke Zitieren
shinuma Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 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] Zitieren
shinuma Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 Hm, er ist doch nicht ganz korrekt. Ich weiß zur Zeit nicht an was es liegt. Manche Jahre stimmen, manche sind falsch... Zitieren
geloescht_Newlukai Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 BTW: Meines Wissens wiederholt sich der Kalender alle 400 Jahre. Zitieren
shinuma Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 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 Zitieren
Unknwon Geschrieben 14. Juni 2008 Autor Geschrieben 14. Juni 2008 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 . Mal schaun ob ichs irgendwie hinbekomme. Aber danke für euer Interesse und den Posts. Wer Ideen hat, bitte noch melden . gruß unknwon Zitieren
geloescht_Newlukai Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 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. Zitieren
Cobinja Geschrieben 16. Juni 2008 Geschrieben 16. Juni 2008 (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 16. Juni 2008 von Cobinja Zitieren
Unknwon Geschrieben 18. Juni 2008 Autor Geschrieben 18. Juni 2008 habs gelöst. Anstatt GregorianCalender hab ich Calender genutzt! Damit hats dann funktioniert! gruß und danke Zitieren
Empfohlene Beiträge
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.