← 返回首页
JavaSE基础教程(九十三)
发表时间:2020-10-10 22:10:46
程序结构部分综合案例

实现万年历效果

用户在控制台输入年份和月份,在控制台显示该月的日历。

实现代码:

import java.util.Scanner;

public class CalendarDemo {
    //判断是否是闰年
    public static boolean isRun(int year) {
        //年份能被4整除,并且不能被100整除,或者能被400整除的年份,称为闰年。
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            return true;
        }
        return false;
    }

    //返回当月的总天数。
    public static int getMonthDays(int year, int month) {
        //默认每个月都是31天。
        int days = 31;
        //单独判断是否是小月即可。
        switch (month) {
            case 2:
                //对于二月份要特殊对待。
                if (isRun(year)) {
                    days = 29;
                } else {
                    days = 28;
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
        }
        return days;
    }

    //假设1900-1-1是星期一,算出这个月的第一天距离1900-1-1过了多少天
    public static int getTotalDays(int year, int month) {
        int totalDays = 0;
        //循环年份
        for (int i = 1900; i < year; i++) {
            if (isRun(i)) {
                totalDays += 366;
            } else {
                totalDays += 365;
            }
        }
        //循环月份
        for (int i = 1; i < month; i++) {
            totalDays += getMonthDays(year, i);
        }
        totalDays++;
        return totalDays; //这个月的第一天距离1900-1-1过了多少天。
    }

    //打印日历
    public static void printCalendar(int week, int days) {

        //打印日历的表头
        System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\t");
        int iCount = 0; //计数器实现遇到7就换行。
        //循环前面的空格
        for (int i = 1; i < week; i++) {
            iCount++;
            System.out.print("\t\t");
        }
        //循环打印日历
        for (int i = 1; i <= days; i++) {
            System.out.print(i + "\t\t");
            iCount++;
            if (iCount % 7 == 0) {
                System.out.println();
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int year; //输入的年份
        int month; //输入的月份
        int days = 0; //当月的总天数。
        int totalDays = 0; //该月的第一天距离1900-1-1过了多少天。
        int week; //表示这个月的第一天是星期几。
        System.out.println("请输入年份:");
        year = sc.nextInt();
        System.out.println("请输入月份:");
        month = sc.nextInt();
        //计算这个月的总天数
        days = getMonthDays(year, month);
        //计算这个月的第一天,距离1900-1-1过了多少天
        totalDays = getTotalDays(year, month);
        //计算这个月的第一天是星期几
        week = totalDays % 7;
        if (week == 0){
            week = 7;
        }
        //打印日历
        printCalendar(week, days);
    }
}

运行效果如下: