打印万年历(自学java)

一.题目介绍

编写程序, 提示用户输入年份和代表该年第一天是星期几的数字, 然后在控制台上显示该年的日历表。

例如, 如果用户输人年份 2019 和代表 2019 年 1 月 1 日为星期二的 2, 程序显示该年每个月的日历, 如下所示:

万年历

二.解题思路

步骤
1.首先需要确定输入的年份是否为闰年,然后才能判断这年中各个月份的天数。
2.该年的第一天为你输入的星期数,所以说第一个月就是确定好了的,而第二个月开始的星期数的 计算方法是: (上一个月的星期数+该月的天数%7)%7,比如如图中显示 :星期二+31%7之后再%7为星期五,最后一个%7是因为两者之和若是大于7则又从星期一开始算。也就是说这是 核心代码
3.最后就是要注意格式,我在刚开始犯了数组越界的错误也是尴尬

三.代码如下。

1.判断是否是闰年的代码

// 判断闰年
	public boolean runyear(int year) {
		if((year%4==0&&year%100!=0)||(year%400==0)) {
			return true;
		}
		return false;		
	}

2.返回该月天数(我利用switch case的)

public int days(int year,int month) {//根据年和月份返回这个月多少天
    	boolean years=runyear(year);//判断是否为闰年
    	switch(month) {
    	case 1:
    		return 31;
    	case 2:
    		if(years) {
    			return 29;
    		}else {
    			return 28;
    		}
    	case 3:
    		return 31;
    	case 4:
    		return 30;
    	case 5:
    		return 31;
    	case 6:
    		return 30;
    	case 7:
    		return 31;
    	case 8:
    		return 31;
    	case 9:
    		return 30;
    	case 10:
    		return 31;
    	case 11:
    		return 30;
    	case 12:
    		return 31;
    	default:
    		return 0;	
    	}
    }

3.返回该月第一天是星期几

 public int weakDay(int weakdata,int year,int month) {//判断第一天是星期几
    	if(month==1) {
    		return weakdata;//若是第一月,该星期为输入的
    	}
    	//(上一个月的星期数+其月天数%7)%7 递归上个月的星期
    	weakdata=(days(year,month-1)%7+weakDay(weakdata,year,month-1))%7;
    	return weakdata;
    }

4. 判断几号是星期几(后面要确定格式,方便日历打印星期6就要换一行输出)

	public int weak1(int days,int weakday) {
		int num=(days+weakday-1)%7;
		return num;
	}

5.主函数

public static void main(String[] args) {
		ZhuWeiHuang s=new ZhuWeiHuang();//这里我以自己名字为类的
		
	    System.out.print("请输入年:");
	    Scanner sc=new Scanner(System.in);
	    int year=sc.nextInt();
	    System.out.print("请输入该年的第一天是星期:");
	    int data=sc.nextInt();
	    //输出每个月的日历
	    String[] str =new String[] {"January","February","March","April","May","June","July","Augest","September","October","November","December" };
	    for(int i=1;i<13;i++) {
	    	System.out.print("\t\t"+str[i-1]+" "+year+"\n");
	    	System.out.println("----------------------------------------------------");
	    	System.out.println("Sun\tMon\tTue\tWed\tThu\tFir\tSat");
	    	int days=s.days(year,i);//获取这个月的天数
	    	int weakday=s.weakDay(data, year, i);//获取这个月的第一天星期
	    	for(int j=0;j<weakday;j++) {
	    		System.out.print("\t");//打印格式
	    	}
	    	for(int k=1;k<=days;k++) {
	    		System.out.print(k+"\t");
	    		if(s.weak1(k, weakday)==6) {//星期六就换行
	    			System.out.println();
	    		}
	    	}
	    	System.out.println();
	    	System.out.println();
	    	
	    }
	}
}

6.结果

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值