编程实现一个万年历的创建,能够根据输入的年打印一整年的日历情况,能够根据输入的年月打印一整月的情况,并可以打印指定的如2000年至2023年的日历情况。(JAVA基础大一)
大概实现如下:
import java.util.Calendar;
import java.util.Scanner;
public class CalendarPrinter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("----------万年历----------");
System.out.println("1. 打印整年日历");
System.out.println("2. 打印指定年份范围内所有日历");
System.out.println("3. 打印指定月份日历");
System.out.println("4. 退出程序");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("请输入年份:");
int year = scanner.nextInt();
printYearCalendar(year);
break;
case 2:
System.out.println("请输入起止年份:");
int startYear = scanner.nextInt();
int endYear = scanner.nextInt();
printRangeCalendar(startYear, endYear);
break;
case 3:
System.out.println("请输入年份和月份:");
year = scanner.nextInt();
int month = scanner.nextInt();
printMonthCalendar(year, month);
break;
case 4:
System.out.println("程序已退出!");
return;
default:
System.out.println("请输入正确的选项数字!");
}
}
}
// 打印整年日历
private static void printYearCalendar(int year) {
System.out.println(year + "年日历");
for (int month = 1; month <= 12; month++) {
printMonthCalendar(year, month);
System.out.println();
}
}
// 打印指定年份范围内所有日历
private static void printRangeCalendar(int startYear, int endYear) {
for (int year = startYear; year <= endYear; year++) {
printYearCalendar(year);
System.out.println();
}
}
// 打印指定月份日历
private static void printMonthCalendar(int year, int month) {
System.out.println(month + "月日历");
System.out.println("日\t一\t二\t三\t四\t五\t六");
// 设置Calendar对象
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int weekday = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取这个月第一天是星期几
int daysOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取这个月有多少天
// 打印第一行
for (int i = 0; i < weekday; i++) {
System.out.print("\t");
}
for (int i = 1; i <= 7 - weekday; i++) {
System.out.print(i + "\t");
}
System.out.println();
// 打印剩余行
int count = 7 - weekday;
for (int i = count + 1; i <= daysOfMonth; i++) {
System.out.print(i + "\t");
if (i % 7 == count % 7) {
System.out.println();
}
}
System.out.println();
}
}
运行截图:
Date类:
import java.util.Scanner;
public class Date {
private int mYear;
//获取年
public int getmYear() {
return mYear;
}
//设置年
public void setmYear(int mYear) {
this.mYear = mYear;
}
//判断是否是闰年
public boolean ioleapyear(int year){
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
//判断是否是闰年 无参
public boolean ioleapyear(){
return ioleapyear(mYear);
}
//返回年的累加天数
private int calMonth(int year, int month) {
int shift = 0;
if (ioleapyear(year))
shift = 1;
switch (month) {
case 0:return 0;
case 1:return 31;
case 2:return 31 + 28 + shift;
case 3:return 31 + 28 + 31 + shift;
case 4:return 31 + 28 + 31 + 30 + shift;
case 5:return 31 + 28 + 31 + 30 + 31 + shift;
case 6:return 31 + 28 + 31 + 30 + 31 + 30 + shift;
case 7:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + shift;
case 8:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + shift;
case 9:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + shift;
case 10:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + shift;
case 11:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + shift;
case 12:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + shift;
default:return 0;
}
}
// 判断某天是周几
public int weekofday(int year, int mon, int day) {
// 1900-1-1 星期一
int days = 0;
if (year < 1900){
//1.计算从year+1到1900年的天数
for (int y = year + 1; y < 1900; y++) {
if (ioleapyear(y))
days += 366;
else
days += 365;
}
//2.year年的天数
if (ioleapyear(year))
days += 366 - calMonth(year, mon - 1) - day;
else
days += 365 - calMonth(year, mon - 1) - day;
int wk = days % 7;
return (7 - wk);
}
else {
//1.计算从1900年到year的天数
for (int y = 1900; y < year; y++) {
if (ioleapyear(y))
days += 366;
else
days += 365;
}
//2.year年的天数
days += calMonth(year, mon - 1) + day - 1;
int wk = days % 7 + 1;
return wk;
}
}
//显示星期几
public void disp(int wk) {
switch (wk) {
case 1:
System.out.print("星期一\n"); break;
case 2:
System.out.print("星期二\n"); break;
case 3:
System.out.print("星期三\n"); break;
case 4:
System.out.print("星期四\n"); break;
case 5:
System.out.print("星期五\n"); break;
case 6:
System.out.print("星期六\n"); break;
case 7:
System.out.print("星期日\n"); break;
}
}
// 获取月份的天数
public int monthday(int y,int mon){
int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (ioleapyear(y))
arr[2] = 29;
return arr[mon];
}
//显示某年某月的日历
public void showRl(int year, int mon) {
int day, wk, days;
int i, j;
String weeks[] = { " ","一","二","三","四","五","六","日" };//仿windows日历显示
days = monthday(year, mon);
for (i = 1; i <= 7; i++){
if(i%2==1)
System.out.printf("%4s ", weeks[i]);
else
System.out.printf(" %4s ", weeks[i]);
}
System.out.println();
for (day = 1; day <= days; day++)
{
wk = weekofday(year, mon, day);
if (day == 1)
{
for(j=1;j<wk;j++)
System.out.print(" ");
}
if(wk != 7)
System.out.printf("%3d ", day);
else
System.out.printf("%3d\n", day);
}
System.out.println();
System.out.println();
}
//显示某年的日历
public void showYear(int year) {
int i = 1;
for (; i <= 12; i++)
{
System.out.println(year+"年"+i+"月日历:");
showRl(year, i);
}
}
}
WanNianli类(调用Date类的方法):
import java.util.Scanner;
public class WanNianli {
//主程序
public static void main(String[] argv){
Scanner sc = new Scanner(System.in);
Date dt = new Date();
int year,mon,day;
int flag = 1;
while(flag == 1){
System.out.print("***************************************\n");
System.out.print(" 万年历 \n");
System.out.print("1.查询某年某月某日星期几\n");
System.out.print("2.判断某年是否是闰年\n");
System.out.print("3.查询某月的最大天数\n");
System.out.print("4.打印某年的全年日历\n");
System.out.print("5.打印某年某月的日历\n");
System.out.print("0.退出程序\n");
System.out.print("***************************************\n");
System.out.print("请选择:");
int choise = sc.nextInt();
switch(choise){
case 0: flag = 0;break;
case 1:
System.out.print("请输入年 月 日:");
year = sc.nextInt();
mon = sc.nextInt();
day = sc.nextInt();
int wk = dt.weekofday(year, mon, day);
dt.disp(wk);
break;
case 2:
System.out.print("请输入年份:");
year = sc.nextInt();
if (dt.ioleapyear(year))
System.out.printf("%d年是闰年\n", year);
else
System.out.printf("%d年不是闰年\n", year);
break;
case 3:
System.out.print("请输入年月:");
year = sc.nextInt();
mon = sc.nextInt();
System.out.printf("%d年%d月的最大天数是%d\n", year, mon, dt.monthday(year, mon));
break;
case 4:
System.out.print("请输入年:");
year = sc.nextInt();
dt.showYear(year);
break;
case 5:
System.out.print("请输入年月:");
year = sc.nextInt();
mon = sc.nextInt();
System.out.printf("%d年%d月日历如下:\n",year,mon);
System.out.print("---------------------------------\n\n");
dt.showRl(year,mon);
break;
}
}
}
}
/**
* 身份证号合法性校验
*
* @param idCard
* @return String
*/
public static boolean isLegalIDCard(String idCard) {
boolean res = false;
// 校验规则(15或是18位身份证号码)
if (isMatches(idCard)) {
if (idCard.length() == 18) {
char[] idCardArray = idCard.toCharArray();
// 前十七位加权因子
int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 除以11后,可能产生的11位余数对应的验证码
String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int total = 0;
for (int i = 0; i < idCardWi.length; i++) {
int count = Integer.parseInt(String.valueOf(idCardArray[i])) * idCardWi[i];
total += count;
}
// 最后一位校验码
int idCardModify = total % 11;
if (idCardY[idCardModify].toUpperCase().equals(String.valueOf(idCardArray[17]).toUpperCase())) {
res = true;
} else {
System.out.println(idCardY[idCardModify].toUpperCase());
res = false;
}
} else {
res = true;
}
}
return res;
}
private static boolean isMatches(String idCard) {
if (StringUtils.isBlank(idCard)) {
return false;
}
String regex = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
return idCard.matches(regex);
}
这是一个比较全面的日历程序,但需要将其完善一下来满足题目的需求。
首先是根据输入的年份打印出该年的所有日历情况,这部分已经在参考资料的代码中完成了,可以直接使用。可以设置一个输入年份的变量,然后在循环中依次计算出1900年~该年份的所有日历情况,然后打印出来。
接着是根据输入的年月打印出该月的所有日历情况,同样也已经在参考资料的代码中完成。除了输入年份的变量外,还需要新增一个输入月份的变量,然后在循环中依次计算出该年份1月~该月份的所有日期,然后打印出来。
最后是能够指定打印某一年范围内的日历情况,例如指定2000年至2023年范围内的日历情况。这部分可以新建一个函数,接收起始年份和结束年份,然后依次调用“根据输入的年份打印出该年的所有日历情况”的方法,打印出所有年份的日历情况即可。
完整代码如下:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class CalendarProgram {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请选择操作:");
System.out.println("1. 根据年份打印日历");
System.out.println("2. 根据年月打印日历");
System.out.println("3. 打印指定年份范围内的日历");
int choice = input.nextInt();
switch (choice) {
case 1:
System.out.println("请输入年份:");
int year = input.nextInt();
printCalendarByYear(year);
break;
case 2:
System.out.println("请输入年份:");
int year2 = input.nextInt();
System.out.println("请输入月份:");
int month = input.nextInt();
printCalendarByMonth(year2, month);
break;
case 3:
System.out.println("请输入起始年份:");
int startYear = input.nextInt();
System.out.println("请输入结束年份:");
int endYear = input.nextInt();
printCalendarByRange(startYear, endYear);
break;
default:
break;
}
}
/**
* 根据输入的年份打印出该年的所有日历情况
*/
public static void printCalendarByYear(int year) {
for (int i = 1; i <= 12; i++) {
printCalendarByMonth(year, i);
}
}
/**
* 根据输入的年月打印出该月的所有日历情况
*/
public static void printCalendarByMonth(int year, int month) {
int day = 0;
for (int i = 1900; i < year; i++) {
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
day += 366;
} else {
day += 365;
}
}
for (int i = 1; i < month; i++) {
if (i == 2) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
day += 29;
} else {
day += 28;
}
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
day += 30;
} else {
day += 31;
}
}
int weeks = day % 7;
int day2 = 0;
switch (month) {
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
day2 += 29;
} else {
day2 += 28;
}
break;
case 4:
case 6:
case 9:
case 11:
day2 = 30;
break;
default:
day2 = 31;
break;
}
System.out.println(String.format("%d年%d月", year, month));
System.out.println("一\t二\t三\t四\t五\t六\t日");
for (int i = 1; i <= weeks; i++) {
System.out.print(" \t");
}
for (int i = 1; i <= day2; i++) {
System.out.print(i + "\t");
if ((i + weeks) % 7 == 0) {
System.out.println();
}
}
}
/**
* 打印指定年份范围内的日历情况
*/
public static void printCalendarByRange(int startYear, int endYear) {
for (int year = startYear; year <= endYear; year++) {
printCalendarByYear(year);
}
}
}
该回答参考ChatGPT:
好的,这个需求可以通过编写一个简单的程序来实现。以下是一个基本的实现思路:
首先,我们需要获取用户输入的年份和月份。可以使用Java中的Scanner类来获取用户输入。
接下来,我们需要计算出指定年份的日历情况。可以使用Java中的Calendar类来计算。
对于整年的日历情况,我们需要循环遍历每个月份,并调用Calendar类来计算每个月份的日历情况。
对于指定年份范围内的日历情况,我们需要循环遍历每一年,并在每一年内循环遍历每个月份,调用Calendar类来计算每个月份的日历情况。
最后,我们需要将计算出的日历情况输出到控制台上,可以使用Java中的System.out.println()方法来实现。
以下是一个简单的Java代码示例,可以实现上述功能:
import java.util.Calendar;
import java.util.Scanner;
public class CalendarDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scanner.nextInt();
System.out.print("请输入月份(不输入则打印整年):");
int month = scanner.nextInt();
if (month == 0) {
printYearCalendar(year);
} else {
printMonthCalendar(year, month);
}
}
private static void printYearCalendar(int year) {
for (int i = 1; i <= 12; i++) {
printMonthCalendar(year, i);
}
}
private static void printMonthCalendar(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月");
System.out.println("日\t一\t二\t三\t四\t五\t六");
for (int i = 1; i < firstDayOfWeek; i++) {
System.out.print("\t");
}
for (int i = 1; i <= maxDayOfMonth; i++) {
System.out.print(i + "\t");
if ((i + firstDayOfWeek - 1) % 7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
这个程序可以根据用户输入的年份和月份,打印出对应的日历情况。如果用户不输入月份,则会打印出整年的日历情况。如果需要打印指定年份范围内的日历情况,可以在printYearCalendar()方法中添加循环遍历的逻辑即可。
以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
这里是一个Java程序实现一个打印万年历的功能:
java
import java.util.Scanner;
public class Calendar {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入年份:");
int year = in.nextInt();
// 打印整年日历
printYearCalendar(year);
System.out.print("请输入年和月份(如2020 12):");
year = in.nextInt();
int month = in.nextInt();
// 打印整月日历
printMonthCalendar(year, month);
System.out.print("请输入起始年份和结束年份(如2000 2023):");
int startYear = in.nextInt();
int endYear = in.nextInt();
// 打印指定年份段的日历
printCalendar(startYear, endYear);
}
// 打印一整年的日历
public static void printYearCalendar(int year) {
// 获取每月的天数
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 闰年的二月天数为29天
if (isLeapYear(year)) days[1] = 29;
// 打印每个月的头部信息及日历
for (int i = 0; i < 12; i++) {
System.out.printf("\n %d年%d月\n", year, i + 1);
System.out.printf(" 周日 周一 周二 周三 周四 周五 周六\n");
printMonthCalendar(year, i + 1, days[i]);
}
}
// 打印一个月的日历
public static void printMonthCalendar(int year, int month) {
// 获取月份天数
int days = getDaysOfMonth(year, month);
// 打印日历头部
System.out.printf("\n %d年%d月\n", year, month);
System.out.printf(" 周日 周一 周二 周三 周四 周五 周六\n");
// 打印日历主体
printMonthCalendar(year, month, days);
}
// 具体打印某月日历的方法
public static void printMonthCalendar(int year, int month, int days) {
// 获取该月第一天是周几
int week = getFirstDayOfWeek(year, month);
// 打印日历
for (int i = 0; i < week; i++) System.out.print(" ");
for (int i = 1; i <= days; i++) {
System.out.printf("%4d", i);
if ((i + week - 1) % 7 == 0) System.out.println();
}
System.out.println();
}
// 打印指定年份段的日历
public static void printCalendar(int startYear, int endYear) {
for (int year = startYear; year <= endYear; year++) {
printYearCalendar(year);
System.out.println();
}
}
}
该程序实现了:
通过调用不同方法,实现了输入不同参数,打印相应范围内的日历。