본문 바로가기
[ Web ]/JAVA_JSP_TOMCAT_Eclipse

만년 달력 만들기

by 관이119 2012. 9. 13.
정보문화사 : IT 서적의 명가 | 길라잡이
http://blog.naver.com/infopub/100037947192

 

 

문제 내용 : 2005년 3월 달력을 출력하자.
학습 내용 : 배열과 메서드를 이용하여 달력을 만든다.
힌트 내용 : 윤년의 횟수를 구한다.


소스 - CalendarIn7.java
01: public class CalendarIn7{ // 섹션 101 CalendarMain
02: private int month[] = new int[]{31,28,31,30,31,30,31,31,30,31,30,31}; // 평년
03: private int lmonth[] = new int[]{31,29,31,30,31,30,31,31,30,31,30,31}; // 윤년
04: public boolean leapYearTF(int year){ // 윤년 확인
05: boolean yearTF= false;
06: if( (0 == (year % 4) && 0 != (year %100)) || 0 == year%400 )
07: yearTF = true;
08: return yearTF;
09: }
10: // 1∼year까지 윤년 횟수 구하기
11: public int howManyLeapYear(int year){
12: int count = 0;
13: for(int i = 1; i <=year; i++){
14: if ( leapYearTF(i) ){
15: count++;
16: }
17: }
18: return count;
19: }
20: // 2005/9/25일이면 (2005/1/1∼2005/8/31)일 총 일수 + 25(9월)
21: public int howManyDaysInYearsMonth(int year, int month, int day){
22: int count = day;
23: if ( leapYearTF(year) ){
24: for(int i = 0; i < month-1; i++){
25: count+=this.lmonth[i];
26: }
27: }else{
28: for(int i = 0; i < month-1; i++){
29: count+=this.month[i];
30: }
31: }
32: return count;
33: }
34: // 시작 날짜가 0-->일,1-->월,2-->화,3-->수,4-->목,5-->금,6-->토
35: public int startDayInCal(int year, int month){ // 년 월 1일의 첫날
36: int count=0;
37: int leapYear=howManyLeapYear(year-1);
38: int howManyDaysInYear=howManyDaysInYearsMonth(year,month,1);
39: count=((leapYear)*2+(year-1-leapYear)+howManyDaysInYear);
40: return count%7;
41: }
42: public boolean isLastDay(int year, int month,int day){ // 마지막날
43: boolean isL=false;
44: if(!leapYearTF(year)){
45: if(day==this.month[month-1]){ // 평년 2월-->28
46: isL=true;
47: }
48: }else{
49: if(day==this.lmonth[month-1]){ // 윤년 2월-->29
50: isL=true;
51: }
52: }
53: return isL;
54: }
55: public int getDates(int year, int month){ // 그 달에 몇 일이 있는가?
56: if(leapYearTF(year)){
57: return this.lmonth[month-1]; // 윤년
58: }else {
59: return this.month[month-1]; // 평년
60: }
61: }
62: public void printCalendar(int year, int month){
63: int linecheck = 0; // 날짜를 처음 찍는 위치를 지정하는 변수
64: String temp = ""; // 처음 문자 간격
65: System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
66: linecheck = startDayInCal(year, month); // 1일이 무슨 요일인가?
67: for(int j = 0; j < linecheck; j++){
68: temp += "\t"; // 1일이 수요일이면 탭 3개(일,월,화)
69: }
70: System.out.print(temp);
71: int count=getDates(year, month); // 그 달에 몇 일이 있는가, 28, 29, 30, 31?
72: for(int i = 1; i<= count; i++){
73: System.out.print(i + "\t");
74: linecheck ++;
75: if(linecheck == 7) { // 토요일이냐 그러면
76: if(this.isLastDay(year,month,i)){
77: return ;// 마지막 날이 끝나면 한 줄 아래로 내릴 필요 없다.
78: }
79: System.out.println();
80: linecheck = 0;
81: } // if
82: } // for
83: } // printCalendar
84: }

[0번째 줄]콘솔용 만년 달력을 만들어 보자. 만년 달력은 서기 1년 1월 1일을 월요일(1)로 가정하고, 입력한 연도와 각 달 첫날의 요일을 구하는 것에서 시작한다. 이때 윤년 여부를 반드시 확인해야 한다. 한 달 첫 날의 요일은 섹션 70에서 설명한대로 구하자. [그림 101-1]에서 2005년 3월의 첫날은 화요일이다. 여기에서 시작하여 수요일은 2, 목요일은 3...목요일인 마지막 날이 31로 출력되면 달력이 완성된다.


[3번째 줄]윤년에 대한 각 달의 일수를 배열로 선언한다. 윤년의 2월은 29일까지 있다.

[4번째 줄]윤년인지 확인한다.

[11번째 줄]2005년을 입력하면 서기 1년부터 2005년까지 윤년이 몇 번 있었는지 구한다.

[21번째 줄]2005년 9월 25일을 입력하면 2005년 1월 1일부터 2005년 8월 31일까지의 일수+25로 2005년 1월 1일부터 2005년 9월 25일까지의 총 일수를 구한다.

[35번째 줄]연도와 달을 입력하여 그 달 첫째 날의 요일을 구한다. 2005년 3월을 입력하면 2004년까지 윤년의 수를 howManyLeapYear(year-1)를 이용해 구한다. 2005/1/1부터 2005/3/1까지 일수를 구한다. 예를 들어, 2004/3/1은 월요일이다. 1년 후인 2005/3/1은 365%7=1이므로 화요일이 된다(섹션 70 참고). 이를 이용하여 1/1/1부터 2004/12/31까지 일수와 2005/1/1부터 2005/3/1까지 일수의 총합을 구한다.

[42번째 줄]입력한 날이 각 달의 마지막 날(29, 28, 30, 31)인지 판단한다.

[55번째 줄]각 달의 첫날부터 마지막 날까지 출력하려면 각 달의 마지막 날을 구해야 한다.

[66번째 줄]입력한 연도와 달의 첫날에 대한 요일을 구한다. 0, 1, 2, 3, 4, 5, 6은 각각 일, 월, 화, 수, 목, 금, 토요일이다.

[67번째 줄] [그림 101-1]과 같이 첫날이 화요일이면 탭(\t)이 두 번 들어간다.

[71번째 줄]그 달의 날짜 수를 파악한다. [그림 101-1]에서 2005년 3월은 31일까지다. 1일부터 31일까지 출력하면서 2005년 3월 5일처럼 토요일이 나오면 일요일인 6일은 한 줄 아래로 내려 출력된다.

[76번째 줄]마지막 날이 토요일이면 줄 내림 없이 끝낸다.


댓글