1、题目
已知1900年1月1日是星期一,请用户输入查询的年份以及月份,查询出对应的万年历,示例如下图所示:
2、代码
import java.util.Scanner; public class Test { // 类名要与文件名保持一致 public static void main(String[] args) { System.out.println("********** 欢迎使用万年历 **********"); // 创建Scanner类型的对象 input 使用关键字new来创建对象,System.in 输入流 指代输入设备 Scanner input = new Scanner(System.in); System.out.print("请输入查询的年份:"); int year = input.nextInt(); // 后期优化:只能输入大于1900的年份且为整数 System.out.print("请输入查询的月份:"); int month = input.nextInt(); input.close(); // 总天数 int sumDay = 0; int yearDays = 0; int beforeInputMonthDay = 0; // 输入月份的前面月对应天数 // 计算1900到输入查询年份的天数(输入年前的天数) for (int i = 1900; i < year; i++) { // 计算1900年到输入查询年份 前一年 的天数 if (IsLeapYear(i)) { yearDays += 366; } else { yearDays += 365; } } // 计算输入查询年份对应输入月份前的天数(输入月前的天数) for (int j = 1; j < month; j++) { beforeInputMonthDay += weekDay(j, year); } // 计算输入月的天数 int inputMonthDay = weekDay(month, year); sumDay = yearDays + beforeInputMonthDay; // 计算查询的月份1号是星期几 int weekDay1st = sumDay % 7 + 1; // 打印日历 System.out.println("一\t二\t三\t四\t五\t六\t日"); for (int i = 1; i < weekDay1st; i++) { System.out.print(" \t"); } for (int i = 1; i <= inputMonthDay; i++) { // 1号开始展示,所有i从1开始 System.out.print(i + "\t"); if ((i - 1 + weekDay1st) % 7 == 0) { // i从1开始,数组索引小标从0开始,所有这里要减1 System.out.println(); } } } // 判断是否是闰年 public static boolean IsLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true; else return false; } // 判断每个月的天数(2月份需要判断是否是闰年) public static int weekDay(int month, int year) { int monthday = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: monthday = 31; break; case 2: if (IsLeapYear(year)) monthday = 29; else monthday = 28; break; case 4: case 6: case 9: case 11: monthday = 30; break; default: System.out.print("请输入1-12月份"); break; } return monthday; } }
3、测试验证