logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obliczanie dnia tygodnia dla daty 15 maja - algorytm nie działa poprawnie

dr.master 27 Maj 2007 21:43 1422 8
REKLAMA
  • #1 3927099
    dr.master
    Poziom 39  
    Posty: 5144
    Pomógł: 517
    Ocena: 925
    Witam, mam problem ze stosunkowo prostym algorytmem

    "Obliczanie dni tygodnia danej daty
    dane dε[1,31] dzień, mε[1,12] miesiąc, rε[1901,2099] rok
    wynik : tε[0,6] { 0- niedziela, ... , 6-sobota}

    {czytaj (d,m,r)

    n <- 6+d+(r-1900)+(r-1900)/4
    case (m) of
    4,7 : ;
    1,10 : n++;
    5 : n<-n+2;
    8 : n<-n+3;
    2,3,11 : n<-n+4
    6 : n<-n+5;
    9,12 : n<-n+6;
    end
    if (((r%4)=0)Λ(m<3)) then n:=n-1;
    t :=n%7;
    wypisz(t)
    }"

    udało mi się obliczyć dzień dzisiejszy

    27 5 2007
    ==>> 6+27+107+26=166 +2 => 168
    dalej 168/7 =>24 reszta=0 => niedziela

    ale już np 15 maja nie chce mi wyjść ;/
    wychodzi 166:7=> 23,7 :cry:
  • REKLAMA
  • #2 3927537
    Quarz
    Poziom 43  
    Posty: 14357
    Pomógł: 1646
    Ocena: 629
    Witam,
    nie bardzo wiem w jakim języku wysokiego poziomu zapisałeś powyższy algorym, ale tu masz błąd: n <- 6+d+(r-1900)+(r-1900)/4, ponieważ, czego domyślam się, wartość n powinna być liczbą całkowitą, a z tego podstawienia wynika, iż taką być nie musi.

    W tego typu obliczeniach przyjmuje się dzień odniesienia (dla którego znany jest dzień tygodnia) i odlicza się do siedmiu całkowitą ilość razy plus reszta, w górę, lub w dół, pamiętając o latach przestępnych, oraz o układzie kalendarza i zmiennej ilości dni w różnych miesiącach roku.
    Liczyłem to ponad dwadzieścia lat temu na popularnej wtedy Spectrum'nie... :D
    W załączniku jest podobny program (którego nie trzeba instalować) służący do tego celu.

    Pozdrawiam
    Załączniki:
    • wieczny kalendarz.zip (142.46 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #4 3927971
    Quarz
    Poziom 43  
    Posty: 14357
    Pomógł: 1646
    Ocena: 629
    Witam,
    dr.master napisał:
    miało być
    n= 6+d+(r-1900)+(r-1900)/4

    ale to nadal nie musi dawać w wyniku liczby całkowitej ze względu na składnik: (r-1900)/4 ... sprawdź sobie "na pieszo".

    Pozdrawiam
  • #6 3929050
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 692
    Sprawdź uwzględnianie roku przestępnego:


    1. Sprawdzasz podzielność roku przez 4 (reszta z dzielenia =0)

    2. Jeżeli jest podzielny przez 4 to MOŻE być przestępny

    ---> robisz drugie sprawdzenie
    --------> podzielny przez 100 -> zwykły
    --------> podzielny przez 400 -> przestępny

    W roku przestępnym dzień jest dodawany w lutym.
  • REKLAMA
  • REKLAMA
  • #8 3930326
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Podajesz juz gotowy program a nie podajesz założeń (pewnie z jakiejś literatury), więc nie wiadomo czy algorytm jest zły (nie sądzę) czy robisz błąd w programie. Podaj to pierwsze , może da się coś zrobić.
    Ja posiadam algorytm wyliczania dnia tygodnia danej daty, ale data może byc dowolna (nie jak u ciebie w zakresie) więc i algorytm jest deczko bardziej rozbudowany.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z algorytmem obliczania dnia tygodnia dla podanej daty (15 maja), który nie działa poprawnie. Algorytm bazuje na wzorze: n = 6 + d + (r-1900) + (r-1900)/4 z korektami zależnymi od miesiąca oraz uwzględnieniem lat przestępnych. Problemem jest fakt, że wyrażenie (r-1900)/4 może zwracać wartość niecałkowitą, co powoduje błędne wyniki. Wskazano konieczność stosowania dzielenia całkowitego lub zaokrąglania oraz poprawnego uwzględniania lat przestępnych według reguł: rok podzielny przez 4, ale nie przez 100, chyba że podzielny przez 400. Dyskusja podkreśla, że algorytm wymaga precyzyjnego określenia założeń i poprawnej implementacji, zwłaszcza w zakresie obsługi lat przestępnych i zmiennej liczby dni w miesiącach. Wspomniano również, że algorytm może działać dla dat nieprzestępnych, ale wymaga korekt, aby działał poprawnie dla całego zakresu lat 1901-2099.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA