//이 프로그램은  입력받은 년월일의
//1991.12.31(Tuesday,화요일)을 기준으로한 경과일수를 계산하여
//요일을 구하는 프로그램입니다
//1992.1.1=1,  1.2=2  ....  1993.1.1=367  ......

 

#include < stdio.h >  // printf, scanf 를 사용하기 위한 헤더 file

 

//함수 원형(prototype) 선언
int mdays (int y, int m);
int day_is(int y, int m, int d);

 

long int compute_days(int y, int m, int d)  // long,int 둘중 하나 필요없음
{
  long int ds;  // long,int 둘중 하나 필요없음
  int i;

  ds = (y - 1992) * 365 + mdays(y, m) + d;  // '|' 제거, 경과년*365+날자수
  for(i = 1992; i < y; i += 4)  // 1992(윤년)부터 4년마다
      if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0))) //윤년이면
   //1996,2000,2004는 윤년, 2100,2200,2300은 평년
      ++ds;  //하루 증가
  return (ds);
}

 

void print_day(int d)
{
/****** 아래 printf 문 하나로 대체
   switch (d) {
      case 1: printf("The day is Wednesday.\n");
              break;
      case 2: printf("The day is Thursday.\n");
              break;
      case 3: printf("The day is Friday.\n");
              break;
      case 4: printf("The day is Saturday\n");
              break;
      case 5: printf("The day is Sunday\n");
              break;
      case 6: printf("The day is Monday.\n");
              break;
      case 0: printf("The day is Tuesday.\n");
              break;
   }
*****/
 //1991.12.31(경과일수 0)은 "Tuesday"
 char *days[7]={"Tuesday", "Wednesday", "Thursday", "Friday", 
                   "Saturday", "Sunday", "Monday"};
    printf("The day is %s.\n", days[d]);

}

 

void main() 
{
  int year, mon, day;
  long int days;

  printf("Input Year -> ");
  scanf("%d",&year);
  printf("Input Month -> ");
  scanf("%d",&mon);
  printf("Input Day -> ");
  scanf("%d",&day);
  if (!day_is(year,mon,day))
    printf("Incorrect date!!\n");
  else {
    days = compute_days(year,mon,day);  //경과일수 계산
    print_day((int)(days % 7));
  }
}

 

//입력 년월일이 정확하면 1(true), 잘못됬으면 0(false) 을 반환하는 함수 
//int형 함수의 경우 함수형을  생략해도 되지만 
//명시하는 것이 코딩의 일관성 유지(day_is 앞의 int)
int day_is(int y, int m, int d) 
{
  int e = 0;

  if (y < 1992 || m < 1 || m > 12 || d < 1 || d > 31)
    return (0);

  //d가 m월 날수 이내인지 검사
  switch (m) {
    //윤년 검사문 case 2 로 이동
    case 2: if ((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
               e = 1;
      if (d <= 28 + e)
               return (1);
            else
               return (0);
       break;        // break 문이 없으면 다음 문장도 실행
    case 4:
    case 6:
    case 9:
    case 11: if (d <= 30)
               return (1);
             else
               return (0);
    break;
 default : return (1); // 위조건이 아닌 경우(1,3,5,7,8,10,12) 날수 31
                    // d가 31 이내인지는 함수 처음에 검사했음
  }
}

 

// 2004.5.6 경우 2004년 1.1 부터 4.30 까지 날수 계산하는 함수
int mdays (int y, int m) 
{
  int e = 0;

  if((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
       e = 1;
/***  아래 if문과  비교
  switch (m) {
     case 1: return (0);
     case 2: return (31);
     case 3: return (59 + e);
     case 4: return (90 + e);
     case 5: return (120 + e);
     case 6: return (151 + e);
     case 7: return (181 + e);
     case 8: return (212 + e);
     case 9: return (243 + e);
     case 10: return (273 + e);
     case 11: return (304 + e);
     case 12: return (334 + e);
  }
*****/
  int dates[12]={0,31,59,90,120,151,181,212,243,273,304,334};
  if (m <= 2)
   return dates[m-1];
  else
      return dates[m-1]+e;
}

'Programing > C' 카테고리의 다른 글

재귀함수사용한 덧셈  (0) 2016.11.30
c언어 별찍기, 피라미드  (0) 2016.11.30
#undef , 전처리문  (0) 2016.11.30
짝수 합 홀수 합 구하기  (0) 2016.11.30
C언어 루트값 구하기  (0) 2016.11.30

+ Recent posts