天天看点

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 + );
            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 = ;
        if (year < ) {
            System.out.println("请输入大于1900年的年份:");
        } else {
            for (int i = ; i < year; i++) {
                if (isLeapYear(i)) {
                    yearSum += ;
                } else {
                    yearSum += ;
                }
            }
        }
        return yearSum;
    }

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

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

    // 判断月份的天数
    public static int monthNumber(int year, int month) {
        int monthNumber = ;
        switch (month) {
        case :
        case :
        case :
        case :
        case :
        case :
        case :
            monthNumber = ;
            break;
        case :
        case :
        case :
        case :
            monthNumber = ;
            break;
        case :
            if (isLeapYear(year)) {
                monthNumber = ;
            } else {
                monthNumber = ;
            }
            break;
        }
        return monthNumber;
    }

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

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