끄적끄적

반응형

윤년 계산은 아래의 공식을 이용해서 푼다. 


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;

      }

   }

}



반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]