Freitag der 13. ()
Schreibe ein Prgramm, mit dem alle Freitage einer beliebigen Zeitspanne aufgezeigt werden, die auf einen 13. fielen.
2 Kommentare
19 Lösung(en)
- python
- python
- cpp
- csharp
- java
- csharp
- python
- javascript
- abap
- csharp
- vb
- csharp
- cpp
- cpp
- cpp
- cpp
- csharp
- vb
- c
import datetime
import time
anzahl = 0
jahr_anfang = int(input("Von: "))
jahr_ende = int(input("Bis: "))
tag = 13
for jahr in range(jahr_anfang, jahr_ende):
for monat in range(1,13):
if datetime.date(jahr, monat, tag).weekday() ==4:
if int(time.strftime("%Y"))>jahr-1:
print("In {0} war der {1}.{2} ein Freitag".format(jahr, tag, monat))
else:
print("In {0} wird der {1}.{2} ein Freitag sein.".format(jahr, tag, monat))
anzahl+=1
print("Insgesamt gab es von {0} bis {1} {2} Freitag den 13.".format(jahr_anfang, jahr_ende, anzahl))
Lösung von: Py Thon ()
import datetime as d
def freitag(date1,date2):
temp=[]
tempDay=date1
delta=(date2 - date1).days
if delta < 0:
print "Das spaete Datum ist vor dem fruehen!"
for i in range(delta):
if tempDay.day==13 and tempDay.weekday()==4:
temp.append(tempDay.isoformat())
tempDay=tempDay + d.timedelta(days=1)
return temp
erstesDatum=d.date(1597,1,1)
zweitesDatum=d.date(1600,12,31)
if freitag(erstesDatum , zweitesDatum) == []:
print "Es liegen keine schwarzen Freitage zwischen " + erstesDatum.isoformat() + " und " + zweitesDatum.isoformat()
else:
print "Zwischen " + erstesDatum.isoformat() + " und " + zweitesDatum.isoformat() + "liegen folgende schwarze Freitage "
print freitag(erstesDatum , zweitesDatum)
Lösung von: Uwe Hernandez Acosta (TU Dresden)
#include <stdio.h>
#include <conio.h>
class Datum
{
public:
int tag, monat, jahr;
void ausgabe()
{
printf("%d.%d.%d\n", tag, monat, jahr);
}
bool schaltjahr()
{
bool b = false;
if(jahr % 4 == 0) b = true;
if(jahr % 100 == 0) b = false;
if(jahr % 400 == 0) b = true;
return b;
}
void inkrementiere()
{
if(monat == 12 || monat == 10 || monat == 8 || monat == 7 || monat == 5 || monat == 3 || monat == 1)
{
if(tag == 31)
{
tag = 1;
if(monat != 12)
{
monat = monat + 1;
return;
}
else
{
monat = 1;
jahr = jahr+1;
return;
}
}
}
if(monat == 11 || monat == 9 || monat == 6 || monat == 4)
{
if(tag == 30)
{
tag = 1;
monat = monat + 1;
return;
}
}
if(monat == 2 && schaltjahr())
{
if(tag == 29)
{
tag = 1;
monat = monat + 1;
return;
}
}
if(monat == 2 && !schaltjahr())
{
if(tag == 28)
{
monat = monat + 1;
tag = 1;
return;
}
}
tag = tag + 1;
}
unsigned long anzahlTage()
{
//Alle Tage addieren bis zum jeweiligen Jahr
unsigned long long tage = (jahr-1584)*365;
int anzahlSchaltjahre = 0;
//Schalttage hinzuaddieren
Datum i;
for(i.jahr = 1584; i.jahr <= jahr; i.jahr++)
if(i.schaltjahr()) anzahlSchaltjahre++;
tage = tage + anzahlSchaltjahre;
if(schaltjahr() && monat <= 2)tage--; //eins abziehen, falls dies ein schaltjahr ist
//Alle Tage addieren bis zum jeweiligen Monat
switch (monat)
{
case 12: tage += 30; // kein break: alle nachfolgenden
case 11: tage += 31; // Anweisungen werden ausgeführt(addiert)
case 10: tage += 30;
case 9: tage += 31;
case 8: tage += 31;
case 7: tage += 30;
case 6: tage += 31;
case 5: tage += 30;
case 4: tage += 31;
case 3: tage += 28;
case 2: tage += 31;
}
//Restliche Tage addieren
tage = tage + tag;
return tage;
}
};
int main()
{
Datum anfang, ende;
anfang.tag = 1; anfang.monat = 1;
ende.tag = 1; ende.monat = 1;
printf("Anfangsjahr: ");
scanf("%d", &anfang.jahr);fflush(stdin);
printf("\n");
printf("Endjahr: ");
scanf("%d", &ende.jahr); fflush(stdin);
printf("\n");
if(anfang.jahr >= ende.jahr || anfang.jahr < 1584)
{
printf("Leider keine korrekte Eingabe!\n");
getch();
return 1;
}
printf("Liste von Freitag, den 13.:\n");
while(anfang.anzahlTage() <= ende.anzahlTage())
{
if(anfang.tag == 13 && (anfang.anzahlTage()%7) == 6)
anfang.ausgabe();
anfang.inkrementiere();
}
getch();
return 0;
}
Lösung von: Christian :) (Hochschule Merseburg)
using System;
namespace friday13th
{
class Program
{
static void Main(string[] args)
{
DateTime beginDate;
DateTime endDate;
readDateFromConsole("Begin", out beginDate);
readDateFromConsole("End", out endDate);
DateTime friday = findNextFriday(beginDate);
while (friday <= endDate)
{
if (friday.Day == 13)
Console.WriteLine("CAUTION: Bad day!: {0}", friday);
friday = friday.AddDays(7);
}
}
static void readDateFromConsole(string type, out DateTime date)
{
do {
Console.WriteLine( type + " date format: DD.MM.YYYY: ");
} while (!DateTime.TryParse(Console.ReadLine(), out date));
}
static DateTime findNextFriday(DateTime date)
{
while (date.DayOfWeek != DayOfWeek.Friday)
{
date = date.AddDays(1);
}
return date;
}
}
}
Lösung von: Lukas -- (-)
package programmierenuebungen;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Scanner;
/**
*
* @author MadDeer
*/
public class findBlackFridays {
private static List<String> fridaysInHistory;
public findBlackFridays(int anfangsJahr, int endJahr) {
this.fridaysInHistory = new ArrayList();
searchForFridays(anfangsJahr, endJahr);
}
private void searchForFridays(int anfangsJahr, int endJahr) {
Calendar date = new GregorianCalendar();
while (anfangsJahr <= endJahr) { //Iterationsschleife ueber die angegebenen Jahre
for (int i = 0; i < 12; i++) { //Iterationsschleife ueber die 12 Monate des Jahres
date.set(anfangsJahr, i, 13); //Zu ueberpruefendes Datum setzen (13.?.?)
if (date.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) { //pruefen, ob der Tag ein Freitag ist
fridaysInHistory.add("Der 13." + (i + 1) + "." + anfangsJahr + " war ein \"Black Friday\""); // (i+1), weil Calendar ab Index 0 zu zaehlen beginnt
}
}
anfangsJahr++;
}
}
public static void main(String[] args) {
//Benutzereingabe holen
Scanner scanner = new Scanner(System.in);
System.out.print("Anfangsjahr: ");
int anfangsJahr = Integer.parseInt(scanner.nextLine());
System.out.println("Endjahr: ");
int endJahr = Integer.parseInt(scanner.nextLine());
//Benutzereingabe korrekt?
if (anfangsJahr < endJahr) {
//Freitage finden
new findBlackFridays(anfangsJahr, endJahr);
//Ausgeben
for (String datum : fridaysInHistory) {
System.out.println(datum);
}
} else {
System.err.println("Falsche Angaben!!");
}
}
}
Lösung von: Mad Deer (FH Ulm)
private string frd13th(DateTime von, DateTime bis){
// von/bis z.B. aus DateTimePicker
string Result = "";
for(; von < bis; von = von.AddDays(1)) {
if(von.Day == 13 && (von.DayOfWeek == DayOfWeek.Tuesday)) {
Result = Result + von.ToString() + "\n";
}
}
return Result;
}
Lösung von: Kurt Cobain ()
import datetime, time
from datetime import date
def friday13():
#Inputs
firstdate = datetime.date(2012, 04, 23)
seconddate = datetime.date(2018, 06, 28)
#-------------------------------------------------------------------------------
dates = []
friday13th = []
delta = datetime.timedelta(days=1)
while firstdate <= seconddate:
dates.append(firstdate.strftime('%Y-%m-%d-%A'))
firstdate += delta
for date in dates:
if '-13-Friday' in date:
friday13th.append(date)
print friday13th
if __name__ == '__main__':
friday13()
Lösung von: Herbert Müller (Hauptschule)
// eingabemaske // <input="date"> ist leider noch nicht überall soweit
document.write(
'<input id="start" value="1.1.1597" onchange="calculate()">' +
' Startdatum<br>' +
'<input id="end" value="31.12.1603" onchange="calculate()">' +
' Enddatum<br>' +
'<p id="out"></p>'
);
// die eigentliche funktion
function findFri13s(start, end) {
var fri13s = [];
// nächsten freitag suchen
while (start.getDay() != 5)
start.setDate(start.getDate() + 1);
// folgende freitage prüfen
while (start <= end) {
if ((start.getDay() == 5) && (start.getDate() == 13))
fri13s.push(new Date(start));
start.setDate(start.getDate() + 7);
}
return fri13s;
}
// eingabe und verwertung;
// (im grunde alles schiere umformung für die eigentliche funktion)
function calculate() {
var start = document.getElementById("start").value.split(".").reverse(),
end = document.getElementById("end").value.split(".").reverse(),
out = document.getElementById("out"),
monthsDe = ("Jänner Februar März April Mai Juni Juli August September " +
"Oktober November Dezember").split(" "),
i = 0;
out.innerHTML = "";
// datumsumformung für verarbeitung
for (i; i <= 2; i++) {
start[i] = parseInt(start[i]);
end[i] = parseInt(end[i]);
}
start = new Date(start[0], start[1]--, start[2]);
end = new Date(end[0], end[1]--, end[2]);
// aufruf der eigentlichen funktion
var list = findFri13s(start, end);
// verarbeitung der rückgabewerte
for (i = 0; i < list.length; i++) {
var d = new Date(list[i]);
out.innerHTML += ("<b>Fr. 13.</b> " + monthsDe[d.getMonth()] + " " +
d.getFullYear() + "<br>");
}
}
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
REPORT zfreitag_der_13te.
PARAMETERS: pa_von TYPE d,
pa_bis TYPE d DEFAULT sy-datum.
DATA: lv_tag TYPE p,
lv_dat TYPE d,
lv_jahr TYPE string,
lv_help TYPE string,
lv_freitage TYPE i VALUE 0,
lv_monat TYPE string.
lv_help = pa_von.
SHIFT lv_help LEFT BY 6 PLACES.
* Startdatum wird um einen Tag erhöht, bis man zum nächsten 13ten angelangt.
WHILE lv_help NE 13.
pa_von = pa_von + 1.
lv_help = pa_von.
SHIFT lv_help LEFT BY 6 PLACES.
ENDWHILE.
lv_dat = pa_von.
WHILE lv_dat <= pa_bis. " Solange das Berechnungsdatum kleiner ist als das Enddatum
CALL FUNCTION 'DAY_IN_WEEK' " Gibt Wochentag als Zahl aus. Freitag = 5
EXPORTING
datum = lv_dat
IMPORTING
wotnr = lv_tag.
IF lv_tag = 5. " falls Freitag
lv_jahr = lv_dat(4). " in der Berechnung aktuelles Jahr
lv_monat = lv_dat. " in der Berechnung aktueller Monat
SHIFT lv_monat LEFT BY 4 PLACES.
WRITE: / 'Der 13.' NO-GAP,
lv_monat(2) NO-GAP,
'.' NO-GAP,
lv_jahr NO-GAP,
' ist ein Freitag der 13te!'.
ADD 1 TO lv_freitage. " Freitag der 13te Counter
ENDIF.
CALL FUNCTION 'RE_ADD_MONTH_TO_DATE' " Berechnungsdatum wird um einen Monat erhöht.
EXPORTING
months = 1
olddate = lv_dat
IMPORTING
newdate = lv_dat.
ENDWHILE.
* Falls keine Freitage auf einen 13ten fallen.
IF lv_freitage = 0.
WRITE: / 'Keinen Freitag den 13ten gefunden.'.
ENDIF.
Lösung von: Alexander S. (msg systems)
// NET Core 3.x
using System;
using System.Collections.Generic;
namespace CS_MDL_CORE_Freitag_13
{
class Program
{
static void Main(string[] args)
{
var s = new DateTime(2018, 1, 1);
var e = new DateTime(2020, 12, 31);
Friday_13th(s, e).ForEach(x => Console.WriteLine(x.ToShortDateString()));
}
static public List<DateTime> Friday_13th(DateTime startDate, DateTime endDate)
{
// erster Freitag ab Startdatum => schnellere Schleife (Faktor 6)
var friday = startDate.AddDays(5 * Math.Sign((int)startDate.DayOfWeek) - (int)startDate.DayOfWeek);
var lst = new List<DateTime>();
while (friday <= endDate)
{
if (friday.Day == 13) lst.Add(friday);
friday = friday.AddDays(7);
}
return lst;
}
}
}
Lösung von: Jens Kelm (@JKooP)
// VBA-Funktion für Excel
Public Function Friday_13th(startDate As Date, endDate As Date) As Variant
Dim friday As Date
Dim arr() As Date
Dim i As Long
friday = startDate + (5 * Sgn(CInt(Weekday(startDate, vbMonday))) - CInt(Weekday(startDate, vbMonday)))
Do While friday <= endDate
If Day(friday) = 13 Then
ReDim Preserve arr(i)
arr(i) = friday
i = i + 1
End If
friday = friday + 7
Loop
Friday_13th = arr
End Function
Lösung von: Jens Kelm (@JKooP)
// Achtung: F#
open System
let friday13 startDate endDate =
let mutable lst = []
let sd : DateTime = startDate
let mutable friday = sd.AddDays((5 * sign((sd.DayOfWeek |> int)) - (sd.DayOfWeek |> int)) |> float)
while friday <= endDate do
if friday.Day = 13 then lst <- [friday.ToString "dd.MM.yyyy"] |> List.append(lst)
friday <- friday.AddDays(7)
lst
let s = DateTime(2018, 1, 1)
let e = DateTime(2020, 12, 31)
printfn "%A" (friday13 s e)
Lösung von: Jens Kelm (@JKooP)
// C++ 20
#include <iostream>
#include <vector>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
std::vector<date> get_fridays_13th(date begin, date end) {
const auto sgn = []<typename T>(T val) { return (T(0) < val) - (val < T(0)); }; // C++ 20!
std::vector<date>dates{};
constexpr days add_seven{ 7 };
const days first_day{ 5 * (sgn(begin.day_of_week().as_number()) ) - begin.day_of_week().as_number() };
begin += first_day;
while (begin < end) {
if (begin.day() == 13) dates.push_back(begin);
begin += add_seven;
}
return dates;
}
int main() {
const auto dates{ get_fridays_13th({ 2018, 1, 1 }, { 2022, 12, 31 }) };
date_facet* f(new date_facet("%d.%m.%Y"));
std::cout.imbue(std::locale(std::cout.getloc(), f));
for (const auto& d : dates)
std::cout << d << "\n";
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
// mit Bormitteln ohne 'boost'
#include <iostream>
#include <chrono>
using namespace std::chrono;
using ymwd = year_month_weekday;
using ymd = year_month_day;
constexpr auto get_fridays_13(const ymwd& begin_, const ymwd& end_) {
constexpr day day_13{ 13 };
const auto end{ sys_days{ end_ } };
auto begin = sys_days{ begin_ };
std::vector<ymd>out;
while (begin <= end) {
ymd dat{ begin };
if (dat.day() == day_13)
out.push_back(dat);
begin += days(7);
}
return out;
}
int main() {
constexpr auto begin{ Friday[1]/1/1597 };
constexpr auto end{ Friday[4]/12/1603 };
const auto fridays{ get_fridays_13(begin, end) };
for(const auto& fri : fridays)
std::cout << fri << '\n';
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
#include <iostream>
#include <chrono>
using namespace std::chrono;
using ymwd = year_month_weekday;
using ymd = year_month_day;
constexpr auto get_fridays_13(const ymd& begin_, const ymd& end_) {
const ymwd ymwd_begin{ Friday[1] / begin_.month() / begin_.year()};
const auto sd_end{ sys_days{ end_} };
auto sd_begin = sys_days{ ymwd_begin };
std::vector<ymd>out;
while (sd_begin <= sd_end) {
ymd ymd_date{ sd_begin };
if (ymd_date.day() == day{ 13 })
out.push_back(ymd_date);
sd_begin += days(7);
}
return out;
}
int main() {
constexpr ymd begin{ 2018y / 1 / 1 };
constexpr ymd end{ 2023y / 12 / 31 };
for (const auto& fri : get_fridays_13(begin, end))
std::cout << fri << '\n';
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
// extrem schnell, da nur die 2. Freitage im Monat geprüft werden
#include <iostream>
#include <chrono>
using namespace std::chrono;
constexpr auto get_fridays_13(int begin_, int end_) {
std::vector<year_month_day>out;
for (auto y{ begin_}; y <= end_; ++y) {
for (auto m{ 1 }; m <= 12; ++m) {
const year_month_weekday ymwd{ Friday[2] / m / y };
const year_month_day ymd{ ymwd };
if (ymd.day() == day{ 13 })
out.push_back(ymd);
}
}
return out;
}
int main() {
for (const auto& fri : get_fridays_13(1980, 2030))
std::cout << fri << '\n';
}
Lösung von: Jens Kelm (@JKooP)
// NET 7.x | C# 11.x | VS-2022
static IEnumerable<DateTime> Fridays_13th(int begin, int end) {
for (int y = begin; y <= end; y++) {
for (int m = 1; m <= 12; m++) {
var dt = new DateTime(y, m, 13);
if(dt.DayOfWeek == DayOfWeek.Friday)
yield return dt;
}
}
}
Fridays_13th(1980, 2030).ToList().ForEach(x => Console.WriteLine(x.ToShortDateString()));
Lösung von: Jens Kelm (@JKooP)
' VBA-Funktion
Public Function Friday_13th(begin_ As Integer, end_ As Integer) As Variant
Dim arr() As Date, ds As Date
Dim y As Integer, m As Integer, i As Integer
For y = begin_ To end_
For m = 1 To 12
ds = DateSerial(y, m, 13)
If Weekday(ds) = 6 Then
ReDim Preserve arr(i)
arr(i) = ds
i = i + 1
End If
Next m
Next y
Friday_13th = arr
End Function
Sub Main()
For Each fri In Friday_13th(2018, 2023)
Debug.Print fri
Next
End Sub
Lösung von: Jens Kelm (@JKooP)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int get_weekday(int year, int month, int day){
struct tm time_;
time_.tm_year = year - 1900;
time_.tm_mon = month - 1;
time_.tm_mday = day;
time_.tm_hour = 0;
time_.tm_min = 0;
time_.tm_sec = 1;
time_.tm_isdst = -1;
mktime(&time_);
return time_.tm_wday;
};
void get_fridays_13(int begin, int end) {
for (int y = begin; y <= end; ++y)
for (int m = 1; m <= 12; ++m)
if (get_weekday(y, m, 13) == 5)
printf("%02d.%02d.%04d\n", 13, m, y);
}
int main() {
get_fridays_13(2018, 2024);
return 0;
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
In 1597 war der 13.6 ein Freitag
In 1598 war der 13.2 ein Freitag
In 1598 war der 13.3 ein Freitag
In 1598 war der 13.11 ein Freitag
In 1599 war der 13.8 ein Freitag
In 1600 war der 13.10 ein Freitag
In 1601 war der 13.4 ein Freitag
In 1601 war der 13.7 ein Freitag
In 1602 war der 13.9 ein Freitag
In 1602 war der 13.12 ein Freitag
In 1603 war der 13.6 ein Freitag
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (2)