Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Programm Freitag der 13te

Empfohlene Antworten

Veröffentlicht

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

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

naja..der prof will das schon ;)....mir wärs ja egal!

aber trotzdem danke ;)

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]

Hm, er ist doch nicht ganz korrekt. Ich weiß zur Zeit nicht an was es liegt. Manche Jahre stimmen, manche sind falsch...

BTW: Meines Wissens wiederholt sich der Kalender alle 400 Jahre.

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

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

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.

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

habs gelöst. Anstatt GregorianCalender hab ich Calender genutzt! Damit hats dann funktioniert!

gruß und danke

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.