Kalendarz kolejnych pełni księżyca /Program język C

0

Hej mam zadanie na uczelni do zrobienia.
Mając datę ostatniej pełni księżyca program ma podać daty kolejnych pełni księżyca.
Użytkownik podaje następujące dane:
• datę ostatniej pełni księżyca;
• czy wyliczyć daty kolejnych pełni w przód?
Jeśli tak, to ile dat w przód?
 Jeśli nie, to ile dat wstecz liczymy.
Program ma zweryfikować poprawność wprowadzonych danych.
Założenie: od danej pełni do kolejnej jest 29 dni: pełnia to jest pierwszy dzień, zaś 29 to data kolejnej
pełni. Uwzględnić lata przestępne.
Dane mają być wypisywane ma monitor jak i też mają być zapisywane do pliku. W tym też data ostatniej
pełni (dana podana przez użytkownika) i czy liczymy daty w wstecz, czy w przód. Format zapisu danych
do pliku:
1sza pełnia: 23.02.2020
2ga pełnia: 22.03.2020
Przedrostek można zmienić, aby nie musieć dbać dokładnie o formę gramatyczną

Nie do końca mam pomysł jak się za to zabrać tzn. funkcja wczytania daty, sprawdzenia czy ten rok jest przestępny spoko, ale im dalej las tym gorzej. nie do końca wiem jak rozwiązać problem dodawania(lub odejmowania) tych 29 dni czy po prostu muszę masę przypadków rozpisać czy jest jakiś sprawny patent żeby to uprościć.
Z góry dziękuję za wskazówki(w miarę postępu moich pomysłów, wrzucę kod co udało mi się wyrzeźbić bo nie liczę na gotowca)

2

Chyba najprościej by było najpierw użyć strptime i mktime, żeby przekonwertować datę na czas uniksowy. Dodajesz/odejmujesz wielokrotności 29*24*60*60=2505600 i konwertujesz z powrotem na string, przy pomocy localtime i strftime. No, chyba że planujesz wychodzić poza epokę (czyli za jakieś 10 lat).
Na windowsie pewnie można podobnie zrobić, albo użyć jakiejś implementacji POSIX, np. cygwin, albo Linux subsystem czy jak to się tam nazywa.

1

Arytmetyką najbardziej podobną do czasu astronomicznego chyba są nasze programistyczne millisec from epoch czy podobne..
Dopiero na sam koniec, tylko na wyjściu, przechodzimy na "culture time".

Jak wrócę doi swoich bookmarków, podłączę prezentację o fundamentach daty/czau

1
  1. wyliczamy Julian Day (JD) na podstawie dnia, miesiąca i roku
  2. dodajemy/odejmujemy 29 czy ile tam
  3. wyliczamy datę na podstawie JD.

Algorytm wyznaczania JD albo jakiejś równoważnej rachuby to już sobie znajdź.

0

Poczytałem i postarałem się mk time wykorzystać i doszeedłem do tego momentu wiem ze cos na pewno robie zle w samym zamysle i no nie wiem jak teraz te daty zapisać. Z góry dziękuję za wszelkie wskazówki



```#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{
int day, month, year;
int ilosc, kierunek;
char buffor[25];
do{
printf("podaj date ostatniej pelni w formacie dd.mm.yyyy");
scanf("%d.%d.%d",&day,&month,&year);
printf("podaj ilosc pelni");
scanf("%d", &ilosc);
printf("czy liczyc do przodu? wpisz 1. Czy do tylu wpisz -1");
scanf("%d", &kierunek);

while (day<1 || day>31 || month<1 || month>12) ;
struct tm tim;
tim.tm_year =year-1900;
tim.tm_mon =month-1;
tim.tm_hour = 0;
tim.tm_min = 0;
tim.tm_sec = 1;
tim.tm_isdst = -1;
else
    {
for (int i=0; i<ilosc; i++)
    {
      mktime(&tim)+=kierunek*i*2505600;
    }
    }
return 0;
}
2

Drażni mnie te 29 dni, bo to nieprawda.
Zwłaszcza, że przechodząc na miarę sekundową nie jesteś niczym związany, mówienie 29 jest nieuzasadnione
Tymczasem nadal prymitywnie wymnażasz 24, 60, 60

https://pl.wikipedia.org/wiki/Miesi%C4%85c_synodyczny
Nie mówię, żeby w studenckim zadaniu wikłać się niuanse ruchu Ziemia-Ksiezyc na ekliptyce. ale 29 a (średnio) 29.531 to jednak różnica, którą realny człowiek może doświadczyć (np umówi się na spacer z kochankiem /kochanką /trzecią /N-tą płcią o dobę za wcześnie / za późno)

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