Witam serdecznie.
Zaprojektowałem zegar na Atmedze32 z PCF8583. Projekt jest ukończony, wszystko ładnie hula, jednak chciałem dodać ostatni "bajer" i nie wiem jak to zrobić. Chodzi o algorytm, który obliczałby aktualny tydzień roku na podstawie aktualnej daty. Zgodnie z normą ISO8601 pierwszym tygodniem roku jest tydzień, który zawiera większą liczbę dni tygodnia w nowym roku, czyli jeżeli nowy rok rozpoczął się w dniach od poniedziałku do czwartku włącznie to jest to 1 tydzień nowego roku. Jeżeli natomiast pierwszym dniem nowego roku był piątek, sobota lub niedziela, to ten tydzień jest jeszcze 53-cim tygodniem roku poprzedniego a dopiero nadchodzący poniedziałek rozpoczyna pierwszy tydzień nowego roku.
NIGDZIE, powtarzam NIGDZIE w internecie (czyt. google czy różne fora np. z algorytmami) nie ma przedstawionego algorytmu w jakimkolwiek języku, który mógłby to zadanie realizować. Rozwiązania szukam już 3-ci dzień. Są inne rozwiązania ale one tyczą się Windowsa i tam ludzie proponują pobierać po prostu numer tygodnia z kalendarza Windowsa ale ja potrzebuję algorytm, który obliczy mi tydzień roku na Atmedze mając jedynie aktualny dzień roku i aktualny dzień tygodnia.
Napisałem algorytm obliczający dzień roku (dzisiaj jest 282 dzień roku), działa poprawnie, sprawdziłem w wielu przypadkach i w tym roku wylicza poprawnie, tj. pierwszym dniem roku był czwartek, a co za tym idzie jest to już pierwszy tydzień roku. Poniżej wklejam mój kod programu, który powinien obliczać tydzień roku jednak jest on niepoprawny. Jest to już chyba setna wersja tego kodu
Wiem, że jest on niezoptymalizowany i wiele rzeczy niepotrzebnie się powtarza oraz część jest jako komentarze ale nie o to tu chodzi ponieważ jest to pozostałość po tym od czego musiałem zacząć czyli od zera. I jeżeli znajdę odpowiedni algorytm to oczywiście sobie to wszystko poskracam. Jednak nie jestem w stanie wymyślić poprawnie obliczającego algorytmu. Liczę na Wasze podpowiedzi i z góry dziękuję za zainteresowanie, może ktoś z Was już coś takiego robił?
PS. Wd_dec to numer dnia tygodnia dla PCF8583 czyli zakres jest od 0 do 6.
Zaprojektowałem zegar na Atmedze32 z PCF8583. Projekt jest ukończony, wszystko ładnie hula, jednak chciałem dodać ostatni "bajer" i nie wiem jak to zrobić. Chodzi o algorytm, który obliczałby aktualny tydzień roku na podstawie aktualnej daty. Zgodnie z normą ISO8601 pierwszym tygodniem roku jest tydzień, który zawiera większą liczbę dni tygodnia w nowym roku, czyli jeżeli nowy rok rozpoczął się w dniach od poniedziałku do czwartku włącznie to jest to 1 tydzień nowego roku. Jeżeli natomiast pierwszym dniem nowego roku był piątek, sobota lub niedziela, to ten tydzień jest jeszcze 53-cim tygodniem roku poprzedniego a dopiero nadchodzący poniedziałek rozpoczyna pierwszy tydzień nowego roku.
NIGDZIE, powtarzam NIGDZIE w internecie (czyt. google czy różne fora np. z algorytmami) nie ma przedstawionego algorytmu w jakimkolwiek języku, który mógłby to zadanie realizować. Rozwiązania szukam już 3-ci dzień. Są inne rozwiązania ale one tyczą się Windowsa i tam ludzie proponują pobierać po prostu numer tygodnia z kalendarza Windowsa ale ja potrzebuję algorytm, który obliczy mi tydzień roku na Atmedze mając jedynie aktualny dzień roku i aktualny dzień tygodnia.
Napisałem algorytm obliczający dzień roku (dzisiaj jest 282 dzień roku), działa poprawnie, sprawdziłem w wielu przypadkach i w tym roku wylicza poprawnie, tj. pierwszym dniem roku był czwartek, a co za tym idzie jest to już pierwszy tydzień roku. Poniżej wklejam mój kod programu, który powinien obliczać tydzień roku jednak jest on niepoprawny. Jest to już chyba setna wersja tego kodu
PS. Wd_dec to numer dnia tygodnia dla PCF8583 czyli zakres jest od 0 do 6.
Sub Tydzien_roku
Modulo_7_z_dnia_roku = Dzien_roku Mod 7
If Modulo_7_z_dnia_roku = 0 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec + 1
If Pierwszy_dzien_tygodnia_roku = 7 Then
Pierwszy_dzien_tygodnia_roku = 0
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 5 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 6 Then
Dopelnienie = Modulo_7_z_dnia_roku
End If
Elseif Modulo_7_z_dnia_roku = 1 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec
Dopelnienie = 5
Elseif Modulo_7_z_dnia_roku = 2 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec - 1
If Pierwszy_dzien_tygodnia_roku = 255 Then
Pierwszy_dzien_tygodnia_roku = 6
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 5 Then
Dopelnienie = Modulo_7_z_dnia_roku
End If
Elseif Modulo_7_z_dnia_roku = 3 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec - 2
If Pierwszy_dzien_tygodnia_roku = 255 Then
Pierwszy_dzien_tygodnia_roku = 6
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
Pierwszy_dzien_tygodnia_roku = 5
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
Dopelnienie = Modulo_7_z_dnia_roku
End If
Elseif Modulo_7_z_dnia_roku = 4 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec - 3
If Pierwszy_dzien_tygodnia_roku = 255 Then
Pierwszy_dzien_tygodnia_roku = 6
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
Pierwszy_dzien_tygodnia_roku = 5
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
Pierwszy_dzien_tygodnia_roku = 4
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
Dopelnienie = 1
Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
Dopelnienie = 1
End If
Elseif Modulo_7_z_dnia_roku = 5 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec - 4
If Pierwszy_dzien_tygodnia_roku = 255 Then
Pierwszy_dzien_tygodnia_roku = 6
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
Pierwszy_dzien_tygodnia_roku = 5
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
Pierwszy_dzien_tygodnia_roku = 4
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
Pierwszy_dzien_tygodnia_roku = 3
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = 2
Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
Dopelnienie = 2
End If
Elseif Modulo_7_z_dnia_roku = 6 Then
Pierwszy_dzien_tygodnia_roku = Wd_dec - 5
If Pierwszy_dzien_tygodnia_roku = 255 Then
Pierwszy_dzien_tygodnia_roku = 6
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
Pierwszy_dzien_tygodnia_roku = 5
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
Pierwszy_dzien_tygodnia_roku = 4
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
Pierwszy_dzien_tygodnia_roku = 3
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 251 Then
Pierwszy_dzien_tygodnia_roku = 2
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
Dopelnienie = Modulo_7_z_dnia_roku
Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
Dopelnienie = Modulo_7_z_dnia_roku
End If
End If
'Dopelnienie = Pierwszy_dzien_tygodnia_roku
Dzien_roku = Dzien_roku + Dopelnienie
Dzien_roku = Dzien_roku / 7
'Dzien_roku = Int(dzien_roku)
Tydzien_roku_integer = Dzien_roku
'Tydzien_roku_single = Dzien_roku / 7
'Tydzien_roku_single = Int(tydzien_roku_single)
'Tydzien_roku_byte = Tydzien_roku_single
If Pierwszy_dzien_tygodnia_roku < 4 Then
Tydzien_roku_integer = Tydzien_roku_integer + 1
Else
Tydzien_roku_integer = Tydzien_roku_integer + 0
End If
End Sub