万年历
一.题目介绍
编写程序, 提示用户输入年份和代表该年第一天是星期几的数字, 然后在控制台上显示该年的日历表。
例如, 如果用户输人年份 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();
}
}
}