在前面解决了诸多涉及到知识点,现在终于可以开始正式讲解万年历了:
首先上图看一下最终效果:
思路:1:首先我们能想到的就是平年闰年的判断,一个返回boolean值的方法,所以我们需要单独先写一个方法:leapYearOrNot
/**
* 区分平年和闰年
*/
public static boolean leapYearOrNot(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
}
2:然后我们发现一开始有一个“万年历“这样的动画,按照自己喜欢的方式来实现就好:PrintTitle()
public static void PrintTitle() {
System.out.println("******************************************************");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* 万年历 *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("******************************************************");
}
3:然后首先为了保证我们可以不断地去输入年份月份去循环,先在主方法最外面写一个while:然后根据题目要求写输入年份语句:注意这里的while循环没有结束,大括号还在下面
while (true) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println(); //换行
System.out.print("请输入年份:");
int year = Integer.parseInt(reader.readLine());
if (year == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
}
4:然后想,我们刚刚输入了日期接下来该干什么?是不是要让java知道这个日期,那么java怎样就可以知道这个日期呢?通过的就是我们前面说的Calendar:
/**
* 创建日历对象,并将year赋值进去给YEAR
*/
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
5:这样就是先初始化了日期然后set设置了年份为我们刚刚输入的,接下来,我们写输入月份的语句:
System.out.print("请输入月份:");
int mouth = 0;
int days = 0;
mouth = Integer.parseInt(reader.readLine());
6:然后我们在前面输入年之前判断了年的闰与平,现在应该判断月份的天数了:
if (mouth == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
} else if (mouth >= 12 && mouth <= 9) {
System.out.println("您输入的月份不正确,请输入1-12的数字");
} else if (mouth == 2 && leapYearOrNot(year)) {
days = 29;
} else if (mouth == 2) {
days = 28;
} else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
days = 31;
} else {
days = 30;
}
7:接下来同理,上面让java读懂了年份,现在让它读懂月份:
/**
* 设置输入的月份,但是要记住这里要减一!
*/
cal.set(Calendar.MONTH, mouth - 1);
8:现在就是月份和年都输入并且java录入了,我们想一下打印日历是不是需要知道每个月的第一天?现在就需要用到Calendar的一个方法:
//判断该月份的一天是星期几。注意:dayOfWeek = 1 表示周日,dayOfWeek = 2 表示周一,以此类推。
cal.setFirstDayOfWeek(Calendar.MONDAY);
int dayofweek;
dayofweek = cal.get(Calendar.DAY_OF_WEEK);
8.5:一个大的日期打印类:PrintCalendar
:
static class PrintCalendar {
9:接下来的方法就都是与打印相关的了,首先我们会经常用到空格,那么就写一个空格方法:printBlankSpace()
10:看图得知第一行是打印周一到周日:printDayOfWeekTitle
public static void printDayOfWeekTitle () {
printBlankSpace();
System.out.print("一");
printBlankSpace();
System.out.print("二");
printBlankSpace();
System.out.print("三");
printBlankSpace();
System.out.print("四");
printBlankSpace();
System.out.print("五");
printBlankSpace();
System.out.print("六");
printBlankSpace();
System.out.print("日");
printBlankSpace();
System.out.println();
}
11:我们可以看到这个日历2021年2月份,在周六之前是没有日期的,所以我们需要判断一下需要一开始打印多少空格,还有星期转化:然后这些小方法应该包含在大方法打印输出类里面:printData
:
11.1:先转换为中国日期:
public static void printData (ArrayList < Integer > datalist,int dayofWeek){
/**
* 转换为中国星期
*/
int ChinadayofWeek;
if (dayofWeek == 1) {
ChinadayofWeek = 7;
} else {
ChinadayofWeek = dayofWeek - 1;
}
11.2:打印多余的空格:
/**
* 将多余的0传入数组,因为不是每个月第一天都是星期一
*/
for (int i = 0; i < ChinadayofWeek - 1; i++) {
datalist.add(0, 0); //位置和元素都为0
}
11.3:首先说一下现在到哪一步了,图例:
11.4:用辅助数组去存放需要打印的数据:
ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
for (int i = 0; i < datalist.size(); i++) {
if (datalist.get(i) == 0) {
dataStrings.add(" ");
} else if (datalist.get(i) < 10) {
dataStrings.add(Integer.toString(datalist.get(i)) + " "); //这里的Integer.toString是将日期的Integer类型转换为字符串打印输出
} else {
dataStrings.add(Integer.toString(datalist.get(i)));
}
}
11.5:开始遍历打印:
for (int i = 0; i < datalist.size(); i++) {
if ((i + 1) % 7 == 1) {
printBlankSpace();
System.out.print(dataStrings.get(i));
printBlankSpace();
} else if ((i + 1) % 7 == 6) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
} else if ((i + 1) % 7 == 0) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
System.out.println();
} else {
System.out.print(dataStrings.get(i));
printBlankSpace();
}
}
12:回到主方法最后开始输出:
/**
* 打印环节--------------------------------------------------------------
* 打印环节--------------------------------------------------------------
* 打印环节--------------------------------------------------------------
*/
/**
* 打印输出日历
*/
PrintCalendar printCalendar = new PrintCalendar();
//将数据存入本月日期数临时数组中
ArrayList<Integer> dataList = new ArrayList<>(days);
for (int i = 0; i < days; i++) {
dataList.add(i + 1);
}
/**
* 打印一开始的星期
*/
printCalendar.printDayOfWeekTitle();
//打印日期
printCalendar.printData(dataList,dayofweek);
全部代码:
package 任务A;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
/**
* @author ${范涛之}
* @Description
* @create 2021-11-18 10:47
*/
public class CalendarTest {
/**
* 区分平年和闰年
*/
public static boolean leapYearOrNot(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
}
public static void main(String[] args) throws IOException {
/**
* 打印标题
*/
PrintCalendar.PrintTitle();
/**
* 一直输入数据,直到输入1的时候退出
*/
while (true) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println(); //换行
System.out.print("请输入年份:");
int year = Integer.parseInt(reader.readLine());
if (year == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
}
/**
* 创建日历对象,并将year赋值进去给YEAR
*/
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
/**
* 打印提示语:
*/
System.out.print("请输入月份:");
int mouth = 0;
int days = 0;
mouth = Integer.parseInt(reader.readLine());
/**
* 根据平年闰年判断不同月份
*/
if (mouth == -1) {
System.out.println("欢迎使用,已退出万年历程序,再见!");
break;
} else if (mouth >= 12 && mouth <= 9) {
System.out.println("您输入的月份不正确,请输入1-12的数字");
} else if (mouth == 2 && leapYearOrNot(year)) {
days = 29;
} else if (mouth == 2) {
days = 28;
} else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
days = 31;
} else {
days = 30;
}
/**
* 设置输入的月份,但是要记住这里要减一!
*/
cal.set(Calendar.MONTH, mouth - 1);
//判断该月份的一天是星期几。注意:dayOfWeek = 1 表示周日,dayOfWeek = 2 表示周一,以此类推。
cal.setFirstDayOfWeek(Calendar.MONDAY);
int dayofweek;
dayofweek = cal.get(Calendar.DAY_OF_WEEK);
/**
* 打印环节--------------------------------------------------------------
* 打印环节--------------------------------------------------------------
* 打印环节--------------------------------------------------------------
*/
/**
* 打印输出日历
*/
PrintCalendar printCalendar = new PrintCalendar();
//将数据存入本月日期数临时数组中
ArrayList<Integer> dataList = new ArrayList<>(days);
for (int i = 0; i < days; i++) {
dataList.add(i + 1);
}
/**
* 打印一开始的星期
*/
printCalendar.printDayOfWeekTitle();
//打印日期
printCalendar.printData(dataList,dayofweek);
}
}
/**
* 打印输出图案
*/
static class PrintCalendar {
public static void PrintTitle() {
System.out.println("******************************************************");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* 万年历 *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("******************************************************");
}
/**
* 打印空格
*/
public static void printBlankSpace () {
System.out.print(" ");
}
//打印星期数的抬头
public static void printDayOfWeekTitle () {
printBlankSpace();
System.out.print("一");
printBlankSpace();
System.out.print("二");
printBlankSpace();
System.out.print("三");
printBlankSpace();
System.out.print("四");
printBlankSpace();
System.out.print("五");
printBlankSpace();
System.out.print("六");
printBlankSpace();
System.out.print("日");
printBlankSpace();
System.out.println();
}
/**
* 这里的datalist指代的就是可以理解为一整行的长度,里面就包括了1号前面的空格和日期,list可以确定长度所以适合作为循环边界,dataStrings不太好空值长度
*
* @param datalist
* @param dayofWeek
*/
public static void printData (ArrayList < Integer > datalist,int dayofWeek){
/**
* 转换为中国星期
*/
int ChinadayofWeek;
if (dayofWeek == 1) {
ChinadayofWeek = 7;
} else {
ChinadayofWeek = dayofWeek - 1;
}
/**
* 将多余的0传入数组,因为不是每个月第一天都是星期一
*/
for (int i = 0; i < ChinadayofWeek - 1; i++) {
datalist.add(0, 0); //位置和元素都为0
}
/**
* 为了显示好看我们需要在日期为单个的数字后面加一个空格,这里新建了一个辅助数组
* dataStrings里面存放的就是实际要打印输出的东西,这里的dataStrings一共会打印三种类型的数据
* 1:当日期是空的时候也就是我前面所说的不是每个月都是周一的对应1号,这时前面就需要两个空格,
* 2:当日期是一位数的时候需要打印的就是一个空格加这个数字
* 3:当日期是两位数的时候就恰好去输出这个日期
* 总而言之就是每一个打印的都要保证两位数
*/
ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
for (int i = 0; i < datalist.size(); i++) {
if (datalist.get(i) == 0) {
dataStrings.add(" ");
} else if (datalist.get(i) < 10) {
dataStrings.add(Integer.toString(datalist.get(i)) + " "); //这里的Integer.toString是将日期的Integer类型转换为字符串打印输出
} else {
dataStrings.add(Integer.toString(datalist.get(i)));
}
}
/**
* 遍历打印
*/
for (int i = 0; i < datalist.size(); i++) {
if ((i + 1) % 7 == 1) {
printBlankSpace();
System.out.print(dataStrings.get(i));
printBlankSpace();
} else if ((i + 1) % 7 == 6) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
} else if ((i + 1) % 7 == 0) {
System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
printBlankSpace();
System.out.println();
} else {
System.out.print(dataStrings.get(i));
printBlankSpace();
}
}
}
}
}
图片:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81048.html