int allDays(int year, int month, int day) {
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i, leap, y, total;
// 지금 년도 이전의 년도까지의 날자수를 구하기 위해서 y=year-1; 이라고 둔다.
y=year-1;
// 1년은 365.24.... 일로서
// 그 동안 있었던 윤년의 갯수를 구해주어서 그 날자를 y*365에 더해준다.
// 윤년의 갯수는 y/4 4년마다 한번씩 윤년이 있기 때문에
// -y/100 100으로 나누어 떨어지는 해는 윤년이 아니다.
// +y/400 하지만 400으로 나누어 떨어지는 해는 윤년이다.
// 예를 들어서 year=2013일 때 y는 2012 이고
// +y/4-y/100+y/400을 해주면 정수의 몫이기 때문에
// +503-20+5 가 되겠다.
// 4년마다 무조건 윤년이 있다고 보면503번이 있었다.
// 하지만 100,200,300,400,500,....1900,2000 년에는 윤년이 없었다고 보면 -20을 해주어야 한다.
// 또 400,800,1200,1600,2000 년은 윤년이므로 +5를 해주어야 한다.
// 그렇게 해서 아래의 total 식이 나오게 된다.
total=y*365+y/4-y/100+y/400;
// 논리식으로 참은 1로 계산이 되고, 거짓은 0으로 계산이 된다.
// year%4==0 은 year가 윤년이면 1이고 윤년이 아니면 0이다.
// 마찬가지로 year%100==0 의 값은 year가 100으로 나누어 떨어지면 1이고 아니면 0이다.
// 또 year%400==0 의 값은 year가 400으로 나누어 떨어지면 1이고 아니면 0이다.
// 따라서 leap=((year%4==0)&&(year%100!=0))||(year%4300==0); 로 계산한 결과와
// 아래의 결과는 같다. 2012년의 경우 year%4==0는 참이기 때문에 1이 된다.
// year%100==0는 참이 아니기 때문에 0이고
// year%400==0도 참이 아니기 때문에 0이다.
// 따라서 leap의 값은 1이 된다.
// 1900을 year에 넣으면 leap의 값은 0이 나오고,
// 2000을 year에 넣으면 leap의 값은 1이 나온다.
// 따라서 leap=(year%4==0)-(year%100==0)+(year%400==0); 의 값은
// year가 윤년이면 1이고, 평년이면 0이 된다.
leap=(year%4==0)-(year%100==0)+(year%400==0);
// 윤년,평년의 값을 2월에 더해준다.
days[2]+=leap;
// 지금 달 이전의 달 까지의 날자를 더해준다.
for(i=0;i<month;i+=1) {
total+=days[i];
}
// 이번 달의 날자를 더해준다.
total+=day;
return total;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
C언어 기초공부-중학생의 질문 (0) | 2013.10.05 |
---|---|
_mainCRTStartUp 외부기호 확인할 수 없슴. (0) | 2013.10.04 |
3x3 행렬의 곱셈 (0) | 2013.10.02 |
가우스 소거법 (0) | 2013.09.26 |
strlen, strcpy, strcmp 구현 (0) | 2013.09.24 |