我正在处理Java作业,它涉及在用户指定月份和年份之后打印日历。我不能使用Calendar或GregorianCalendar类。我的问题是日历在星期六的第一天无法正确打印月份。我已经看了大约一个小时的代码,但不确定出什么问题。我正在使用Zeller的Congruence查找以“ h”表示的每月的第一天。
例如,2008年3月的日历(错误地)如下所示:
March 2008 Su Mo Tu We Th Fr Sa 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 30 31
这是我的代码:
package calendar; import java.util.Scanner; public class Calendar { private static int numDays = 0; private static int h = 0; public static boolean leap(int year) { if(((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) { return true; } else { return false; } } public static void firstDayOfYear(int year) { int month = 13; year--; h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7; String dayName = ""; switch(h) { case 0: dayName = "Saturday"; break; case 1: dayName = "Sunday"; break; case 2: dayName = "Monday"; break; case 3: dayName = "Tuesday"; break; case 4: dayName = "Wednesday"; break; case 5: dayName = "Thursday"; break; default: dayName = "Friday"; break; } System.out.println("The first day of the year is " + dayName); } public static void firstDayOfMonth(int month, int year) { if(month == 1 || month == 2) { month += 12; year--; } h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7; String dayName = ""; switch(h) { case 0: dayName = "Saturday"; break; case 1: dayName = "Sunday"; break; case 2: dayName = "Monday"; break; case 3: dayName = "Tuesday"; break; case 4: dayName = "Wednesday"; break; case 5: dayName = "Thursday"; break; default: dayName = "Friday"; break; } System.out.println("The first day of the month is " + dayName); } public static void numDaysInMonth(int month, int year) { int[] days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && leap(year)) days[month] = 29; numDays = days[month]; System.out.println("The number of days in the month is " + numDays); } public static void printCal(int month, int year) { String[] monthNames = {"","January","February","March","April","May","June","July","August","September","October","November","December"}; System.out.println(" " + monthNames[month] + " " + year); System.out.println("Su Mo Tu We Th Fr Sa"); for (int i = 0; i < h - 1; i++) System.out.print(" "); for (int i = 1; i <= numDays; i++) { System.out.printf("%2d ", i); if (((i + h - 1) % 7 == 0) || (i == numDays)) System.out.println(); } } public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter month (1-12): "); int month = input.nextInt(); if(month < 1 || month > 12) { System.out.println("Invalid month. Valids inputs are 1-12."); System.exit(0); } System.out.print("Enter year: "); int year = input.nextInt(); if(year < 1753) { System.out.println("Invalid year. Valid inputs are 1753 and beyond."); System.exit(0); } if(leap(year)) { System.out.println(year + " is a leap year."); } else { System.out.println(year + " is NOT a leap year."); } firstDayOfYear(year); firstDayOfMonth(month, year); numDaysInMonth(month, year); printCal(month, year); } }
从星期六开始,您的代码每个月都会遇到相同的问题。这意味着问题可能在此行中-
for (int i = 0; i < h - 1; i++) System.out.print(" ");
拥有h如7而不是0这里会为您解决问题。您可以在此处解决此问题,或者您可能需要h从1到7(而不是0到6)开始进行调整,当然还要进行其他必要的更改。
h