Java语言程序设计基础篇原书第十版第六章日历复习题
import java.util.Scanner;
public class PrintCalendar {
public static void main(String[] args) {
// TODO Auto-generated method stub
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("Enter full year :");
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) {
// TODO Auto-generated method stub
printMonthTitle(year, month);
printMonthBody(year, month);
}
public static void printMonthTitle(int year, int month) {
// TODO Auto-generated method stub
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) {
// TODO Auto-generated method stub
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) {
// TODO Auto-generated method stub
//一个月第一天
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++) {
//格式化输出十进制整型数据,“%4d”是数据长度
System.out.printf("%4d",i);
if((i+startDay) % 7 == 0) {
System.out.println();
}
}
System.out.println();
}
public static int getStartDay(int year,int month) {
//这个1800年1月1日可以改成别的日期,在这只是举例子
final int START_DAY_FOR_JAN_1_1800 = 3;
int totalNumberOfDays = getTotalNumberOfDays(year, month);
//算一个月第一天是星期几,就拿开算的日期与要算的日历月份第一日相差的总天数+开始算的日期所属的星期几 然后除以7取模
return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
}
public static int getTotalNumberOfDays(int year, int month) {
int total = 0;
for(int i = 1800;i < year; i++)
if(isLeapYear(i))
total = total+366;
else {
total = total+365;
}
for(int i = 0;i < month;i++) {
total = total + getNumberOfDaysInMonth(year, i);
}
return total;
}
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) {
// TODO Auto-generated method stub
return year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 );
}
}