第六章第三十四题(打印日历)(Print calendar)
**6.34(打印日历)编程练习题3.21使用Zeller一致性原理来计算某天是星期几。使用Zeller的算法简化程序清单6-12以获得每月开始的第一天是星期几。 **6.34(Print calendar) Programming Exercise 3.21 uses Zeller’s congruence to calculate the day of the week. Simplify Listing 6.12, PrintCalendar.java, using Zeller’s algorithm to get the start day of the month.参考代码:
package chapter06
;
import java
.util
.Scanner
;
public class Code_34 {
public static void main(String
[] args
) {
Scanner input
= new Scanner(System
.in
);
System
.out
.print("Enter full year (e.g., 2012): ");
int year
= input
.nextInt();
System
.out
.print("Enter month as a number between 1 and 12: ");
int month
= input
.nextInt();
printMonth(year
, month
);
}
public static void printMonth(int year
, int month
) {
printMonthTitle(year
, month
);
printMonthBody(year
, month
);
}
public static void printMonthTitle(int year
, int month
) {
System
.out
.println(" " + getMonthName(month
) + " " + year
);
System
.out
.println("-----------------------------");
System
.out
.println(" Sun Mon Tue Wed Thu Fri Sat");
}
public static String
getMonthName(int month
) {
String monthName
= "";
switch (month
) {
case 1:
monthName
= "January";
break;
case 2:
monthName
= "February";
break;
case 3:
monthName
= "March";
break;
case 4:
monthName
= "April";
break;
case 5:
monthName
= "May";
break;
case 6:
monthName
= "June";
break;
case 7:
monthName
= "July";
break;
case 8:
monthName
= "August";
break;
case 9:
monthName
= "September";
break;
case 10:
monthName
= "October";
break;
case 11:
monthName
= "November";
break;
case 12:
monthName
= "December";
}
return monthName
;
}
public static void printMonthBody(int year
, int month
) {
int startDay
= getStartDay(year
, month
);
int numberOfDaysInMonth
= getNumberOfDaysInMonth(year
, month
);
int i
= 0;
for (i
= 0; i
< startDay
; i
++)
System
.out
.print(" ");
for (i
= 1; i
<= numberOfDaysInMonth
; i
++) {
System
.out
.printf("%4d", i
);
if ((i
+ startDay
) % 7 == 0)
System
.out
.println();
}
System
.out
.println();
}
public static int getStartDay(int year
, int month
) {
int day
= 1, h
, q
, m
, j
, k
,statement
;
q
= day
;
if(month
== 1 || month
== 2) {
month
+= 12;
year
-= 1;
}
m
= month
;
j
= year
/ 100;
k
= year
% 100;
h
= (q
+ (26 * (m
+ 1) / 10) + k
+ k
/ 4 + j
/ 4 + 5 * j
) % 7;
switch(h
) {
case 0:
statement
= 6; break;
case 1:
statement
= 0; break;
case 2:
statement
= 1; break;
case 3:
statement
= 2; break;
case 4:
statement
= 3; break;
case 5:
statement
= 4; break;
case 6:
statement
= 5; break;
default:
statement
= -1;
}
return statement
;
}
public static int getNumberOfDaysInMonth(int year
, int month
) {
if (month
== 1 || month
== 3 || month
== 5 || month
== 7 || month
== 8 || month
== 10 || month
== 12)
return 31;
if (month
== 4 || month
== 6 || month
== 9 || month
== 11)
return 30;
if (month
== 2)
return isLeapYear(year
) ? 29 : 28;
return 0;
}
public static boolean isLeapYear(int year
) {
return year
% 400 == 0 || (year
% 4 == 0 && year
% 100 != 0);
}
}
结果显示:
Enter full year
(e
.g
., 2012): 2012
Enter month as a number between
1 and
12: 2
February
2012
-----------------------------
Sun Mon Tue Wed Thu Fri Sat
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
Process finished with exit code
0