Prosto
윤년 계산과 응용. 본문
* 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 |