윤년 계산은 아래의 공식을 이용해서 푼다.
if( year%4==0 && ( year%100!=0 || year%400==0 ) )
{
윤년
}else
{
윤년 아님
}
=============================소스===========================
#include <stdio.h>
#include <stdlib.h>
// 기준일 1980년 1월 1일 화요일
#define YEAR 1980
#define MONTH 1
#define DAY 1
#define WEEK 1 // 0 : Monday ... 5 : Saturday
// 지정한 해가 윤년인지를 체크 (윤년이면 2월이 29일까지, 아니면 28일까지)
int CheckYUN(int parm_year)
{
if((parm_year % 4 == 0 && parm_year % 100 != 0) || parm_year % 400 == 0)
return 29;
else return 28;
}
void main()
{
char cal_move = '0'; // 해와 월을 이동하기 위한 flag
char *p_week[] = {"Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"};
int month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day, year, month;
int input_year, input_month;
int standard_year = YEAR;
int standard_month = MONTH;
int standard_week = WEEK;
int first_week, i, j; // 매달 1일의 요일
int differ_day; // 기준일과의 차이
int week_count = 0; // 한주에서 현재 진행중인 날짜의 위치를 체크
// 도스명령 실행
system("cls");
while (1) {
system("cls");
// 해와 달을 입력 받는다...
printf("\n\n\t ================= << The Calendar >> =================\n\n");
printf("\t\t *** 원하는 연도를 입력하세요 (종료 = 0) : ");
scanf("%d", &input_year);
if(input_year == 0) exit(1);
printf("\t\t *** 원하는 달을 입력하세요 (종료 = 0) : ");
scanf("%d", &input_month);
if (input_month == 0) exit(1);
year = input_year;
month = input_month;
while (1) {
system("cls");
day = 0;
differ_day = 0;
// 해와 월을 이동
switch (cal_move)
{
case 'a': // 지난 해
year -= 1;
break;
case 's': // 지난 달
if (month == 1) {
month = 12;
year -= 1;
} else month -= 1;
break;
case 'd': // 전에 입력한 해와 달
month = input_month;
year = input_year;
break;
case 'f': // 다음 달
if (month == 12) {
month = 1;
year += 1;
} else month += 1;
break;
case 'g': // 다음 해
year += 1;
break;
default:;
}
// 해당 월 1일의 요일 정하기
// 기준일과의 차를 7로 나눈 나머지 이용
// 기준일 이후
if (year >= standard_year) {
for (i = year; i >= standard_year; --i) {
if (i > standard_year) {
month_days[1] = CheckYUN(i - 1);
// 윤년이면 366일, 아니면 365일
differ_day += 337 + month_days[1];
} else {
month_days[1] = CheckYUN(year);
for (j = month; j > standard_month; --j) differ_day += month_days[j - 2];
}
}
}
// 기준일 이전
else {
for (i = year; i < standard_year; ++i) {
if (i < standard_year - 1) {
month_days[1] = CheckYUN(i + 1);
differ_day += 337 + month_days[1];
} else {
month_days[1] = CheckYUN(year);
for (j = month; j <= 12; ++j) differ_day += month_days[j - 1];
}
}
}
// 7로 나누어 나머지가 0이면 기준일과 같은 요일
if (year >= standard_year) first_week = (int)(standard_week + differ_day % 7) % 7;
else first_week = (int)(standard_week - differ_day % 7) % 7;
// first_week가 음수면 그 수만큼 더한다.
if (first_week < 0) first_week = standard_week - first_week;
// 출력.......
printf("\n\n\t ================= << The Calendar >> =================");
printf("\n\n\t --------- *** %4d 년 *** ---------", year);
printf("\n\n\t *** %2d 월 ***", month);
printf("\n\n\t\t ");
month_days[1] = CheckYUN(year);
for (i = 0; i < 7; ++i) printf("%s ", p_week[i]);
for (i = 0; i < month_days[month - 1] + first_week; ++i) {
if (i % 7 == 0) {
printf("\n\n\t\t ");
week_count = 0;
}
if (i >= first_week) {
printf("%3d ", ++day);
week_count++;
} else printf(" * ");
}
for(i = week_count - 1; i < 6; i++) printf(" * ");
// 달력 이동을 위한 옵션 선택
printf("\n\n\t ------------------------------------------------------------");
printf("\n\t a(last_y) s(last_m) d(now), f(next_m), g(next_y), 0(quit) : ");
cal_move = getchar();
if (cal_move == '0')
break;
}
}
}
[프로그래밍/C] #define (0) | 2017.02.10 |
---|---|
[프로그래밍/C] 동적할당 : malloc calloc realloc free (0) | 2017.02.09 |
[프로그래밍/C] 날짜/시간 구하기 (0) | 2017.01.30 |
[프로그래밍/C] 일정관리프로그램 (4) | 2017.01.26 |
[프로그래밍/C] 파일 존재 유무 확인하기(how to check existence of file on C,linux) (0) | 2017.01.21 |