Obliczanie dnia na podstawie daty

0

Czy ktoś byłby w stanie powiedzieć w czym leży problem? Program liczy dobrze daty powyżej 2000 roku, ale poniżej już nie :( Nie wiem w czym leży problem.

 #include <stdio.h>
#include <stdlib.h>

  char *dni_tygodnia[] = {"sobota","niedziela", "poniedzialek", "wtorek", "sroda","czwartek","piatek"};
  int dni_mies[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  int mies_roku[12];
  int d, m, r;
  int temp=0, i=0;
  int ilosc_dni_w_ostatnim_roku=0, ilosc_lat_przestepnych=0, ilosc_lat_zwyklych=0;

  
  int oblicz_dni_tygodnia()
{
  if(r>2000)
  temp=(ilosc_lat_przestepnych*2+ilosc_lat_zwyklych+ilosc_dni_w_ostatnim_roku)%7;
  else
  {
  temp=(ilosc_lat_przestepnych*2+ilosc_lat_zwyklych+ilosc_dni_w_ostatnim_roku)%7;
  }
}

int main(int argc, char *argv[])
{

  printf("Podaj dzien:\n");
  scanf("%d", &d);
  printf("\nPodaj miesiac:\n");
  scanf("%d", &m);
  printf("\nPodaj rok:\n");
  scanf("%d", &r);
  printf("\n\n");
  ilosc_dni_w_ostatnim_roku=d;
  
  for(i=0; i<(m-1); i++)
  {
           ilosc_dni_w_ostatnim_roku+=dni_mies[i];
  }
  if(r%4==0 && r>2000)
  {
            if(m<3)
            ilosc_dni_w_ostatnim_roku-=1;
  }
  if(r%4==0 && r<2000)
  {
            if(m<3)
            ilosc_dni_w_ostatnim_roku;
            
  }
  if(r<2000)
  {
            ilosc_lat_przestepnych=(2000-r)/4;
            ilosc_lat_zwyklych=r-2000-(ilosc_lat_przestepnych);
  }
  else
  {
            ilosc_lat_przestepnych=(r-2000)/4;
            ilosc_lat_zwyklych=r-2000-ilosc_lat_przestepnych;
  }  

  temp=oblicz_dni_tygodnia();
  
  printf("Dzien tygodnia dla podanej daty to: %s\n\n", dni_tygodnia[temp]);
  
  
  
  
  
  system("PAUSE");	
  return 0;
}
0
Reedson napisał(a):
if(r%4==0 && r<2000)
  {
            if(m<3)
            ilosc_dni_w_ostatnim_roku;
            
  }
}

Albo to nadmiarowy kod który z założenia nie ma nic robić, albo zapomniałeś tutaj wykonać jakieś działanie na tej zmiennej ilosc_dni_w_ostatnim_roku.

0

Zacznij od tego, że wszystkie obliczenia powinny być zawarte w funkcji, np. takiej:

int jaki_dzien_tygodnia(int d, int m, int r)

Przyda się też pewnie funkcja

int czy_rok_przestepny(int r)

Pozbądź się większości zmiennych globalnych. Zostaw tylko nazwy dni tygodnia i ewentualnie tablicę z długością miesięcy. Reszta powinna być lokalna albo w jaki_dzien_tygodnia() albo w main().

Bez prawidłowej struktury programu masz chaos którego nie ogarniesz.

0
enum class DayOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};

::DayOfWeek DayOfWeek(int year, int month, int day)
{
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
    year -= month < 3;
    return (::DayOfWeek)((year + year/4 - year/100 + year/400 + t[month-1] + day) % 7);
}

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