在知道1901.1.1是星期二的情况下,输入1901.1后的年份和月份,输出该年该月的日历。
(知道1900.1.1是星期一的情况步骤都是一样的)
思路:
- 输入数据
- 打印表头
- 打印表体(判断该年的平润,求该月份天数,求该月第一天是星期几)
-
最终代码运行效果如下:
首先还是定义需要的变量年份和月份,然后提醒用户输入赋值:
int year;//年份
int month;//月份
Scanner scanner=new scanner(system.in);
System.out.print("请输入1901年1月后的年份:");
year=scanner.nextInt();
System.out.print("请输入1901年1月后的月份:");
month=scanner.nextInt();
print(year,month); //调用打印方法
然后创建一个打印方法print():
public static void print(int year,int month){
//先打印表头
System.out.println("\t"+month+"月"+year+"年");
System.out.println("============================"); //这个分割线按实际情况调整
Syetem.out.println("\t日\t一\t二\t三\t四\t五\t六");
//打印表体
//首先要知道该月的第一天是星期几
int firstDay; //用来存储星期数
firstDay=getFirstDay(year,month); //获得初始星期数
if(firstDay>=7)
firstDay-=7; //如果firstDay返回的值大于7了减去7就是正确的
for(int i=1;i<=firstDay;i++){
//第一天是星期几就要在前面打印几个\t
System.out.print("\t"); //不要换行打印
}
//再要知道该月的天数
int monthDays; //用来存储该月天数
monthDays=getMonthDays(month,year); //获得该月天数
for(int i=1;i<=monthDays;i++){ //从i=1开始打印
System.out.print(i+"\t"); //不要换行打印
firstDay++; //每打印一次星期数加一表示下一天的星期数
if(firstDay==7){
System.out.println("\n"); //每到星期七就换行打印,重新开始打印新的一行
firstDay=0; //同时将星期数变为0
}
}
}
然后将要用到的方法补充完整:
//获取第一天星期数:
public static int getFirstDay(int year,int month){
//用1901.1.1到输入的年份月份的第一天之间的天数差值%7得到的数再加上1901.1.1的星期数就等于该月第一天星期数
int sum=0; //定义一个sum代表差值
for(int i=1901;i<=year;i++){
if(year>1901){ //如果year不是1901的话,就要判断year与1901间的年份是平年还是闰年
if(isLeapYear(i)) //i代表1901起到year的每一年
sum+=366; //闰年加366
else
sum+=365; //平年加365
}
}
for(int j=1;j<month;j++){ //假如是3月和1月之间,之间只需要加两个月,所以不用<=month.
switch(j){ //j代表从1月到month的每个月
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
sum+=31;break; //大月
case 2:
if(isLeapYear(year)) //判断平润来决定二月份的天数
sum+=29;break;
else
sum+=28;break;
default:sum+=30; // 小月
}
}
return (sum%7+2); //1901.1.1是星期2
}
//求该月的天数:
public static int getMonthDays(int month,int year){
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(isLeapYear(year))
retrun 29;
else
return 28;
default:return 30;
}
}
//判断平润年
public static Boolean isLeapYear(int year){
if((year%4==0&&year%100!=0)||year%400==0)
return true;
else
return false;
}
程序差不多就这样了,还可以给加一两句防止出现输入比1901小的年份以及不在0-12的月份,代码如下:
do {
System.out.println("请输入1901年1月后的年份:");
year=scanner.nextInt();
if(year<1901)
System.out.print("输入错误,");//这里不换行输出就可以把这句话直接接着上一句输出
}while(year<1901);
do {
System.out.println("请输入1901年1月后的月份:");
month=scanner.nextInt();
if(month<=0||month>12)
System.out.print("输入错误,");
}while(month<=0||month>12);