用java的for循环实现万年历

1、程序要求

万年历:输入一个年份,再输入一个月份,把那个月的日历打印出来;
(1900年1月1日是星期一)。

2、逻辑思路

1、根据已知条件,1900年1月1日时星期一,一周一共7天,那么我们如果得到了从
1990年到我们输入的年份之前的天数再%7,得到的余数就是经过了那么多年的目前是星期几;
2、因为日期存在闰年和平年,闰年2月29天,全年366天,平年2月28天,全年365天;
循环1900到目前的年份,在循环体里判断是不是闰年则可以得到至目前的年份之前的总天数;
3、闰年意义:四年一闰,100年不闰,400年再闰;
4、前面算出了年份,还需计算需要打印的万年历当月之前的经过了多少天;
每年的1.3.5.7.8.10.12月份固定31天;
每年的4.6.9.11固定为30天,2月则需再判断输入的那年为平年还是闰年;
再使用循环对小于输入月份的月天数进行累加到1900年到目前年份的总天数中;
此时的总天数就是1900年到目前输入的月份前一个月经过了多少天;
再%7,余数就是又经过了星期的天数;正好=0则刚好轮完n周;万年历当月从星期一的位置开始打印;
5、打印时如果用一  二  三  四  五 六 日进行排序,则按以上就正好可以对齐;
若用日  一  二  三  四  五 六 方式进行排序,因为1900年1月1日是星期1;
排在第二个数,则需(总天数+1)%7;

3、易错点

1、进行天数累计时,判断闰年需要**循环**判断到今年之前的每一年;
2、累加月份天数时,循环里如果输入的月份不等于当前遍历值且需要循环变量需
小于输入的月份才可进行累计,无后者限制,将会把总天数加至全年除了输入当月的天数和;
3、若用日  一  二  三  四  五 六 方式进行排序,因为1900年1月1日是星期1;
排在第二个数,则需(总天数+1)%7;

4、java源代码

/*
4.万年历:输入一个年份,再输入一个月份,把那个月的日历打印出来;
(1900	年1月1日是星期一)。
四年一闰,100年不闰,400年再闰
*/
import java.util.Scanner;
public class GetMonth{
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		System.out.print("请输入您要查询的一个年份:");
		int totalDays = 0;//计算1990年1月1日到输入年份中间的天数;
		int monthDays = 0;//存储某个月份的天数;
		int getTab = 0;
		int year = scan.nextInt();
		System.out.print("请输入您要查询的一个月份:");
		int month = scan.nextInt();		
		for(int i=1900;i<year;i++){//for循环遍历得到输入年份到1990年1月1日的差值;
			if((i%4==0&&i%100!=0)||i%400==0){//判断写入的当年之前经过了多少个闰年和平年然后累加
				totalDays = totalDays +366;
			//	System.out.println(year+"是闰年");
			}else{
				totalDays = totalDays +365;
			//	System.out.println(year+"不是闰年");
			}
		}
		
		for(int j=1;j<=month;j++){//遍历得到每个月的天数,得到当年的累加天数到总共天数
			switch(j){
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					monthDays = 31;
					break;
				case 4:
				case 6:
				case 9:
				case 11:
					monthDays = 30;
				//	System.out.print("本月有30天");
					break;
				case 2:
					if((year%4==0&&year%100!=0)||year%400==0){//判断需要看万年历的当年是否为闰年;
						monthDays = 29;
				//		System.out.print("本月有29天");
					}else{
						monthDays = 28;
				//		System.out.print("本月有28天");
					}
					break;
			}
			if(j!=month&&j<month){//如果输入的月份不等于当前遍历值,则1900到目前month月之前的总天数进行累加;
				totalDays += monthDays;//需要万年历的当月不计入累计天数和
			//	System.out.println("当月加上有"+totalDays);
			}
		}
		//总天数累加到了需要计算的当月月地
		
	//	System.out.println("getTab"+getTab);
	//	System.out.println("totalDays"+totalDays);
	//	System.out.println("monthDays"+monthDays);
	/*	if(getTab%7==0){
			getTab = 0;
		}*/
		getTab = totalDays%7;//存储需计算的当月前面的空格数 排列周一 。。。周日
		System.out.println("\t\t"+year+"年"+month+"月万年历");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		for(int i=0;i<getTab;i++){
			System.out.print("\t");	
		}
		for(int i=1;i<=monthDays;i++){
			System.out.print(i+"\t");
			if((i+getTab)%7==0){
				System.out.println();//七天一换行
			}					
		}	
	}
}

5、运行效果展示

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落日晓余晖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值