Beginner - algorytm

0

Czołem,
proszę o wyrozumiałość, jestem na początku drogi :-)

Mam takie zadanie:
Stwórz algorytm decyzyjny na blokach dla:

Dziś jest data D, M, R. Jaka data była wczoraj? Jaka data będzie jutro?

Nie oczekuję rozwiązania, choć nie pogardzę, ale naprowadzenia na tok myślowy:-)
Jak ogarnąć lata przestępne ?

Co prawda mam klauzulę: Jeśli istnieje potrzeba uściślenia sformułowania któregoś z zadań, uczyń to.
Może trzeba zdecydować i wybrać konkretny rok? miesiąc ?

1

Potraktuj datę wysokopoziomowo.

Jeśli wybrano, że chcę datę wczorajszą, zwróć obecną datę minus jeden dzień.
Jeśli wybrano, że chcę datę jutrzejszą, zwróć obecną datę plus jeden dzień.

Biblioteka do dat w większości popularnych języków programowania obsługuje takie operacje ;)
Np. https://ideone.com/Xh4pM3

0

Tak mi się widzi, że można by stworzyć obiekt: Date i operować na nim, tam byłyby właśnie informacje czy rok jest przestępny, ile dni ma luty. Trzeba by też wprowadzić jakąś datę początkową, Kalendarz Gregoriański nie jest od zawsze:).
Co do przestępnośći, to łatwo znaleźć zależność, rok jest przestępny gdy:

  • jest podzielny przez 4, ale nie jest podzielny przez 100 lub;
  • jest podzielny przez 400.
0

Dzięki za porady.
Jak sensownie rozpisać ten algorytm w blokach?

0

Na wejściu jest data, funkcja pyta o poprzednia lub następną, a potem blok decyzyjny który musi uwzględnić trochę warunków. Najlepiej wyobraź sobie wcześniej jak najwięcej przypadków testowych.

1

Jak już zaprogramujesz algorytm wyznaczający poprzedni i następny dzień, to dodaj sobie algorytm Tomohiko Sakamoto bardzo fajny jest i wyznacza jaki jest dzień tygodnia :)

1

Na pewno będziesz potrzebował tablicy z liczbą dni poszczególnych miesięcy

int[] numberDaysInMonths = {31,28,31,30,31,30,31,31,30,31,30,31};

i sprawdzenie czy rok jest przystępny i jeżeli tak to zmiana 28 na 29.

if(year%400==0) numberDaysInMonths[1] = 29;
if(year%4==0&&year%100!=0) numberDaysInMonths[1] = 29;

później sprawdzasz dzień jeżeli jest większe od 1 i mniejsze od elementu w tablicy wskazującego liczbę dni w tym miesiącu, to masz następny +1, a poprzedzający -1
itd...

0
lion137 napisał(a):

Co do przestępnośći, to łatwo znaleźć zależność, rok jest przestępny gdy:

  • jest podzielny przez 4, ale nie jest podzielny przez 100 oraz;
  • jest podzielny przez 400.

Nie "oraz", tylko "lub".

1

Dziś jest data D, M, R. Jaka data była wczoraj? Jaka data będzie jutro?

Znajdź wzór na Julian Day.
Wyliczasz JD z D/M/R, dodajesz 1, wyliczasz D/M/R z JD korzystając ze wzoru odwrotnego.

lion137 napisał(a):

Trzeba by też wprowadzić jakąś datę początkową, Kalendarz Gregoriański nie jest od zawsze:).

Data początkowa w Polsce to 14.10.1582.

0

Takie coś na piechotę można zrobić - szkoda się bawić w liczenie dni...

d--;
if( d == 0 )
m--; if( m == 0 ) rok--
itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1