用Java写一个万年历程序

从控制台输入指定年份(在1900年至2099年之内)和月份,输出当月的日历。要求效果如下图所示

在这里插入图片描述

思路分析如下:

假设输出2020年5月份的日历。那么要求得1900年1月1日到2020年5月1日前一天的天数总和
再求总天数余7的值,结果就是2020年4月30日对应的星期数值。

第一步:获取控制台输入的数据,并判断是否合理,进行一个初步的筛选

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入年份(1900—2099):");//1900年1月1日 星期一
        int year = input.nextInt();
        if (year >= 1900 && year <= 2099) {
            boolean isLeapYear = ((year%4==0&&year%100!=0)||(year%400==0))?true:false;//判断输入的年份是否是闰年
            System.out.print("请输入月份(1—12):");
            int month = input.nextInt();
            if(month>=1&&month<=12){

            }else {
                System.out.println("月份输入错误");
        }
        }else {
            System.out.println("年份输入错误");
        }
        }

第二步:计算从1900年1月1日至指定年之前的天数总和

				int dayCount = 0 ;
                for (int i = 1900; i <year ; i++) {//计算从1900年至指定年份的天数
                    boolean isLeap = ((i%4==0&&i%100!=0)||(i%400==0))?true:false;
                    dayCount+= isLeap?366:365;/
                }

年的天数之和比较好计算,只需在0的基础上累加即可,是闰年则加366,平年则加365。
在循环结束之后,datCount的值就是总的天数之和了(目前是计算从1900年1月1日至指
定年之前的天数)。

第三步:计算指定年1月1日 至指定月份前一个月的天数之和

				int maxDay = 0;
                for (int i = 1; i <month ; i++) {
                    switch (i){
                        case 2:
                            maxDay= isLeapYear?29:28;
                            break;
                        case 4:case 6:case 9:case 11:
                            maxDay= 30;
                            break;
                        case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                            maxDay = 31;
                    }
                    dayCount+=maxDay;

在for循环中嵌套一个switch case ,在月份数值累加的过程中,循环判断第i月的最大天数,
switch选择完最大天数后,将maxDay的值累加进dayCount中,最终结果dayCount的值就是1900年1月1日到指定年月份的前一个月的天数总和。

第四步:判断当月的第一天是周几

int weekDay =dayCount%7;//总天数余7表示指定月前一天是星期几

在此基础上加1,就表示当月第一天是周几。

第五步:打印日历到控制台

在这里插入图片描述
以2020年5月为例:如上图,在5月1日之前有(日、一、二、 三、四)共计(4+1=5)5个空缺。需要打印weekDay+1个制表符。然后继续紧接着打印日期数字:需要打印1至maxDay(需要获取当前月份的maxDay值);如上图:在打印完2,9,16,23,后需要换一次行,也即(weekday+1+j)%7=0时需要换一次行(j为打印的数值)。

				System.out.println(year+"年"+month+"月"+" 的日历如下:");
                System.out.println("日\t一\t二\t三\t四\t五\t六\t");
                for (int j = 1; j <= (weekDay+1); j++) {//weekday+1表示当月第一天是星期几
                    System.out.print("\t");             //由于是星期日开头,需打印weekDay+1个\t
                }
                switch (month) {
                    case 2:
                        maxDay = isLeapYear ? 29 : 28;
                        break;
                    case 4: case 6: case 9: case 11:
                        maxDay = 30;
                        break;
                    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                        maxDay = 31;
                }
                for (int j = 1; j <=maxDay; j++) {//打印日期数字,当
                    System.out.print(j+"\t");
                    if ((j+weekDay+1)%7==0){//+1的原因是因为这个日历是以周日开头,如果是以周一开头的话则不用+1
                        System.out.println();
                    }
                }

完整代码如下

import java.util.Scanner;
//控制台输入年和月,输出该月的日历
public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入年份(1900—2099):");//1900年1月1日 星期一
        int year = input.nextInt();
        if (year >= 1900 && year <= 2099) {
            boolean isLeapYear = ((year%4==0&&year%100!=0)||(year%400==0))?true:false;
            System.out.print("请输入月份(1—12):");
            int month = input.nextInt();
            if(month>=1&&month<=12){
                int dayCount = 0 ;
                for (int i = 1900; i <year ; i++) {//计算从1900年至指定年份的天数
                    boolean isLeap = ((i%4==0&&i%100!=0)||(i%400==0))?true:false;
                    dayCount+= isLeap?366:365;
                }
                int maxDay = 0;
                for (int i = 1; i <month ; i++) {
                    switch (i){
                        case 2:
                            maxDay= isLeapYear?29:28;
                            break;
                        case 4:case 6:case 9:case 11:
                            maxDay= 30;
                            break;
                        case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                            maxDay = 31;
                    }
                    dayCount+=maxDay;//此处共统计了指定年月距离1900年的天数
                }
                int weekDay =dayCount%7;//总天数余7表示指定月前一天是星期几
                System.out.println(year+"年"+month+"月"+" 的日历如下:");
                System.out.println("日\t一\t二\t三\t四\t五\t六\t");
                for (int j = 1; j <= (weekDay+1); j++) {//weekday+1表示当月第一天是星期几
                    System.out.print("\t");             //由于是星期日开头,需打印weekDay+1个\t
                }
                switch (month) {
                    case 2:
                        maxDay = isLeapYear ? 29 : 28;
                        break;
                    case 4: case 6: case 9: case 11:
                        maxDay = 30;
                        break;
                    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                        maxDay = 31;
                }
                for (int j = 1; j <=maxDay; j++) {//打印日期数字,当
                    System.out.print(j+"\t");
                    if ((j+weekDay+1)%7==0){//
                        System.out.println();
                    }
                }
            }else {
                System.out.println("月份输入错误");
        }
        }else {
            System.out.println("年份输入错误");
        }
        }

    }

猜你喜欢

转载自blog.csdn.net/qq_34566673/article/details/106180783