/*
written by kaspy (kaspyx@gmail.com)
*/
아래는 C언어로 달력을 구현한 소스이다.
1980년 1월 1일(화요일)을 기준으로 지정해준 날짜까지 총합을 계산한다 그리고 7로 나눠서 요일을 구해서 달력을 출력한다.
미리 기준 연도와 , 기준월을 정해서 그날짜를 기준으로 달력을 출력하는 방법을 선택하여 구현하였다. 중요한건 윤달이 끼는 날때문에 조금 계산이 필요한데, 윤달을 판별하는 알고리즘은 http://blog.naver.com/bohe76?Redirect=Log&logNo=5588545 에서 참고 하였다.
- #include <stdio.h>
- int base_year = 1980;
- int base_month = 1;
- unsigned int total_sum = 0;
- int month_table[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- int nYear=-1;
- int nMonth=-1;
- int is_leap_year(int n)
- {
- if ( n % 4 == 0){
- if ( n % 100 == 0 )
- {
- if ( n % 400 == 0 )
- return 1;
- return 0;
- }
- return 1;
- }
- else
- return 0;
- }
- int total_to_month(int total)
- {
- int i=0;
- int cnt=0;
- int chk_leap_year = base_year;
- while (1)
- {
- if ( is_leap_year(chk_leap_year) == 1)
- month_table[1] = 29;
- if ( total >= month_table[i] )
- {
- total -= month_table[i++];
- cnt++;
- if (i==12)
- {
- i-=12;
- chk_leap_year++;
- }
- month_table[1]= 28;
- }
- else break;
- }
- cnt%=12;
- return (cnt+1);
- }
- int count_leap(int n)
- {
- int i;
- int cnt=0;
- if ( n <= 0 )
- {
- for (i=base_year ; i < (base_year-n) ; i++)
- {
- if ( is_leap_year(i) == 1 )
- {
- cnt++;
- }
- }
- }
- return cnt;
- }
- void result(int dy, int mth)
- {
- int i,j;
- int d=0;
- int year=0;
- int month;
- int sum=0;
- int day;
- if ( nYear >= base_year)
- {
- if ( is_leap_year(nYear) == 1) //윤달이 낀날의 2월은 하루 증가
- month_table[1] = 29;
- for ( i =0; i < (mth - base_month ) ;i++)
- total_sum += month_table[i];
- day = (total_sum+2) % 7;
- printf("총일수 %d\n",total_sum);
- month = total_to_month(total_sum);
- printf("%d월의 달력\n",month);
- printf("일 월 화 수 목 금 토\n");
- for ( i = 0; i < day; i++)
- printf("\t");
- for ( j = 1 ; j <= month_table[month-1]; j++)
- {
- printf("%2d\t",j);
- if (((j+day) % 7) == 0 ) printf("\n");
- }
- printf("\n");
- month_table[1] = 28;
- }
- }
- void main()
- {
- int n;
- while (nYear){
- puts("Year? Month?");
- scanf("%d %d",&nYear,&nMonth);
- total_sum =(( nYear - base_year) * 365)+count_leap((base_year-nYear));
- n = count_leap(base_year-nYear);
- printf("윤달의 개수 %d\n",n);
- result(n,nMonth);
- }
- }
3번라인은 기준 년월로써, 1980년 1월 1일(화요일)부터 기준으로 계산된다.
13번 라인이 윤달을 판별하는 함수이다. 4의 배수는 윤년이다. 그런데 100의 배수는 윤년이 아니며, 그중에서 400의 배수는 윤년이다.
아래는 실행화면
'IT > C++ Programming' 카테고리의 다른 글
C99 Flexible array member (0) | 2015.08.04 |
---|---|
C Generic 함수구현 :: void 포인터와 함수 포인터 이야기 (0) | 2015.07.15 |
C언어로 리틀엔디안, 빅엔디안 확인 하기 (5) | 2015.03.12 |