Prosto

윤년 계산과 응용. 본문

Programing/C Programing

윤년 계산과 응용.

Prosto 2011. 5. 12. 01:49


* C Programing *

변수, 배열, for문, if문 등을 기본적으로 이해하고 사용 할 줄 알아야합니다.
(배열은 사용 하지 않아도 가능하지만, 사용하면 더 쉽게 만들 수 있습니다.)


1. 윤년 계산


윤년의 조건
  '윤년은 4로 나누어지면서 100으로 나누어 떨어지지 않는 년.'
  '400으로 나누어 떨어지는 년.' 이 윤년이다.
 (윤년은 2월에 하루가 더 많아지는 해이다.)

먼저 이 윤년을 구하는 공식을 이용하여
연도를 입력하면 해당 연도가 윤년인지 아닌지 확인하는 프로그램을 만들어 본다. 


2. 윤년 계산을 통한 응용


윤년 계산하는 프로그램을 제대로 만들 수 있다면
다음으로
특정 연도를 입력하면 그 연도의 1월 1일이 무슨 요일인지를 구하는 프로그램을 만들어 본다.

* 조건
  - 서기 1년 1월 1일은 월요일이다.
  - 윤년은 4로 나누어지며 100으로 나누어 떨어지지 않는 년, 또는 400으로 나누어 떨어지는 년이다.

출력 결과 :
 =>  2년 : 화요일
 =>  2011년 : 토요일
 =>  2012년 : 일요일
 =>  2013년 : 화요일
와 같은 결과가 나와야 한다.


3. 윤년 계산을 통한 응용 2


해당 연도의 요일을 구하는 프로그램까지 성공했다면
마지막으로
연도를 입력 받아 해당 연도의 1월 달 달력을 출력하는 프로그램을 만들어본다.

* 조건
   - 1월은 31일까지 있다.
   - 달력의 형태는 다음과 같다.
               (예 : 2014년도 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   
 이러한 형태로 출력되어야 한다.



+ HINT
   - 입력한 연도까지가 며칠인지 계산하여야한다.
    (1년 : 기본 365일 ( 윤년일 때 + 1일 ) )
   - 요일은 일주일 마다 다시 돌아온다.
   - 달력의 경우 배열을 이용하면 편하다. (사용 하지 않아도 간단하게 가능.)

   -윤년의 경우는 2월에 있다! 알고자하는 것은 연도의 1월 달력이기 때문에 관계 없다!




정상적인 작성 프로그램 실행시 출력 결과. (3번 문제)













답안. (이러한 형태로 소스를 짜고 제대로된 결과가 출력되야 합니다.)
 *간단한 설명도 함께 썼습니다.

--------- c언어 소스 ---------

#include<stdio.h>

void LeapYear ();    // LeapYear 사용자 정의 함수 선언.

int main (void) {
 int year;
 while (1) {    // 무한루프. ( 계속 값을 입력받고 출력하기 위하여. )

  printf("년도 입력 : ");
  scanf("%d", &year);

 LeapYear(year);    // 입력된 값 year변수를 전달하며 LeapYear 함수 실행

 }
}

void LeapYear(int year) {
 int i, j;    // for문에 사용.
 int cnt=0, day;    // cnt 윤년이 몇번이나 있는지 헤아리기 위함. // day 요일 구분.
 int arr[6][7];    // 달력 출력의 용이를 위하여 배열 선언 

 for(i=1; i<year; i++) {
  if( (i%4==0 && i%100!=0) || i%400==0) {    // 윤년 계산.
   cnt++;
  }
 }
 day = ( (year*365) + cnt ) % 7;

 switch (day) {    //나머지를 구하여 0이면 일요일 1이면 월요일 .....
  case 0 :
   printf("일요일 입니다. \n");
   break;
   case 1 :
   printf("월요일 입니다. \n");
   break;
   case 2 :
   printf("화요일 입니다. \n");
   break;
   case 3 :
   printf("수요일 입니다. \n");
   break;
   case 4 :
   printf("목요일 입니다. \n");
   break;
   case 5 :
   printf("금요일 입니다. \n");
   break;
   default :
   printf("토요일 입니다. \n");
 }

 for(i=0; i<6; i++) {    // 배열에 1월 1일의 요일부터 차례로 1, 2, 3 .... 입력.
  for(j=0; j<7; j++) {
   arr[i][j] = (i*7 + j +1 ) - day;
  }
 }


 printf("일 월 화 수 목 금 토 \n");    // 원하는 달력의 형식대로 만듦
 for(i=0; i<6; i++) {
  for(j=0; j<7; j++) {
   if(arr[i][j]<1 || arr[i][j]>31) {    //값이 1 미만, 31 초과 일 경우 공란만 표시.
    printf("   "); 
    continue;
   }
   printf("%2d ", arr[i][j]);    //값이 알맞으면 1일부터 차례로 출력.
  }
  printf("\n");
 }


}

---------------------------



부족하지만.. 간단한 설명과 함께 올렸으니
소스와 함께 천천히 보시길 바랍니다.

궁금한 점 있으시면 댓글 달아주세요 ^^
확인 즉시 답글 드리겠습니다!

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

난수 발생 시키기.  (0) 2011.09.25
포인터 (Pointer) - 기초2  (2) 2011.05.17
1년 달력 계산 (윤년)  (5) 2011.05.15
포인터 (Pointer) - 기초  (2) 2011.05.13
프로그래밍 시 유의사항 (팁)  (2) 2011.05.13
Comments