实验目的
熟练掌握一维及二维数组的使用
实验内容
由键盘输入年份,编写一个程序显示当年的日历,用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
—————————————————————————————————————————————————————————————————————————————
—————————————————————————————————————————————————————————————————————————————
这个程序我记得我可是想了一个星期才做出来的
现在想想跟前面的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);
}
这里应该是自己手动计算的,按照上面计算某一天是星期几的公式,算出1月1日是星期几,后面的2月3日应该也好算的,我就不再弄那种麻烦事情啦.
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
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
display(year,i+1,j+1);
}
System.out.println();
System.out.println();
}
} 利用上面显示某一天的display就很简单了,看来将问题分解的方式很管用啊