# include <stdio.h>
#define true 1
#define false 0
//= 0 Sunday
int day_of_week(int y, int m, int d)
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6 ,2, 4};
y-=m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
int get_februery(int year)
{
if (year % 4 == 0) {
if (year % 400 == 0) return 29;
else if (year % 100 == 0) return 28;
else return 29;
}
else return 28;
}
void main()
{
int y = 2015, m, d;
int result = false;
int i, j, k, h, day;
char *date[7] = {"일", "월", "화", "수", "목", "금", "토"};
int first_week_of_month[12] = {0, }; // 매월 1일의 요일
int m_days[12] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
m_days[1] = get_februery(y); // luna check
for (m = 0; m < 12; m++) first_week_of_month[m] = day_of_week(y, m+1, 1);
printf("\t\t\t\t%d년 달력\n\n", y);
for (i = 0; i < 12; i += 3) {
for (h = 0; h < 3; h++) printf("\t%d 월\t\t", i+h+1);
printf("\n");
for (h = 0; h < 3; h++) {
for (j = 0; j < 7; j++) printf(" %s", date[j]);
printf("\t");
}
printf("\n\n");
for (h = 0; h < 6; h++) {
for (j = 0; j < 3; j++) {
for (k = 0; k < 7; k++) {
day = 7 * h - first_week_of_month[i+j] + k + 1;
if (day > 0 && day <= m_days[i+j]) printf("%3d", day);
else printf(" ");
}
printf("\t");
}
printf("\n");
}
printf("\n");
}
do {
printf("월 일을 입력하세요 (mm dd): ");
scanf("%d %d", &m, &d);
if (y < 0) {
printf("연도입력 오류.\n");
result = false;
}
else if (m < 1 || m > 12) {
printf("월입력 오류.\n");
result = false;
}
else if (m == 2 && d > m_days[1] || d < 1 || d > m_days[m-1]) {
printf("날짜입력 오류.\n");
result = false;
}
else result = true;
} while (result == false);
printf("\n2015년 %d월 %d일은 %s요일입니다.\n", m, d, date[day_of_week(y, m, d)]);
}