【Java作业】万年历

简介: 【Java作业】万年历

一、实验内容

给定某年某月某日是星期几,能给出任何一年(12月)的输出。输出效果如下:

q1.png


二、问题分析(含数据模型)

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)获取当前月的最大天数


三、算法设计(类自然语言等)

w1.png


四、算法实现(程序)

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方法来展示输出。


五、实验测试(结果等)


q2.png

六、实验总结

学习了Calendar类的使用,其类封装了很多常用的方法,大大方便了我们对于日期的操作和处理。


相关文章
|
1月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
53 5
|
Java Android开发
万年历【小游戏】(Java课设)
万年历【小游戏】(Java课设)
161 2
|
1月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
149 3
|
1月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
52 1
|
1月前
|
算法 Java
Java基础学习day03-作业
本内容包含多个Java编程案例,涵盖条件判断、循环、数组、随机数生成、素数判断等基础算法练习,适用于巩固Java语法与逻辑思维训练。
94 6
|
1月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
59 2
|
1月前
|
Java
Java基础学习day02-作业
本内容包含13个Java编程练习需求,涵盖变量定义、数据类型转换、运算符使用、键盘输入及条件判断等基础语法实践,适合初学者巩固Java核心基础知识。
61 5
|
1月前
|
Java
Java基础学习day04-作业
本作业包含8个Java编程案例,涵盖数组的定义与遍历、求和、最值计算、去极值求平均、元素倍增、二维数组行和计算及查找指定元素等内容,旨在巩固Java基础语法与数组操作技能。
178 1
|
Java
Java基础学习day01-作业
通过多个Java编程案例,学习变量定义、数据类型使用及控制台输出。涵盖字符串、数值、布尔值等字面量输出,变量赋值与修改,以及实际应用场景如学生信息和商品价格变化的模拟,夯实基础语法掌握。
57 0
|
4月前
|
机器学习/深度学习 存储 算法
Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)
本文围绕 Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用展开,剖析作业现状与挑战,阐述技术原理及应用方法,结合案例与代码,给出具有实操性的解决方案。
Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)