Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Freitag der 13. ()

Schreibe ein Prgramm, mit dem alle Freitage einer beliebigen Zeitspanne aufgezeigt werden, die auf einen 13. fielen.

2 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (2)

python 17. Februar 2014 16:37   reply report
Stimmt - ich hatte auch nur eine beliebige Sequenz aus meiner Antwortliste herauskopiert.
christian 9. Februar 2014 14:12   reply report
In der Checksumme fehlt noch der 13.12.1602

18 Lösung(en)

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)

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.5
Schwierigkeit: Leicht
Webcode: qju5-xpiy
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen