Program obliczające datę- problem

0

Witam. Mam za zadanie napisać program, który dla podanej daty (większej od 01.01.1970) pokazuje jaki to jest dzień tygodnia. Aby to zrobić obliczam ilość dni z pełnych lat (zwykłych i przestępnych) i dodaje do tego ilość dni z ostatniego roku. Mój problem pojawia się wtedy kiedy porównuje ilość dni które upłynęły wg mojego programu i stron liczących to samo- mój program zawsze pokazuje trochę za mało dni co przekłada się na podanie złego dnia tygodnia. Stawiam, że błąd jest gdzieś w miejscu gdzie następuje liczenie dni z lat zwykłych i przestępnych. Oto fragment kodu który za to odpowiada:

if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
	{
		for (int i = 1970; i < year; i++)
		{
			licz_przestepne++;
		}
		ilosc_latp = licz_przestepne;
		ilosc_latz = year - 1970 - licz_przestepne;
		year_type = 0;
		printf("\nRok jest przestepny. \n\n");
	}
	else if((year % 4 != 0 && year % 100 == 0) || year % 400 != 0)
	{
		for (int i = 1970; i < year; i++)
		{
			licz_zwykle++;
		}
		ilosc_latz = (licz_zwykle * 3) / 4;
		ilosc_latp = year - 1970 - ilosc_latz;
		year_type = 1;
		printf("\nRok nie jest przestepny. \n\n");
	}

Krótka legenda nazw stosowanych:
licz_zwykle/ przestepne - zależności od tego czy rok który podał użytkownik jest przestępny czy zwykły wykonuje się liczenie if lub else if
ilosc-latp/ ilosc_latz - działa podobnie jak to co wyżej, tylko już poza pętlą; odejmowanie w kolejnych linijkach ma na celu posiadanie w osobnych zmiennych ilości lat zwykłych i przestępnych
year_type - tego używam do pokazania kalendarza dla miesiąca, ale z tym sobie poradziłem ;)

A to jest kod który ma za zadanie policzyć ilość tych dni:

int days_since = (ilosc_latz * 365) + (ilosc_latp * 366);

To już funkcja zliczająca ilość dni z roku zaczętego ale nie skończonego:

	int more_days = 0;
	switch (month)
	{
	case 1:
		more_days = day + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 2:
		more_days = day + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case  3:
		more_days = day + 31 + 28 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 4:
		more_days = day + 31 + 28 + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 5:
		more_days = day + 31 + 28 + 31 + 30 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 6:
		more_days = day + 31 + 28 + 31 + 30 + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 7:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 8:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 9:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 10:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 11:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;

	case 12:
		more_days = day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + days_since;
		printf("Ilosc dni od 01.01.1970 to %d \n", more_days);
		break;
	}

Wg mnie w niej powinno być już wszystko dobrze, bo w poprzednim programie który podawał ilość dni tylko w aktualnym roku działała dobrze.
Jeśli ktoś wie gdzie leży błąd w moim programie byłbym wdzięczny za wszelkie wskazówki

0
_13th_Dragon napisał(a):

http://www.cplusplus.com/reference/ctime/mktime/
http://www.cplusplus.com/reference/ctime/localtime/
Parę wierszy i tyle
O tym sposobie wiem, ale chciałbym wykombinować coś w stylu tego co zacząłem, nawet jeśli to droga zupełnie naokoło

0

Liczysz ilosc_latz i ilosc_latp dwoma różnymi sposobami i w pierwszym zrobiłeś błąd.
Zamiast ilosc_latp = licz_przestepne; powinno chyba być ilosc_latp = licz_przestepne/4;
Najlepiej jak przeniesiesz ten fragment (liczenie ilosc_latz i ilosc_latp) poza warunek. Pozbędziesz się części nadmiarowego kodu czyli zmniejszysz ilość miejsc w których możesz się pomylić.
Tego switcha też możesz uprościć. Przykład (bazujący na Twoim kodzie):

    int more_days = day + days_since;
    switch (month)
    {
    case 12:
        more_days += 30;
    case 11:
        more_days += 31;
    ...
    case 3:
        more_days += 28;
    case 2:
        more_days += 31;
    }
    printf("Ilosc dni od 01.01.1970 to %d \n", more_days);

EDIT: zmiana bo nie zauważyłem że jeden miesiąc mniej odejmujesz.

0
Delor napisał(a):

Liczysz ilosc_latz i ilosc_latp dwoma różnymi sposobami i w pierwszym zrobiłeś błąd.
Zamiast ilosc_latp = licz_przestepne; powinno chyba być ilosc_latp = licz_przestepne/4;
Najlepiej jak przeniesiesz ten fragment (liczenie ilosc_latz i ilosc_latp) poza warunek. Pozbędziesz się części nadmiarowego kodu czyli zmniejszysz ilość miejsc w których możesz się pomylić.
Tego switcha też możesz uprościć. Przykład (bazujący na Twoim kodzie):

    int more_days = day + days_since;
    switch (month)
    {
    case 12:
        more_days += 30;
    case 11:
        more_days += 31;
    ...
    case 3:
        more_days += 28;
    case 2:
        more_days += 31;
    }
    printf("Ilosc dni od 01.01.1970 to %d \n", more_days);

EDIT: zmiana bo nie zauważyłem że jeden miesiąc mniej odejmujesz.

Z tego co mówisz zrobiłem póki co

Zamiast ilosc_latp = licz_przestepne; powinno chyba być ilosc_latp = licz_przestepne/4;
i wyrzuciłem to poza warunek
i teraz mój program pokazuje za dużo dni. Zrobiłem trochę testów i wyszło na to że zawsze jest to 1 lub 2 dni w zależności
2015 -> 2 dni
2016 -> 1 dzień
2017 -> 1 dzień
2018 -> 1 dzień
2019 -> 2 dni itd

0

Uwzględnij year_type i rok 2000 (komentarz wyżej) i/lub poszukaj innych błędów w algorytmie.

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