본문 바로가기

컴퓨터/언어,프로그래밍

C언어 달력 - 알고리즘포함 (윤년계산)

C언어 달력 - 알고리즘포함 (윤년계산)

윤년 계산은 아래의 공식을 이용해서 푼다.
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;
      }
   }
}


출처 : http://www.tipssoft.com/

배포가 안된다면.. 삭제 하겠습니다^^
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...