カレンダー関係で必要なメソッドを記述してみましょう。 まず、引数に年を貰って閏年かどうかを論理値で返すメソッド(isLeapYear)です。 閏年ならtrueを、平年ならfalseを返します。
boolean isLeapYear( int year ) { return year % 400 == 0 || year % 4 == 0 && year % 100 != 0 ; }
次に、引数に年と月を貰って、その月の日数(整数)を返すメソッド(getMonthDays)です。 2月の場合は、isLeapYear( )を用いて閏年かどうかみています。 後は小の月の条件を論理式で記述しています。
int getMonthDays( int year, int month ) { if ( month == 2 ) { if ( isLeapYear( year ) ) { return 29; } else { return 28; } } else if ( month%2==0 && month<8 || month%2==1 && month>8 ) { return 30; } else { return 31; } }
次のメソッドは、上記のgetMonthDaysメソッドを用いて、 指定された年(year)において、指定された月(month)の最初の日が始まるまでの 日数を求めています。
int countDays( int year, int month ) { int countday = 0; for ( int m=1; m < month; m++ ) { countday += getMonthDays( year, m ); } return countday; }
ある年のある月のある日がその年の通算何日目かを求めてみましょう。 2008年は閏年ですね。2月は29日で終わります。 それを踏まえて、ある年のある月とその月の日の3つの値を 入力してもらうと、その年の1月1日から数えて何日目であるかを求めることができます。 大の月と小の月、しかも2月は閏年かどうかも計算にいれなければいけません。 CountTotalDaysというクラス名で作成し、コンパイルし、実行します。
以下のメソッドは、1900年から、指定された年(year)の最初の日が始まるまでの日数を求めています。 グレゴリオ暦は、1582年〜1700年ぐらいまででヨーロッパで導入されましたが、 アジア圏で導入されたのは、1873年の日本からです。 1900年ぐらいまでは、ユリウス暦からのいろいろな調整で、日付が結構変更されていますので、 1900年から日数を数えることに致しました。 isLeapYearメソッドを用いて、閏年なら366を、平年なら365を足し込んでいっています。
int countAllDays( int year ) { int countday = 0; for ( int y=1900; y < year; y++ ) { countday += ( isLeapYear( y ) ) ? 366 : 365; } return countday; }
最後は、引数に年と月を貰って、その月の第1日目が何曜日で始まるかを整数で返すメソッドです。 指定された年(year)・月(month)の始まる前の日が1900年1月1日から数えて何日目であるか求めて、 その月の始まる曜日を求めています。 0…日曜日〜6…土曜日という形で求まります。 countAllDaysとcountDaysメソッドを用いています。
int getStartWeekDay( int year, int month ) { int everyday = countAllDays( year ) + countDays( year, month ); return ( everyday + 1 ) % 7; // 1を足しているのは、1900年1月1日が月曜だから }
1900年以降の年について、 入力された年、月、日について、その日の曜日を求めるようなプログラムを作成しなさい。 上記のgetStartWeekDayで入力された年と月が、1900年1月1日から、通算何日目であるかがわかります。 思考例として、2000年2000年1月1日から通算何日目を考えてみましょう。 たとえば、2003年の6月15日は、2000年が閏年なので366日、2001年と2002年が平年なので365日です。 2003年は平年なので、1月が31日、2月が28日、3月が31日、4月が30日、5月が31日あります。 そうすると、2003年6月15日は、2000年1月1日から数えて、366+365+365+31+28+31+30+31日と 加えて、6月の15日分になりますので、1262日目です。 2000年1月1日から数えていますので、何日経過したかといえば、-1して1261日経過しました。 これを1週間の7で割った余りを求めて下さい。1261%7→2になります。 それが曜日に対応する数値になります。 ちなみに2000年1月1日は、土曜日でしたから、この分も足さなければなりません。 日曜日=0,月曜日=1,火曜日=2,水曜日=3, 木曜日=4, 金曜日=5, 土曜日=6としています。 ですから、土曜日に対応する6を足します。(1+6)%7→0です。0は日曜日ということです。 CalculateWeekDayというクラス名で作成し、コンパイルし、実行します。
上記のメソッドを利用して、指定された年・月のカレンダーを表示するプログラムを作りなさい。 クラス名は、DisplayCompleteCalendarにて。
指定された年 の十二支も 表示するようにしてみなさい。ちなみに2000年は辰年でした。
<<Graphics and Curves | ⋏ Return to Columns | >>Environments |