回顾大学--大一JAVA实验--实验六 数组
熟练掌握一维及二维数组的使用
实验内容
由键盘输入年份,编写一个程序显示当年的日历,用Application程序实现。
有关输出日历的两点说明
1. 求某一年的1月1日是星期几的方法
假设当前年份为y,并忽略闰年,则从公元元年1月1日到y-1年共有365*(y-1)天,加上闰年多出来的天数,即加上1*((y-1)/4-(y-1)/100+(y-1)/400),"/"为整除,得:365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)。
补上一个x(x是与公元元年1月1日是星期几有关的一个0~6的整数),并将这个表达式赋给变量t,即:
t=x+365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)再用t除以7,余几即为星期几(余0为星期日)。
下面讨论x的求法:
如果知道公元元年1月1日是星期几,就可以直接得到x的值,但现在公式还没有求出来,不知道公元元年1月1日是星期几。不过没关系,毕竟知道最近的日期是星期几。不妨看一下2001年1月1日是星期几,结果是星期一,代入公式得t=x+730516,用730516除以7,得104355,余数是1,则为了保证2001年1月1日是星期一,取x 为0,至此,得到了完整的公式:
t=365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
再将它做一下改进,我们将公式变形为:
t=(52*7+1)*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
利用星期的周期性,将52*7*(y-1)从公式中删除,得:
t=(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
所以求某一年的1月1日是星期几的最常见的公式为:
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400]
公式中的[...]指只取计算结果的整数部分。算出来的W除以7,余数是几就
是星期几。如果余数是0,则为星期日。
2. 要求显示日历的格式(以2009年9月为例):
2009-9
日 一 二 三 四 五 六
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
—————————————————————————————————————————————————————————————————————————————
下面是我的代码: 点此下载命令行的java日历程序
—————————————————————————————————————————————————————————————————————————————
这个程序我记得我可是想了一个星期才做出来的
现在想想跟前面的MyDate程序差不多,只是在显示上稍微搞清点逻辑就好了
还是上图,类的结构如下:
没有单独写类,直接main方法和类在一起的
1,这里有点不合要求的是getWeekDay方法:获得某日期年月日是周几
private int getWeekDay(int year,int month,int day){ Calendar calWeek = new GregorianCalendar(year,month-1,day); return (calWeek.get(Calendar.DAY_OF_WEEK)-1); }
2,getDay还是和上次的MyDate里面的一样:
private int getDay(int year,int month){ switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (year % 4 == 0 && year % 100 != 0) return 29; else return 28; } System.out.println("error month!"); return -1; }
3,格式化输出display:其实我认为这个实验就是这里可能会与MyDate不同,格式化输出利用了笨方法,自己判断:
private void display(int year,int month,int day){ if(day==1) { for(int i=0;i<getWeekDay(year,month,day);i++){ System.out.print(" "); } } if(day<10) System.out.print(" "); System.out.print(" "+day); if(getWeekDay(year,month,day)==6) System.out.println(); }
这就是显示某一天,本来记得挺麻烦的,怎么现在看代码这么少啊!
4,显示所有的月份
shiyan6(String args){ int year = Integer.parseInt(args); System.out.println(); System.out.println(" "+year+"年日历"); System.out.println(); for(int i=0;i<12;i++){ System.out.println(year+"-"+(i+1)); System.out.println(" 日 一 二 三 四 五 六"); for(int j=0;j<getDay(year,i+1);j++){ display(year,i+1,j+1); } System.out.println(); System.out.println(); } }
利用上面显示某一天的display就很简单了,看来将问题分解的方式很管用啊
- 上一篇: Linux 下 操作进程环境变量的函数和指令
- 下一篇: c++——将数组中重复的数剔除