Java基础打印日历——知道1901.1.1是星期二

在知道1901.1.1是星期二的情况下,输入1901.1后的年份和月份,输出该年该月的日历。

(知道1900.1.1是星期一的情况步骤都是一样的)


思路:

  1. 输入数据
  2. 打印表头
  3. 打印表体(判断该年的平润,求该月份天数,求该月第一天是星期几)
  4.  最终代码运行效果如下:


首先还是定义需要的变量年份和月份,然后提醒用户输入赋值:

int year;//年份
int month;//月份
Scanner scanner=new scanner(system.in);
System.out.print("请输入1901年1月后的年份:");
year=scanner.nextInt();
System.out.print("请输入1901年1月后的月份:");
month=scanner.nextInt();

print(year,month); //调用打印方法

然后创建一个打印方法print():

public static void print(int year,int month){
    //先打印表头
    System.out.println("\t"+month+"月"+year+"年");
    System.out.println("============================"); //这个分割线按实际情况调整
    Syetem.out.println("\t日\t一\t二\t三\t四\t五\t六");
    
    //打印表体
    //首先要知道该月的第一天是星期几
    int firstDay; //用来存储星期数
    firstDay=getFirstDay(year,month); //获得初始星期数
    if(firstDay>=7)
        firstDay-=7; //如果firstDay返回的值大于7了减去7就是正确的
    for(int i=1;i<=firstDay;i++){
        //第一天是星期几就要在前面打印几个\t
        System.out.print("\t"); //不要换行打印
        }

    //再要知道该月的天数
    int monthDays; //用来存储该月天数
    monthDays=getMonthDays(month,year); //获得该月天数
    for(int i=1;i<=monthDays;i++){ //从i=1开始打印
        System.out.print(i+"\t"); //不要换行打印
        firstDay++; //每打印一次星期数加一表示下一天的星期数
        if(firstDay==7){
            System.out.println("\n"); //每到星期七就换行打印,重新开始打印新的一行
            firstDay=0; //同时将星期数变为0
            }
        }
}

然后将要用到的方法补充完整:

//获取第一天星期数:
public static int getFirstDay(int year,int month){
    //用1901.1.1到输入的年份月份的第一天之间的天数差值%7得到的数再加上1901.1.1的星期数就等于该月第一天星期数
    int sum=0; //定义一个sum代表差值
    for(int i=1901;i<=year;i++){
        if(year>1901){ //如果year不是1901的话,就要判断year与1901间的年份是平年还是闰年
            if(isLeapYear(i)) //i代表1901起到year的每一年
                sum+=366; //闰年加366
            else
                sum+=365; //平年加365
        }
    }
    for(int j=1;j<month;j++){ //假如是3月和1月之间,之间只需要加两个月,所以不用<=month.
        switch(j){ //j代表从1月到month的每个月
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    sum+=31;break; //大月
                case 2:
                    if(isLeapYear(year)) //判断平润来决定二月份的天数
                        sum+=29;break;
                    else
                        sum+=28;break;
                default:sum+=30; // 小月
         }
    }
    return (sum%7+2); //1901.1.1是星期2
}

//求该月的天数:
public static int getMonthDays(int month,int year){
    switch(month){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 2:
            if(isLeapYear(year))
                retrun 29;
            else 
                return 28;
        default:return 30;
                
    }
}

//判断平润年
public static Boolean isLeapYear(int year){
    if((year%4==0&&year%100!=0)||year%400==0)
        return true;
    else
        return false;

}

程序差不多就这样了,还可以给加一两句防止出现输入比1901小的年份以及不在0-12的月份,代码如下:

        do {
			System.out.println("请输入1901年1月后的年份:");
		    year=scanner.nextInt();
		    if(year<1901)
		    	System.out.print("输入错误,");//这里不换行输出就可以把这句话直接接着上一句输出
		}while(year<1901);
		do {
			System.out.println("请输入1901年1月后的月份:");
		    month=scanner.nextInt();
		    if(month<=0||month>12)
		    	 System.out.print("输入错误,");
		}while(month<=0||month>12);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多低调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值