【Java】万年历
一、实验内容
给定某年某月某日是星期几,能给出任何一年(12月)的输出。输出效果如下:
二、问题分析(含数据模型)
1.万年历中的每行含每月的3小段数据,由于每月1日的起始位置和每月的结束位置不一,导致此问题的边界处理比较麻烦。解决问题的方法:
①根据每月1日周几的数据统一折算到周日为起点的值,如上图的1月1日式周6,折算到周日的起点值为-5,在打印完日期时,该值增1,可把12月的起点控制量设定为1数组:
如int ctlValue[]={-5,-1,-1,-4,1,-2,-4,0,-3,-5,-1,-3};
②为解决每月的末尾不一问题,需要根据每月“1~最大天数”来区分是否正常的改约日期,所以另设一每月最大天数的数组,如:
int daysOfMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};;
③对非常的日期(在范围“1~最大天数”之外),按打印数据格式要求来控制。
2. ctlValue、daysOfMonth数组内容的求值可借助于Calendar类来实现:
①.Calendar.getInstance()获取实例
②.set方法设置日期,如obj.set(2012,1,1)设置成2012.2.1的日期
③.get(Calendar.DAY_OF_WEEK)获取当前日期是星期几
④.getActualMaximum(Calendar.DATE)获取当前月的最大天数
三、算法设计(类自然语言等)
四、算法实现(程序)
Month类:
package com.dreamchaser.work1;
public class Month{
//月份
int month;
//每月天数
int day;
//一号周几
int first;
//数据的高度
private int height;
public Month(int month, int day, int first) {
this.month = month;
this.day = day;
this.first = first;
this.height = (first+day)/7;
}
}
PerpetualCalendar类:
package com.dreamchaser.work1;
import java.util.Calendar;
public class PerpetualCalendar {
public static void main(String[] args) {
//给定一个日期
int year=2020;
int month=10;
int day=6;
Calendar calendar=Calendar.getInstance();
for (int i=0;i<12;i=i+3){
calendar.set(year,i,1);
Month m1=new Month(i+1,calendar.getActualMaximum(Calendar.DATE),calendar.get(Calendar.DAY_OF_WEEK)-1);
calendar.set(year,i+1,1);
Month m2=new Month(i+2,calendar.getActualMaximum(Calendar.DATE),calendar.get(Calendar.DAY_OF_WEEK)-1);
calendar.set(year,i+2,1);
Month m3=new Month(i+3,calendar.getActualMaximum(Calendar.DATE),calendar.get(Calendar.DAY_OF_WEEK)-1);
Month[] months={m1,m2,m3};
display(months);
}
}
/**
* 用于打印该月份的日历
*/
public static void display(Month[] months){
for (int j=0;j<3;j++){
if (j==2){
System.out.println("\t\t"+months[j].month+"月日历\t\t\t\t\t\t\t");
}else{
System.out.print("\t\t"+months[j].month+"月日历\t\t\t\t\t\t\t");
}
}
for (int j=0;j<3;j++){
if (j==2){
System.out.println("日\t一\t二\t三\t四\t五\t六\t\t\t\t");
}else{
System.out.print("日\t一\t二\t三\t四\t五\t六\t\t\t\t");
}
}
int date=0;
for (int i=0;i<5;i++){
for (int j=0;j<3;j++){
if (j==2){
for (int z=0;z<7;z++){
date=i*7+z- months[j].first+1;
if (date<=0||date> months[j].day){
System.out.print("\t");
}else if (months[j].day<10){//为了对齐所以做判断
System.out.print(date+"\t");
}else {
System.out.print(date+"\t");
}
}
System.out.println("\t\t\t");
}else{
for (int z=0;z<7;z++){
date=i*7+z- months[j].first+1;
if (date<=0||date> months[j].day){
System.out.print("\t");
}else if (months[j].day<10){//为了对齐所以做判断
System.out.print(date+"\t");
}else {
System.out.print(date+"\t");
}
}
System.out.print("\t\t\t");
}
}
}
}
}
思路说明:
利用jdk中Calendar类来获取每个月天数,每月第一天星期数等数据,然后由此构造Month模型对象,并由display方法来展示输出。
五、实验测试(结果等)
六、实验总结
学习了Calendar类的使用,其类封装了很多常用的方法,大大方便了我们对于日期的操作和处理。
本文地址:https://blog.csdn.net/qq_46101869/article/details/109578301
上一篇: Ansible-免密登录与主机清单Inventory
下一篇: 买睡衣跟结婚有啥关系啊?