본문 바로가기

프로그래밍/자료구조/알고리즘

날짜 변환 하기



 


데이터 구조 교수님께서 2번째로 내주신 과제,

날짜 변환 해주는 문제 입니다.

입력값
2009 5 3

출력값
03-May-2009

date_strin.c

#include 
#include  //atoi 함수

void date_string(char *dateStr, struct date day);

struct date
{
 int yy; //년
 int mm; //월
 int dd; //일
} day;

char *arr[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
/*
 arr[0] = "Jan" 
 arr[1] = "Feb"
 arr[2] = "Mar"
 ...
 이러한 형식으로 포인터 배열 생성
*/


int main(int argc, char **argv)
{
    char Str[20];


 if (argc != 4) // 4개의 인자값이 아닌경우 종료 (경로 년 월 일)
 {
  printf("잘못된 인수값 입니다\n");

  return 0;
 }
 
 day.yy = atoi(argv[1]); //년
 day.mm = atoi(argv[2]); //월
 day.dd = atoi(argv[3]); //일

 /*
  전에 과제에서 적었던것 처럼 문자열로 받기 때문에 숫자열로 변환하고,

  입력 받은 인자값을 구조체 변수에 넣는다.
 */


 date_string(Str, day); //date_string 함수 호출

 printf("%s", Str);

 return 0;
}
void date_string(char *dateStr, struct date day) //dateStr 포인터에는 Str의 주소가 대입되어 있음
{

 int i;

 if (day.yy > 1999) // 년이 2000년 이후 일경우 4자리 그대로 출력
 {
  sprintf(dateStr, "%02d-%s-%d", day.dd, arr[day.mm-1], day.yy); //일,월,년
  /*
    먼저 일 2자리 표시는 예를들어 1 이란 숫자를 %02d 로 표현하면 01 로 나오고, %03d 로 표현하면 001이 나온다. 
    일 은 2자리로 표현해야 하므로 %02d 를 사용하였다.

    구조체에 저장된 mm변수값 을 arr[day.mm-1] 이렇게 해주면
    만약 인자로 넘겨받은 월이 5 일경우 arr[5-1] 즉 arr[4] = "May"(5월) 이렇게 됩니다.

    2000년 이후는 4자리 그대로 출력해야하니 그대로 구조체에 저장된 값으로 출력해준다.
  */
 }
 else // 2000년 미만 일경우
 {
  for(i=1900;i!=0;i-=100) // 아래 년 뺄셈할 값을 -100 씩 빼준다.
  {
   if (day.yy >= i) // 구조체에 저장된 년이 i값 보다 큰경우에만 발동 여기서 i값은 100씩 감소된다. (ex. 1940 >= 1900)
   {
    sprintf(dateStr, "%02d-%s-%d", day.dd, arr[day.mm-1], day.yy-i); //일,월,년
    break;
    /*
     만약 day.yy 구조체에 저장된 년이 1935년 일경우 1935 - 1900 이 되어 뒤에 두자리
     즉 35만 남게되어 출력하는 방식

     dateStr 에 리턴시키고 break 를 통해 for문 종료
    */
   }
  }
 }
}