Prosto

1년 달력 계산 (윤년) 본문

Programing/C Programing

1년 달력 계산 (윤년)

Prosto 2011. 5. 15. 19:07


저번에 1년 중 1월1일을 구하고 그 1월 달만 구하는 달력을 만들어 보았는데요. (달력 계산)
이번에는 1년 전체 달력을 출력 해주는 프로그램을 만들어보겠습니다. (입력년도의 1월~12월 달력 계산 출력 프로그램.)

필요 : for문, if문, 사용자 정의 함수, 함수, 변수, 배열 (3차원 배열) .... 등을 사용하였습니다.
(포인터 사용 안했음.)


예를 들어
달력이 궁금한 년도를 입력하면
그 해의 달력을 출력해주는 것 입니다.
2011년을 입력하면 2011년 달력 (1월, 2월, 3월 ....)
2년을 입력하면 2년...

그리고 달력의 출력형태로는

--------1월--------
 1  2   3   4   5   6   7
 8  9  10  11 12 13  14
15 16 17  18 19 20  21
22 23 24  25 26 27  28
29 30 31
--------2월--------
 1  2   3   4   5   6   7
 8  9  10  11 12 13  14
15 16 17  18 19 20  21
22 23 24  25 26 27  28
29
--------3월--------
 1  2   3   4   5   6   7
 8  9  10  11 12 13  14
15 16 17  18 19 20  21
22 23 24  25 26 27  28
29 30 31
--------4월--------
 1  2   3   4   5   6   7
 8  9  10  11 12 13  14
15 16 17  18 19 20  21
22 23 24  25 26 27  28
29 30

......
이런 형태와


--------1월--------        --------2월--------        --------3월--------
 1  2   3   4   5   6   7         1  2   3   4   5   6   7         1  2   3   4   5   6   7
 8  9  10  11 12 13  14        8  9  10  11 12 13  14         8  9  10  11 12 13  14
15 16 17  18 19 20  21       15 16 17  18 19 20  21        15 16 17  18 19 20  21
22 23 24  25 26 27  28       22 23 24  25 26 27  28        22 23 24  25 26 27  28
29 30 31                         29                                  29 30 31

--------4월--------        --------5월--------        --------6월--------
 1  2   3   4   5   6   7         1  2   3   4   5   6   7         1  2   3   4   5   6   7
 8  9  10  11 12 13  14        8  9  10  11 12 13  14         8  9  10  11 12 13  14
15 16 17  18 19 20  21       15 16 17  18 19 20  21        15 16 17  18 19 20  21
22 23 24  25 26 27  28       22 23 24  25 26 27  28        22 23 24  25 26 27  28
29 30                             29 30 31                          29 30
             .                                     .                                     .
             .                                     .                                     .
             .                                     .                                     .

이런 형태로 만들어 보겠습니다.
(3달씩~ 1~12월까지. )
(달력의 빈칸이 생길 경우는 공란으로! )
(폼만 만들었습니다. (월, 일의 위치가) 실제와 차이가 있습니다.)



그럼 만들어 보세요!


...


먼저 몇 가지 힌트를 드리자면..

1. 그 입력 년도가 되기까지의 윤년을 계산하여 해당 년도의 1월 1일을 구합니다.
2. 1월 달만 출력하던 저번번 포스트와 유사하게 시작하시면 됩니다.
  (단, 사용하기 좋게 바꿔 사용하기를 바람..)
3. 1월의 마지막 일이 끝나는 위치를 잘 받아와 2월은 그 곳 부터 시작되어야 합니다!
4. 2월의 경우 윤년인 경우는 그에 맞는 처리를 해주어야 합니다.
  (윤년이 아닌 경우 28일, 윤년인 경우 29일 .. )
5. 출력 형태를 바꾸는 것은 먼저 각 달마다 해당 값에 입력이 제대로 되어있다면
 별다른 문제 없이 형태를 바꿀 수 있습니다.


그럼 먼저
1
2
3
4
5월 ... 이런식으로 일렬로 나오는 달력을 만들어 보겠습니다.

(소스코드는 사람마다 각각 다를 수 있습니다~)

소스 :

#include<stdio.h>

int LeapYear (int a);
void Calendar (int year);


int main(void)
{
 int year;

 while (1)
 {

 printf("년도 입력시 해당연도의 달력 출력 \n");
 printf("년도 입력 : ");
 scanf("%d", &year);

 Calendar(year);

 }

 return 0;
}


///////////////////////////////윤년 계산/////////////////////////
int LeapYear(int a)
{
 if( (0==a%4 && 0!=a%100) || 0==a%400 )
 {
  return 1;
 }
 return 0;
}

 


///////////////////////////////실질적 달력 입력, 출력/////////////////////////

void Calendar(int year)
{
 int i, j, k;
 int dayCnt, leapYearCnt=0;
 int lastMonth, thisMonth=31;
 int month[12][6][7];

 for(i=1; i<year; i++)
 {
  leapYearCnt+=LeapYear(i);
 }

 lastMonth = (year*365 + leapYearCnt)%7; //1월1일 구하기.
 for(k=0; k<12; k++)
 {
  dayCnt=0;


  if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
  {
   thisMonth= 31;
  }
  else if( (k==3) | (k==5) | (k==8) | (k==10) )
  {
   thisMonth= 30;
  }
  else if(k==1)
  {
   if(LeapYear(year))
   {
    thisMonth= 29;
   }
   else {
    thisMonth= 28;
   }
  }


  for(i=0; i<6; i++)
  {
   for(j=0; j<7; j++)
   {
    dayCnt++;
    month[k][i][j]= dayCnt-lastMonth;

    if(month[k][i][j]<1 || month[k][i][j]>thisMonth)
     month[k][i][j]=0; 
   }
  }

  if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
  {
   lastMonth= (lastMonth+31)%7;
  }
  else if( (k==3) | (k==5) | (k==8) | (k==10) )
  {
   lastMonth= (lastMonth+30)%7;
  }
  else if(k==1)
  {
   if(LeapYear(year))
   {
    lastMonth= (lastMonth+29)%7;
   }
   else {
    lastMonth= (lastMonth+28)%7;
   }
  }

 }


 for(k=0;k<12;k++)
 {
  printf("--------%d 월-------- \n", k+1);
  printf("일 월 화 수 목 금 토 \n");
  for(i=0;i<6;i++)
  {
   for(j=0;j<7;j++)
   {
    if (0==month[k][i][j])
    {
     printf("   ");
     continue;
    }
    printf("%2d ", month[k][i][j]);
   }
   printf("\n");
  }
  printf("\n");
  printf("\n");
 }

 
}

실행 결과 :

이러한 결과를 볼 수 있습니다.
(길어서 아래쪽을 짤렸군요. )
(while문으로 무한루프를 해뒀으니 계속 입력 가능합니다. )

그리고 다음은

--------1월--------        --------2월--------        --------3월--------
 1  2   3   4   5   6   7         1  2   3   4   5   6   7         1  2   3   4   5   6   7
 8  9  10  11 12 13  14        8  9  10  11 12 13  14         8  9  10  11 12 13  14
15 16 17  18 19 20  21       15 16 17  18 19 20  21        15 16 17  18 19 20  21
22 23 24  25 26 27  28       22 23 24  25 26 27  28        22 23 24  25 26 27  28
29 30 31                         29                                  29 30 31

--------4월--------        --------5월--------        --------6월--------
 1  2   3   4   5   6   7         1  2   3   4   5   6   7         1  2   3   4   5   6   7
 8  9  10  11 12 13  14        8  9  10  11 12 13  14         8  9  10  11 12 13  14
15 16 17  18 19 20  21       15 16 17  18 19 20  21        15 16 17  18 19 20  21
22 23 24  25 26 27  28       22 23 24  25 26 27  28        22 23 24  25 26 27  28
29 30                             29 30 31                          29 30
             .                                     .                                     .
             .                                     .                                     .
             .                                     .                                     .

형태의 출력입니다.
(소스를 보기 전 먼저 한 번 바꿔서 해보시기 바랍니다! )

소스 :


#include<stdio.h>

int LeapYear (int a);
void Calendar (int year);

int main(void)
{
 int year;

 while (1)
 {

 printf("년도 입력시 해당연도의 달력 출력 \n");
 printf("년도 입력 : ");
 scanf("%d", &year);

 Calendar(year);

 }

 return 0;
}


///////////////////////////////윤년 계산/////////////////////////
int LeapYear(int a)
{
 if( (0==a%4 && 0!=a%100) || 0==a%400 )
 {
  return 1;
 }
 return 0;
}

 


///////////////////////////////실질적 달력 입력, 출력/////////////////////////

void Calendar(int year)
{
 int i, j, k, l;
 int dayCnt, leapYearCnt=0;
 int lastMonth, thisMonth=31;
 int month[12][6][7];

 for(i=1; i<year; i++)
 {
  leapYearCnt+=LeapYear(i);
 }

 lastMonth = (year*365 + leapYearCnt)%7; //1월1일 구하기.
 for(k=0; k<12; k++)
 {
  dayCnt=0;


  if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
  {
   thisMonth= 31;
  }
  else if( (k==3) | (k==5) | (k==8) | (k==10) )
  {
   thisMonth= 30;
  }
  else if(k==1)
  {
   if(LeapYear(year))
   {
    thisMonth= 29;
   }
   else {
    thisMonth= 28;
   }
  }


  for(i=0; i<6; i++)
  {
   for(j=0; j<7; j++)
   {
    dayCnt++;
    month[k][i][j]= dayCnt-lastMonth;

    if(month[k][i][j]<1 || month[k][i][j]>thisMonth)
     month[k][i][j]=0; 
   }
  }

  if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
  {
   lastMonth= (lastMonth+31)%7;
  }
  else if( (k==3) | (k==5) | (k==8) | (k==10) )
  {
   lastMonth= (lastMonth+30)%7;
  }
  else if(k==1)
  {
   if(LeapYear(year))
   {
    lastMonth= (lastMonth+29)%7;
   }
   else {
    lastMonth= (lastMonth+28)%7;
   }
  }

 }


 for(l=0; l<4; l++)  //4번(3달씩)
 {
  printf("--------%d 월-------- \t--------%d 월-------- \t--------%d 월-------- \n", l*3+1, l*3+2, l*3+3);
  printf("일 월 화 수 목 금 토 \t일 월 화 수 목 금 토 \t일 월 화 수 목 금 토 \n");
  for(k=0; k<6; k++) // 6번(한주를 여섯번)
  {

   for(j=0; j<3; j++)  //3달씩
   {
    for(i=0; i<7; i++) //한주(하루 하루~)
    {
     if(month[(l*3)+j][k][i]==0) {
      printf("   ");
      continue;
     }
     printf("%2d ", month[(l*3)+j][k][i]);
    }
    printf("\t");
   }
   printf("\n");
  }
  printf("\n\n");
 }
}

자! 아시겠나요?
위쪽은 모두 똑같고. 출력하는 부분(굵은부분)만 바뀌었습니다.

실행 결과 :

위와 같은 출력을 받았습니다.
훨씬 보기 좋죠!?

이번에 한 해를 입력하면 그 해의 달력을 구하는 프로그램을 만들어 봤습니다.


궁금한 점 있으시거나, 좋은 도움말 주실 분은 댓글로 남겨주세요! ^^

긴 글 읽으시느라 고생하셨습니다.
감사합니다~^^

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

난수 발생 시키기.  (0) 2011.09.25
포인터 (Pointer) - 기초2  (2) 2011.05.17
포인터 (Pointer) - 기초  (2) 2011.05.13
프로그래밍 시 유의사항 (팁)  (2) 2011.05.13
윤년 계산과 응용.  (3) 2011.05.12
Comments