牛骨文教育服务平台(让学习变的简单)
博文笔记

回顾大学--大一JAVA实验--实验六 数组

创建时间:2012-01-21 投稿人: 浏览次数:1478

熟练掌握一维及二维数组的使用

实验内容

由键盘输入年份,编写一个程序显示当年的日历,用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);
    }


这里应该是自己手动计算的,按照上面计算某一天是星期几的公式,算出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<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就很简单了,看来将问题分解的方式很管用啊

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。