题目描述:
设计一个日历类,定义一个构造法,输入年月后能够构造一个日历对象并打印对象显示以下效果:
那么,我们来分析一下这个程序应该怎么编写:
有输入模块(用于记录输入的年月)
有一个构造的模板类(即日历)
要有对于不同年月的日期的计算(即该月第一天是星期几)
打印输出
接下来,把对应的模块一步一步来实现。
Step1:输入模块的实现
在Java中,我们可以有以下几种方式来实现对数据的输入(目前仅考虑键盘输入,不考虑I/O流):Scanner、System、命令行、JOptionPane,我们在问题中也只是输入表示年月的数字,所以使用Scanner就可以满足要求。
import java.util.Scanner;
Scanner reader = new Scanner(System.in);
System.out.print("年: ");
int year = reader.nextInt();
System.out.print("月: ");
int month = reader.nextInt();
在这里,我们载入了Scanner,创建了一个reader对象,用它来实现对于年月的输入。
那么问题来了:我们都知道年与月都是整数,且year和month也定义为了int类。如果用户输入了非整数内容又该怎么办?
所以我们应该也添加一个能够处理异常输出的模块来应对。在这里,笔者使用了InputMismatchException来实现对异常输入的监控以及返回:
package edu.java.homework.chapter;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Calender {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_RED = "\u001B[31m";
public void work1() {
try{
Scanner reader = new Scanner(System.in);
System.out.print("年: ");
int year = reader.nextInt();
System.out.print("月: ");
int month = reader.nextInt();
} catch (InputMismatchException e) {
System.out.println(ANSI_RED + "Warning! \nError type: Input error\nPlease enter the correct operation code!" + ANSI_RESET);
work1();
}
}
}
到此,我们就已经完成了输入模块的编写,第一步顺利完成。
Step2:有一个构造的模板类(即日历)
分析:对于一个日历类,它应该有:年、月的属性,以及获取该月天数、该月第一天星期几、打印输出的方法。
那么,开始构造:
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
事实上,在Java当中本身就存在一个日历类Calendar,它继承于DateFromat类,所以构造时有许多内容都是现成的,我们只需要调用即可:
import java.util.Calendar;
Step3:要有对于不同年月的日期的计算(即该月第一天是星期几)
同上一步所说,我们只需要调用系统里面拥有的函数即可(详情请见第二步后两行函数)
Step4:打印输出
到此,我们以及完成了基本任务,接下来就是完成日历的输出与显示
System.out.println("\n");
System.out.println("------------"+ year + "年" + month + "月" + "------------");
System.out.println("\nSun Mon Tue Wed Thu Fri Sat");
for (int i = 1; i < firstDayOfWeek; i++) {
System.out.print(" ");
}
for (int day = 1; day <= daysInMonth; day++) {
System.out.printf("%3d ", day);
if ((firstDayOfWeek + day - 1) % 7 == 0) {
System.out.println();
}
}
一个日历类的制作就完成了。以下为完整代码:
package edu.java.homework.chapter;
import java.util.Calendar;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Calender {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_RED = "\u001B[31m";
public void work1() {
try{
Scanner reader = new Scanner(System.in);
System.out.print("年: ");
int year = reader.nextInt();
System.out.print("月: ");
int month = reader.nextInt();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("\n");
System.out.println("------------"+ year + "年" + month + "月" + "------------");
System.out.println("\nSun Mon Tue Wed Thu Fri Sat");
for (int i = 1; i < firstDayOfWeek; i++) {
System.out.print(" ");
}
for (int day = 1; day <= daysInMonth; day++) {
System.out.printf("%3d ", day);
if ((firstDayOfWeek + day - 1) % 7 == 0) {
System.out.println();
}
}
} catch (InputMismatchException e) {
System.out.println(ANSI_RED + "Warning! \nError type: Input error\nPlease enter the correct operation code!" + ANSI_RESET);
work1();
}
}
}
在此声明:本专栏所有程序都基于完整的管理系统,想要直接照搬复制的请阅读第一篇文章建立管理方式。Java程序题目1:作业管理系统