万年历编写
万年历操作:
用户输入1900年之后的任何一个年份,就打印出这一年的日历表
视图:
编写万年历考虑的问题:
第一 : 最关键的是知道用户输入的年份的第一天是星期几
第二 : 获得第一个问题的关键答案是1900年的第一天是星期一
第三 : 计算输入年份距离1900年1月1日的天数
- //这是计算输入年份距离1900年的天数,不包含该年的第一天
- //返回计算得到的天数
- public static int countDistanceDays(int y)
- {
- int totalDays=0;
- for(int i=1900; i<y; i++)
- {
- if(isPrime(i))
- {
- totalDays+=366;
- }
- else
- {
- totalDays+=365;
- }
- }
- return totalDays;
- }
第四 : 考虑闰年的问题
将闰年问题重构一个方法,这个方法在计算输入年份中的每一个月距离该年的第一天时用到.
- //返回boolean类型的结果
- public static boolean isPrime(int y)
- {
- return (y%4==0 && y/100!=0 || y%400==0) ? true : false;
- }
第四 : 如何计算每一天是星期几
算法很简单:计算该月的第一天距离1900年1月1日的天数,用所得的结果对7求余所的结果就是我们在这个月的日历表的第一行要打印的空格数,接着就依次打印这个月的天数..
第五 : 计算输入的年份中每一个月的天数,这个结果用来打印该月的日历时使用的。
第六 :考虑输入的年份不是整型数据,得做异常处理
下面是万年历的源代码:
- import java.util.Scanner;
- import java.util.InputMismatchException;
- public class Calender
- {
- //声明整型数组,存储一年中每一个月的天数
- public static int [] mds;
- //打印日历表的表头
- public static void printTitle()
- {
- System.out.println("日\t一\t二\t三\t四\t五\t六");
- }
- //判断输入的年份是否是闰年
- public static boolean isPrime(int y)
- {
- return (y%4==0 && y/100!=0 || y%400==0) ? true : false;
- }
- //计算月份第一天距离该年的第一天的天数
- public static int countDaysToYear(int m, int y)
- {
- int days=0;
- for(int i=1; i<m; i++)
- {
- if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
- {
- days+=31;
- }
- else if(i==2)
- {
- if(!isPrime(y))
- {
- days+=28;
- }
- else
- {
- days+=29;
- }
- }
- else
- {
- days+=30;
- }
- }
- return days;
- }
- //计算输入年份的第一天距离1900年1月1日的天数
- public static int countDistanceDays(int y)
- {
- int totalDays=0;
- for(int i=1900; i<y; i++)
- {
- if(isPrime(i))
- {
- totalDays+=366;
- }
- else
- {
- totalDays+=365;
- }
- }
- return totalDays;
- }
- //计算输入年份中每一个月的天数,并且放到数组中去
- public static int [] monthDays(int y)
- {
- int [] mds=new int[13];
- for(int i=1; i<mds.length; i++)
- {
- if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
- {
- mds[i]=31;
- }
- else if(i==2)
- {
- if(!isPrime(y))
- {
- mds[i]=28;
- }
- else
- {
- mds[i]=29;
- }
- }
- else
- {
- mds[i]=30;
- }
- }
- return mds;
- }
- //打印每一个月的日历表
- public static void printCalender(int y, int ytd)
- {
- for(int i=1; i<=12; i++)
- {
- int w=0;
- System.out.println(i+"月份");
- printTitle();
- int days=countDaysToYear(i, y);
- int totalDays=ytd+days;
- for(int k=0; k<totalDays%7; k++)
- {
- System.out.print(" \t");
- w++;
- }
- for(int j=1; j<=mds[i]; j++)
- {
- System.out.print(j+"\t");
- w++;
- if(w%7==0)
- {
- System.out.println();
- }
- }
- System.out.println();
- System.out.println();
- }
- }
- //主函数,进行用户操作
- public static void main(String [] args)
- {
- Scanner console=new Scanner(System.in);
- int year;
- System.out.print("请输入您所要打印日历的年份(请注意输入1900年以后的年份):");
- try{
- year=console.nextInt();
- }catch(InputMismatchException e){
- throw new InputMismatchException("Input number is error!");
- }
- int yearToDays=countDistanceDays(year);
- mds=monthDays(year);
- printCalender(year, yearToDays);
- }
- }