编写一个万年历,能够根据输入的年打印一整年的日历情况java
时间: 2023-08-31 21:32:07 浏览: 116
一个用java实现的万年历
### 回答1:
以下是Java代码实现:
```java
import java.util.Scanner;
public class Calendar {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scanner.nextInt();
// 计算该年第一天是星期几
int firstDayOfWeek = getFirstDayOfWeek(year);
// 逐月打印日历
for (int i = 1; i <= 12; i++) {
printMonth(year, i, firstDayOfWeek);
// 计算下个月的第一天是星期几
firstDayOfWeek = (firstDayOfWeek + getDaysOfMonth(year, i)) % 7;
}
}
// 获取某个月的天数
private static int getDaysOfMonth(int year, int month) {
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year)) {
return 29;
}
return days[month - 1];
}
// 判断是否为闰年
private static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
// 获取某年第一天是星期几
private static int getFirstDayOfWeek(int year) {
int day = 1;
for (int i = 1900; i < year; i++) {
if (isLeapYear(i)) {
day = (day + 366) % 7;
} else {
day = (day + 365) % 7;
}
}
return day;
}
// 打印某个月的日历
private static void printMonth(int year, int month, int firstDayOfWeek) {
System.out.printf("%d年%d月\n", year, month);
System.out.println("日 一 二 三 四 五 六");
// 打印该月第一天之前的空格
for (int i = 0; i < firstDayOfWeek; i++) {
System.out.print(" ");
}
// 打印该月每一天的日期
for (int i = 1; i <= getDaysOfMonth(year, month); i++) {
System.out.printf("%2d ", i);
if ((firstDayOfWeek + i) % 7 == 0) {
System.out.println();
}
}
// 换行
System.out.println();
}
}
```
运行程序后,输入年份,即可打印该年的万年历。
### 回答2:
编写一个万年历,能够根据输入的年打印一整年的日历情况的Java代码如下:
```java
import java.util.Scanner;
public class CalendarPrinter {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入年份:");
int year = input.nextInt();
printCalendar(year);
}
public static void printCalendar(int year) {
int days = getDaysOfYear(year);
int startDay = getStartDay(year);
String[] months = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
for (int month = 0; month < months.length; month++) {
System.out.println(months[month]);
System.out.println("日 一 二 三 四 五 六");
int dayCount = 1;
for (int i = 0; i < startDay; i++) {
System.out.print(" ");
dayCount++;
}
for (int day = 1; day <= daysInMonth(year, month + 1); day++) {
System.out.printf("%2d ", day);
dayCount++;
if (dayCount > 7) {
System.out.println();
dayCount = 1;
}
}
System.out.println("\n");
startDay = (startDay + daysInMonth(year, month + 1)) % 7;
}
}
public static int getDaysOfYear(int year) {
if (isLeapYear(year)) {
return 366;
} else {
return 365;
}
}
public static int getStartDay(int year) {
int startDay1800 = 3; // 1800年1月1日为星期三
int totalDays = 0;
for (int i = 1800; i < year; i++) {
if (isLeapYear(i)) {
totalDays += 366;
} else {
totalDays += 365;
}
}
return (startDay1800 + totalDays) % 7;
}
public static int daysInMonth(int year, int month) {
int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year)) {
return 29;
} else {
return daysInMonth[month - 1];
}
}
public static boolean isLeapYear(int year) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return true;
} else {
return false;
}
}
}
```
这段代码中,我们首先输入一个年份,然后调用`printCalendar`函数打印该年份的日历。在`printCalendar`函数中,我们使用循环遍历每个月,然后根据每个月的天数和起始星期计算并打印每个月的日历。需要注意的是,我们使用了`getDaysOfYear`函数来获取一年的总天数,使用`getStartDay`函数来获取指定年份的1月1日是星期几,使用`daysInMonth`函数来获取每个月的天数,以及使用`isLeapYear`函数来判断指定年份是否为闰年。
### 回答3:
编写一个万年历程序,可以根据输入的年份打印出该年的整个日历。
首先,我们可以定义一个方法,该方法接受输入的年份作为参数。在该方法中,我们可以使用循环来遍历一整年的所有月份。
在每个月份的循环中,我们可以利用Java的日期和时间库(如java.time包)来计算该月的第一天是星期几。然后,在打印日历之前,我们可以根据第一天的星期计算出每个月份第一天之前应该显示的空格数量。
接下来,我们可以使用两个嵌套循环来打印该月份的所有日期。第一个循环将打印星期几的标签,而第二个循环将打印日期数字。这里我们需要注意,当日期为1时,需要判断是否需要打印空格来对齐。
最后,我们可以在该方法中调用上述逻辑,完成整个年份的日历打印。
以下是一个简化的示例代码:
```java
import java.time.DayOfWeek;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
printCalendar(2022);
}
public static void printCalendar(int year) {
for (int month = 1; month <= 12; month++) {
LocalDate date = LocalDate.of(year, month, 1);
DayOfWeek firstDayOfWeek = date.getDayOfWeek();
System.out.println("\n----- " + date.getMonth() + " -----");
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < firstDayOfWeek.getValue(); i++) {
System.out.print(" "); // 打印空格
}
int daysInMonth = date.lengthOfMonth();
int dayOfWeek = firstDayOfWeek.getValue();
for (int day = 1; day <= daysInMonth; day++) {
System.out.printf("%3d ", day); // 打印日期
if (dayOfWeek == 7) {
System.out.println();
dayOfWeek = 1;
} else {
dayOfWeek++;
}
}
}
}
}
```
以上是一个简单的万年历打印程序的实现。可以根据输入的年份,打印出该年的整个日历。请注意,此示例未考虑闰年的情况,以及对齐和美观的调整。实际应用中可能需要更多的逻辑处理和样式美化。
阅读全文