其实,万年历的实现并不难,只需要计算从1900年至所查询的那个月总共经过了多少,年,月,然后将本月的日子以日历的形式打印出来即可,先看一张效果图
从该图上可以看出来即从1900/1/1——2017/8总共经历了多少天,求出总天数然后:总天数%7+1 即为当前月的第一天是星期几
分析的差不多了,大家来看下代码:
main方法中只需要一个功能选择的代码就行了,然后不同的功能号码调用不同的方法,
class RiLi { static Scanner sc = new Scanner(System.in); //m:月数,y:年数,allDays:总天数,days:每月的天数 static int m,y,allDays,days; public static void main(String[] args) { System.out.print("请输入你要使用的模式***日历***\t***查询***\n"); int ms = sc.nextInt(); switch (ms) { case 1:shuRu();break; case 2:chaXun();break; default:System.out.print("输入有错"); } }下边我们看看所封装的四个方法:
1、shuChu( ):为了方便,我将键盘输入也封装成了一个方法,这样当年份或月份输入有误的时候,只需要再次调用方法就行了
public static void shuRu(){ System.out.print("请输入年份:"); y = sc.nextInt(); System.out.print("请输入月份:"); m = sc.nextInt(); if(y<1900||m>12){ System.out.println("输入有误,请输入正确的年份和月份:"); shuRu(); } else{ mycalendar(); shuChu(); } }2、实现万年历的主要方法mycalender( );
计算年份是不是闰年,闰年加上366,否则加上365,该月份属于该年的第几月,计算月份天数,用switch语句,加上该年每个月的天数,最后计算出allDays的总天数
public static void mycalendar(){ boolean r = false; if((y%4==0&&y%100!=0)||(y%400==0)){ r = true; } if(y>=1900&&m<=12){ for (int a = 1900;a<y ;a++){ if((a%4==0&&a%100!=0)||(a%400==0)) { allDays +=366; } else{ allDays +=365; } }} int mDays = 0;//到当前月天数 if(y>=1900&&m<=12){ for(int j =1;j<=m;j++){ switch (j) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31;break; case 4: case 6: case 9: case 11: days = 30;break; case 2: if(r == true){ days = 29; } else{ days = 28; } break; default:days = 0; } if(j<m){ mDays += days; } }} allDays += mDays; }3、打印方法
shuChu( ):即打印万年历的方法
weekday求出来的是每次打印第一天的是星期几,前边需要打印几个空格
public static void shuChu(){ int fristDay = 0; int weekday =1+ allDays%7; if(weekday == 7){ fristDay = 0;//周日 } else{ fristDay = weekday;//周一到周六 } System.out.println("日"+"\t"+"一"+"\t"+"二"+"\t"+"三"+"\t"+"四"+"\t"+"五"+"\t"+"六"); for (int k = 0;k<fristDay ; k++){ System.out.print("\t"); } for (int f = 1;f<=days ; f++){ System.out.print(f+"\t"); if((allDays+f)%7==6){ System.out.print("\n"); } } }
4、查询该天是星期几的方法
这样就体现出来封装的好处了,计算天数,只需要调用myclaendar( )方法既可,然后(总天数+今天是第几天)%7即为今天是星期几
public static void chaXun(){ System.out.print("请输入年份:"); y = sc.nextInt(); System.out.print("请输入月份:"); m = sc.nextInt(); System.out.print("请输入号数:"); int h = sc.nextInt(); mycalendar(); int fristDay = 0; int weekday =(allDays+h)%7; if (y<1900||m>12||h>31){ System.out.print("输入有误");} else { switch (weekday) { case 1:System.out.println("星期一");break; case 2:System.out.println("星期二");break; case 3:System.out.println("星期三");break; case 4:System.out.println("星期四");break; case 5:System.out.println("星期五");break; case 6:System.out.println("星期六");break; case 0:System.out.println("星期日");break; default:System.out.println("***输入有误***");} } }
上边就是万年历的实现方法,其实不难,但是要掌握万年历的基本思想,快去试一试吧