fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. class CalendarPrinter
  8. {
  9. private boolean IsUruu(int year)
  10. {
  11. if (year % 400 == 0) {
  12. return true;
  13. }
  14. if (year % 100 == 0) {
  15. return false;
  16. }
  17. if (year % 4 == 0) {
  18. return true;
  19. }
  20. return false;
  21. }
  22.  
  23. // 引数の年の1月1日の曜日を取得する(日曜なら0)
  24. private int GetYearStartDay(int year)
  25. {
  26. if(year <= 1)
  27. {
  28. return 0;
  29. }
  30. int yearDayCount = 365;
  31. if(IsUruu(year))
  32. {
  33. ++yearDayCount;
  34. }
  35. return (GetYearStartDay(year-1) + yearDayCount) % 7;
  36. }
  37.  
  38. private int GetDayCount(int year, int month)
  39. {
  40. if(month == 2)
  41. {
  42. return IsUruu(year) ? 29 : 28;
  43. }
  44. if(month == 2 ||
  45. month == 4 ||
  46. month == 6 ||
  47. month == 9 ||
  48. month == 11)
  49. {
  50. return 30;
  51. }
  52. if(month == 1 ||
  53. month == 3 ||
  54. month == 5 ||
  55. month == 7 ||
  56. month == 8 ||
  57. month == 10 ||
  58. month == 12)
  59. {
  60. return 31;
  61. }
  62. assert false : "month is invalid (" + month +")";
  63. return 0;
  64. }
  65.  
  66. // 引数の年月の1日の曜日を取得する(日曜なら0)
  67. private int GetMonthStartDay(int year, int month, int yearStartDay)
  68. {
  69. int dayCountSum = 0;
  70. for(int i=1; i<month; ++i)
  71. {
  72. dayCountSum += GetDayCount(year, i);
  73. }
  74. return (yearStartDay + dayCountSum) % 7;
  75. }
  76.  
  77. public void Print(int year, int month)
  78. {
  79. int yearStartDay = GetYearStartDay(year);
  80. int monthStartDay = GetMonthStartDay(year, month, yearStartDay);
  81.  
  82. // 「カレンダーの表示を開始します」みたいな、
  83. // コードを見たらすぐわかるコメントは不要
  84. System.out.println(" " + year + "年 " + month + "月");
  85. System.out.println("日 月 火 水 木 金 土");
  86.  
  87. for (int i = 0; i < monthStartDay; ++i)
  88. {
  89. System.out.print(" ");
  90. }
  91. int printingDay = monthStartDay;
  92. int monthDayCount = GetDayCount(year, month);
  93. for (int i = 1; i <= monthDayCount; ++i)
  94. {
  95. System.out.print(String.format("%2d ", i));
  96. ++printingDay;
  97. if(printingDay %7 == 0)
  98. {
  99. System.out.println("");
  100. }
  101. }
  102. System.out.println("");
  103. }
  104. }
  105.  
  106. class YearMonthLoader
  107. {
  108. public int year;
  109. public int month;
  110. private boolean isYearInputed;
  111. private boolean isMonthInputed;
  112. private Scanner scanner;
  113.  
  114. final private int YearMin = 2000;
  115. final private int YearMax = 2040;
  116.  
  117. YearMonthLoader()
  118. {
  119. scanner = new Scanner(System.in);
  120. }
  121. public boolean IsValidYear(int num)
  122. {
  123. return num >= YearMin && num <= YearMax;
  124. }
  125. public boolean IsValidMonth(int num)
  126. {
  127. return num >= 1 && num <= 12;
  128. }
  129. public void Load()
  130. {
  131. isYearInputed = false;
  132. isMonthInputed = false;
  133. while(true)
  134. {
  135. String inputStr = scanner.nextLine();
  136. try
  137. {
  138. int input = Integer.parseInt(inputStr);
  139. if(!isYearInputed && IsValidYear(input))
  140. {
  141. year = input;
  142. isYearInputed = true;
  143. continue;
  144. }
  145. else if(isYearInputed && IsValidMonth(input))
  146. {
  147. month = input;
  148. isMonthInputed = true;
  149. return;
  150. }
  151. }
  152. {
  153. }
  154. System.out.println("正しい入力ではありません。");
  155. }
  156. }
  157. }
  158.  
  159. class Calendar
  160. {
  161. public static void main (String[] args)
  162. {
  163. YearMonthLoader loader = new YearMonthLoader();
  164. loader.Load();
  165. CalendarPrinter calendar = new CalendarPrinter();
  166. calendar.Print(loader.year, loader.month);
  167. }
  168. }
Success #stdin #stdout 0.14s 29636KB
stdin
0
-1
a
null
2016
2
stdout
正しい入力ではありません。
正しい入力ではありません。
正しい入力ではありません。
正しい入力ではありません。
     2016年 2月
日 月 火 水 木 金 土
    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