- ベストアンサー
カレンダー作成について質問です
- 初めましてGANJISと申します。Javaの勉強中にカレンダー作成の課題に取り組んでいますが、困っています。
- カレンダー作成の条件は、パラメータから年・月を受け取り、その前月、当月、次月の3ヶ月分を出力することです。
- 困っている点は、パラメータチェックメソッドの実装で、try/catch句を使用せずに数値チェックを行う方法が分からないことです。お力をお貸しください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あなたのプログラムは現状でほぼ完成していると思います。 モンダイは、数値チェックを例外に頼らずに自前のメソッドでやれという部分ですね。 String[] ms = {"1", "2", .... "12"}; みたいのを月チェック用に作ってもいいですが、とりあえず、ご参考までに下のプログラムを試してください(全角スペースは半角スペース2個に変換してからコンパイルしてください)。 ---------------------------------------------------- /* save and compile as GanjisCalendar */ import java.io.*; import java.util.*; import static java.util.Calendar.*; import static java.lang.Character.*; public class GanjisCalendar { int year, month; String yStr, mStr; // staticメソッドにしてmain()から呼んでもいいが // その場合ほかのいろんなものもstaticにしないといけない public GanjisCalendar(){ year = month = -1; yStr = mStr = "-1"; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (! yearCheck(yStr)){ System.out.print("西暦を入力してください:"); yStr = br.readLine(); } year = Integer.parseInt(yStr); while (! monthCheck(mStr)){ System.out.print("月を入力してください:"); mStr = br.readLine(); } month = Integer.parseInt(mStr); // 日にち表示用の配列作成 String str[] = new String[32]; for (int i = 0; i < 32; i++) { if (i == 0) { str[i] = " "; } else if (i < 10) { str[i] = " " + i; } else { str[i] = " " + i; } } System.out.println(year + "年" + month + "月"); // うるう年かどうかを判定し年・月・曜日の表示 GregorianCalendar gc = new GregorianCalendar(year, month - 1, 1); int feb = 0; if (gc.isLeapYear(year) == true) { feb = 29; } else { feb = 28; } System.out.println("SUN MON TUE WED THR FRI SAT"); int day = gc.get(DAY_OF_WEEK); // 最初の週の空白部分 int count = 0; for (int i = SUNDAY; i < day; i++) { System.out.print(str[0] + " "); ++count; } int over; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { over = 32; } else if (month == 4 || month == 6 || month == 8 || month == 9 || month == 11) { over = 31; } else{ // 2月 over = feb + 1; } for (int i = 1; i < over; i++) { System.out.print(str[i] + " "); ++count; if (count == 7) { System.out.println(); count = 0; } } System.out.println(); } // end try catch (IOException ie){ ie.printStackTrace(); } } boolean yearCheck(String s){ for (int i = 0; i < s.length(); ++i){ char c = s.charAt(i); if (! isDigit(c)){ System.out.println("!正の整数を入力してください!"); return false; } } return true; } boolean monthCheck(String s){ boolean retval = true; for (int i = 0; i < s.length(); ++i){ //数字だけか? char c = s.charAt(i); if (! isDigit(c)){ retval = false; break; } } if (retval){ //範囲はどうか? retval = (s.length() < 3) && (s.compareTo("1") >= 0 && s.compareTo("12") <= 0); } if (! retval){ System.out.println("!1から12までの整数を入力してください!"); } return retval; } public static void main(String args[]) throws IOException { new GanjisCalendar(); } } ---------------------------------------------
その他の回答 (3)
- _ranco_
- ベストアンサー率58% (126/214)
あっ、もう一つ、重要な指摘を忘れてました。 Calendarのように、JavaのAPI中にあるのと同名のクラスを書かないように。不可解なバグになることが、よくあります。
お礼
またまたアドバイスありがとうございます! またわからないことがありましたら、ご教授くださいませ!
補足
昨日ご参考にさせていただいたソースでみごとに作動しました! ありがとうございます! 恐縮ですがもう一つの仕様のパラメータに入力したら、 3ヶ月分のカレンダーを表示させるにはどうしたらいいでしょう? 何度も質問して申し訳ないですが、よろしくお願い致します。
- _ranco_
- ベストアンサー率58% (126/214)
がーん。急いで書いたので、やはりバグがありました。monthCheck()メソッドの、範囲チェックの部分を、下記のように直してください: ------------------------------------------- if (retval){ //範囲はどうか? if (s.length() == 1){ retval = s.compareTo("1") >= 0 && s.compareTo("9") <= 0; } else if(s.length() == 2){ retval = s.compareTo("10") >= 0 && s.compareTo("12") <= 0; } else{ retval = false; } } ---------------------------------
お礼
ご指摘のとおり修正部分に追記しました。 お手数おかけします!
- _ranco_
- ベストアンサー率58% (126/214)
工夫といえば、月の最初の行(どれだけスペースを置くか)だけでしょ。
補足
月の最初の行だけとはどういうことでしょう? 全然わかってなくてすみません・・。 私が作ったソースを載せます。 import java.io.*; import java.util.Calendar; import java.util.GregorianCalendar; public class Calender { public static void main(String args[]) throws IOException { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("西暦を入力してください:"); int year = Integer.parseInt(br.readLine()); System.out.print("月を入力してください:"); int month = Integer.parseInt(br.readLine()); if (month < 1 || month > 12) { System.out.println("月を正しく入力してください"); } // 日にち表示用の配列作成 String str[] = new String[32]; for (int i = 0; i < 32; i++) { if (i == 0) { str[i] = " "; } else if (i < 10) { str[i] = " " + i; } else { str[i] = " " + i; } } // うるう年かどうかを判定し年・月・曜日の表示 GregorianCalendar gc = new GregorianCalendar(year, month - 1, 1); int feb = 0; if (gc.isLeapYear(year) == true) { System.out.println(year + "年" + month + "月"); feb = 29; } else { System.out.println(year + "年" + month + "月"); feb = 28; } System.out.println("SUN MON TUE WED THR FRI SAT"); int day = gc.get(Calendar.DAY_OF_WEEK); // 1ヶ月31日の月の表示 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { int count = 0; for (int i = 1; i < day; i++) { System.out.print(str[0] + " "); count++; } for (int i = 1; i < 32; i++) { System.out.print(str[i] + " "); count++; if (count == 7) { System.out.println(); count = 0; } } } // 30日の月の表示 else if (month == 4 || month == 6 || month == 8 || month == 9 || month == 11) { int count = 0; for (int i = 1; i < day; i++) { System.out.print(str[0] + " "); count++; } for (int i = 1; i < 31; i++) { System.out.print(str[i] + " "); count++; if (count == 7) { System.out.println(); count = 0; } } } // 2月の表示 else if (month == 2) { int count = 0; for (int i = 1; i < day; i++) { System.out.print(str[0] + " "); count++; } for (int i = 1; i <= feb; i++) { System.out.print(str[i] + " "); count++; if (count == 7) { System.out.println(); count = 0; } } } } catch (NumberFormatException e) { System.out.println("例外:" + e); System.out.println("引数を整数で入力してください。"); } } } これを改造したいと思っています。 よろしくお願いします。
お礼
お返事遅れてしまってすみません:; わざわざソースまで書いていただいてありがとうございます! こちらのプログラムを試させていただきますね!