본문 바로가기

IT/C++ Programming

C언어로 달력 구현하기

/* 
written by kaspy (kaspyx@gmail.com)
*/ 


아래는 C언어로 달력을 구현한 소스이다.

1980년 1월 1일(화요일)을 기준으로 지정해준 날짜까지 총합을 계산한다 그리고 7로 나눠서 요일을 구해서 달력을 출력한다.

미리 기준 연도와 , 기준월을 정해서 그날짜를 기준으로 달력을 출력하는 방법을 선택하여 구현하였다. 중요한건 윤달이 끼는 날때문에 조금 계산이 필요한데, 윤달을 판별하는 알고리즘은 http://blog.naver.com/bohe76?Redirect=Log&logNo=5588545 에서 참고 하였다.


  1. #include <stdio.h>
  2.  
  3. int base_year = 1980;
  4. int base_month = 1;            
  5.  
  6. unsigned int total_sum = 0;
  7.  
  8. int month_table[12] = { 312831303130313130313031};
  9.  
  10. int nYear=-1;  
  11. int nMonth=-1;
  12.  
  13. int is_leap_year(int n)
  14. {
  15.  
  16.         if ( n % 4 == 0){              
  17.  
  18.                 if ( n % 100 == 0 )
  19.                 {      
  20.                         if ( n % 400 == 0 )
  21.                                 return 1;
  22.  
  23.                         return 0;
  24.                 }
  25.        
  26.                 return 1;
  27.         }
  28.                
  29.         else
  30.                 return 0;
  31.  
  32. }
  33.  
  34.  
  35. int total_to_month(int total)
  36. {
  37.         int i=0;
  38.         int cnt=0;
  39.         int chk_leap_year = base_year;
  40.  
  41.         while (1)
  42.         {
  43.                 if ( is_leap_year(chk_leap_year) == 1)
  44.                         month_table[1] = 29;
  45.                
  46.        
  47.                 if ( total >= month_table[i] )
  48.                 {
  49.                         total -= month_table[i++];
  50.                         cnt++;
  51.                         if (i==12)
  52.                         {
  53.                                 i-=12;
  54.                                 chk_leap_year++;
  55.                         }
  56.  
  57.                         month_table[1]= 28;
  58.  
  59.                 }
  60.  
  61.                 else break;
  62.  
  63.         }
  64.  
  65.         cnt%=12;
  66.  
  67.         return  (cnt+1);
  68.  
  69. }
  70.  
  71. int count_leap(int n)
  72. {
  73.         int i;
  74.         int cnt=0;
  75.  
  76.         if ( n <= 0 )
  77.         {
  78.  
  79.                 for (i=base_year ; i < (base_year-n) ; i++)
  80.                 {
  81.  
  82.                         if ( is_leap_year(i) == 1 )
  83.                         {
  84.                                 cnt++;
  85.                         }
  86.                
  87.                 }
  88.  
  89.  
  90.         }
  91.  
  92.         return cnt;
  93.  
  94. }
  95.  
  96. void result(int dy, int mth)
  97. {
  98.         int i,j;
  99.         int d=0;
  100.         int year=0;
  101.         int month;
  102.         int sum=0;
  103.         int day;
  104.  
  105.  
  106.         if ( nYear >= base_year)
  107.         {
  108.  
  109.                 if ( is_leap_year(nYear) == 1)          //윤달이 낀날의 2월은 하루 증가
  110.                                 month_table[1] = 29;
  111.                
  112.                 for ( i =0; i < (mth - base_month ) ;i++)
  113.                                 total_sum += month_table[i];
  114.                
  115.                 day = (total_sum+2) % 7;
  116.  
  117.                 printf("총일수 %d\n",total_sum);    
  118.  
  119.                 month = total_to_month(total_sum);
  120.  
  121.                 printf("%d월의 달력\n",month);
  122.  
  123.                 printf("일     월     화     수     목     금     토\n");
  124.  
  125.                 for ( i = 0; i <  day; i++)
  126.                         printf("\t");
  127.  
  128.                 for ( j = 1 ; j <= month_table[month-1]; j++)
  129.                 {      
  130.                         printf("%2d\t",j);
  131.  
  132.                         if (((j+day) % 7) == 0 ) printf("\n");
  133.                 }
  134.  
  135.                 printf("\n");
  136.  
  137.                 month_table[1] = 28;
  138.  
  139.  
  140.        
  141.        
  142.  
  143.         }
  144. }
  145.  
  146. void main()
  147. {
  148.  
  149.         int n;
  150.        
  151.         while (nYear){
  152.  
  153.         puts("Year? Month?");
  154.         scanf("%d %d",&nYear,&nMonth);
  155.         total_sum  =(( nYear - base_year) * 365)+count_leap((base_year-nYear));
  156.  
  157.         n =     count_leap(base_year-nYear);
  158.  
  159.         printf("윤달의 개수 %d\n",n);
  160.         result(n,nMonth);
  161.  
  162.         }
  163. }


3번라인은 기준 년월로써, 1980년 1월 1일(화요일)부터 기준으로 계산된다.

13번 라이 윤달을 판별하는 함수이다. 4의 배수는 윤년이다. 그런데 100의 배수는 윤년이 아니며, 그중에서 400의 배수는 윤년이다.


아래는 실행화면