Java版-万年历

import java.util.Scanner;

public class Calendar {
    public static void main(String[] args) {
        /**
         * 万年历 输入一个年份,再输入一个月份,把那个月的日历打印出来,(1900年1月1日是星期一)。
         * a:先输出提示语句,并接受用户输入的年、月。 
         * b:根据用户输入的年,先判断是否是闰年。(闰年2月有29天,平年2月有28天);
         * C:根据用户输入的月来判断月的天数。 
         * D:用循环计算用户输入的年份距1900年1月1日(星期一)的总天数。
         * E:用循环计算用户输入的月份距输入的年份的1月1日共有多少天。* 
         * F:相加D与E的天数,得到总天数。
         * G:用总天数来计算输入月的第一天的星期数。 
         * H:根据G的值,格式化输出这个月的日历! 
         * * H提示:
         * 1.如果当月1日如果不是周日先打印第一行,再打印后面的
         *  (1)startDay=0~5,先打印若干个空格,startDay==0时,是星期一,应该在星期日处打印一个空格,以此类推[0~startDay+1)
         *  (2)再打印第一行的日期[1,7-startDay) 
         *  (3)打印换行
         *  (4)第一行打印的天数为:1~(6-startDay),所以第二行从7-startDay开始打印,打印到当月总天数为止,每7个换行
         * 2.如果startDay是6(周日),直接从1日开始打印到最后一天,每7个换行 提示:当月1日如果不是周日,应循环输出\t以便对齐
         *  当月1日的星期数加上日期的号,如果能被7整除,则应换行.
         */
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println();
            System.out.println("请输入年份:");
            int year = scanner.nextInt();
            System.out.println("请输入月份:");
            int month = scanner.nextInt();
            int yearSum = yearSum(year);
            int monthSum = monthSum(year, month);
            int daySum = yearSum + monthSum;
            int oneDay = whatDay(daySum + 1);
            System.out.println("\t" + "\t" + "\t" + year + "年" + month + "月");
            System.out.println("----------------------------------------------------");
            System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
            print(year, month, oneDay);
        }
    }

    // 判断该年份1月1日到1900年1月1日的总天数
    public static int yearSum(int year) {
        int yearSum = 0;
        if (year < 1900) {
            System.out.println("请输入大于1900年的年份:");
        } else {
            for (int i = 1900; i < year; i++) {
                if (isLeapYear(i)) {
                    yearSum += 366;
                } else {
                    yearSum += 365;
                }
            }
        }
        return yearSum;
    }

    // 判断该月份到1月1日的总天数
    public static int monthSum(int year, int month) {
        int monthSum = 0;
        if (month < 0 || month > 12) {
            System.out.println("请输入1~12的正确月份:");
        } else {
            for (int i = 1; i < month; i++) {
                monthSum += monthNumber(year, i);
            }
        }
        return monthSum;
    }

    // 判断年份是否为闰年
    public static boolean isLeapYear(int year) {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }

    // 判断月份的天数
    public static int monthNumber(int year, int month) {
        int monthNumber = 0;
        switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            monthNumber = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            monthNumber = 30;
            break;
        case 2:
            if (isLeapYear(year)) {
                monthNumber = 29;
            } else {
                monthNumber = 28;
            }
            break;
        }
        return monthNumber;
    }

    // 判断该日为星期几
    public static int whatDay(int daySum) {
        int whatDay = 0;
        if (daySum % 7 == 0) {
            whatDay = 7;
        } else {
            whatDay = daySum % 7;
        }
        return whatDay;
    }

    // 打印日历
    public static void print(int year, int month, int oneDay) {
        // 打印空格
        for (int i = 0; i < oneDay; i++) {
            System.out.print("" + "\t");
        }
        int day = monthNumber(year, month);
        for (int i = 1; i <= day; i++) {
            if ((oneDay + i - 1) % 7 == 0) {
                System.out.println();
            }
            System.out.print(" " + i + "\t");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42850898/article/details/81507600