//이 프로그램은 입력받은 년월일의
//1991.12.31(Tuesday,화요일)을 기준으로한 경과일수를 계산하여
//요일을 구하는 프로그램입니다
//1992.1.1=1, 1.2=2 .... 1993.1.1=367 ......
#include < stdio.h > // printf, scanf 를 사용하기 위한 헤더 file
//함수 원형(prototype) 선언
int mdays (int y, int m);
int day_is(int y, int m, int d);
long int compute_days(int y, int m, int d) // long,int 둘중 하나 필요없음
{
long int ds; // long,int 둘중 하나 필요없음
int i;
ds = (y - 1992) * 365 + mdays(y, m) + d; // '|' 제거, 경과년*365+날자수
for(i = 1992; i < y; i += 4) // 1992(윤년)부터 4년마다
if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0))) //윤년이면
//1996,2000,2004는 윤년, 2100,2200,2300은 평년
++ds; //하루 증가
return (ds);
}
void print_day(int d)
{
/****** 아래 printf 문 하나로 대체
switch (d) {
case 1: printf("The day is Wednesday.\n");
break;
case 2: printf("The day is Thursday.\n");
break;
case 3: printf("The day is Friday.\n");
break;
case 4: printf("The day is Saturday\n");
break;
case 5: printf("The day is Sunday\n");
break;
case 6: printf("The day is Monday.\n");
break;
case 0: printf("The day is Tuesday.\n");
break;
}
*****/
//1991.12.31(경과일수 0)은 "Tuesday"
char *days[7]={"Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", "Sunday", "Monday"};
printf("The day is %s.\n", days[d]);
}
void main()
{
int year, mon, day;
long int days;
printf("Input Year -> ");
scanf("%d",&year);
printf("Input Month -> ");
scanf("%d",&mon);
printf("Input Day -> ");
scanf("%d",&day);
if (!day_is(year,mon,day))
printf("Incorrect date!!\n");
else {
days = compute_days(year,mon,day); //경과일수 계산
print_day((int)(days % 7));
}
}
//입력 년월일이 정확하면 1(true), 잘못됬으면 0(false) 을 반환하는 함수
//int형 함수의 경우 함수형을 생략해도 되지만
//명시하는 것이 코딩의 일관성 유지(day_is 앞의 int)
int day_is(int y, int m, int d)
{
int e = 0;
if (y < 1992 || m < 1 || m > 12 || d < 1 || d > 31)
return (0);
//d가 m월 날수 이내인지 검사
switch (m) {
//윤년 검사문 case 2 로 이동
case 2: if ((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
e = 1;
if (d <= 28 + e)
return (1);
else
return (0);
break; // break 문이 없으면 다음 문장도 실행
case 4:
case 6:
case 9:
case 11: if (d <= 30)
return (1);
else
return (0);
break;
default : return (1); // 위조건이 아닌 경우(1,3,5,7,8,10,12) 날수 31
// d가 31 이내인지는 함수 처음에 검사했음
}
}
// 2004.5.6 경우 2004년 1.1 부터 4.30 까지 날수 계산하는 함수
int mdays (int y, int m)
{
int e = 0;
if((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
e = 1;
/*** 아래 if문과 비교
switch (m) {
case 1: return (0);
case 2: return (31);
case 3: return (59 + e);
case 4: return (90 + e);
case 5: return (120 + e);
case 6: return (151 + e);
case 7: return (181 + e);
case 8: return (212 + e);
case 9: return (243 + e);
case 10: return (273 + e);
case 11: return (304 + e);
case 12: return (334 + e);
}
*****/
int dates[12]={0,31,59,90,120,151,181,212,243,273,304,334};
if (m <= 2)
return dates[m-1];
else
return dates[m-1]+e;
}