打印万年历

分析:

注重细节:1.每月有31天,30天还有28.29天,而且每年的天数不同,根据是不是闰年进行判断

2,计算时,是计算从1800年1月1日开始,那天是周三,所以计算时需要加三

3,所需要调用的方法很多,还有重复调用,所以适合分开写,减少工作量

4,需要调用的方法有打印星期几,打印月份,输出日期,计算总共的天数,计算当月从周几开始,判断闰年,根据月份计算当月多少天


package pritice4;



import java.util.Scanner;


public class PrintCalender {


public static void main(String[] args) {
//打印日历
Scanner input = new Scanner(System.in);
System.out.print("Enter full year (e.g.,2001)");
int year = input.nextInt();

System.out.print("Enter month in number between 1 and 12:");
int month = input.nextInt();

printMonth(year,month);


}

public static void printMonth(int year,int month){
printMonthTitle(year,month);

printMonthBody(year,month);
}

public static void printMonthTitle(int year,int month){
System.out.println("        "+getMonthName(month)+"    "+year);
System.out.println("-----------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");//打印日历的开头部分,此处空格要合适,这样看着对齐
}

public static String getMonthName(int month){//找出对应的月份
String monthName = " ";
switch(month){
case 1: monthName = "January";break;//一定用break进行结束
case 2: monthName = "February";break;
case 3: monthName = "March";break;
case 4: monthName = "April";break;
case 5: monthName = "May";break;
case 6: monthName = "June";break;
case 7: monthName = "July";break;
case 8: monthName = "August";break;
case 9: monthName = "September";break;
case 10: monthName = "October";break;
case 11: monthName = "November";break;
case 12: monthName = "December";break;
}
return monthName;
}


public static void printMonthBody(int year,int month){
int startDay = getStartDay(year,month);

int numberOfDaysInMonth = getNumberOfDaysInMonth(year,month);

int i = 0;
for(i=0;i<startDay;i++)
System.out.printf("    ");//四个空格,与下面的格式化输出保持一致,

for(i=1;i<=numberOfDaysInMonth;i++)//第一次犯错误是忘记了等于,导致每个月少了一天
{
  System.out.printf("%4d",i);

  if((i+startDay)%7 == 0)//七天进行一次换行,包括前面输出的空格
System.out.println();
}
System.out.println();
}
 

public static int getStartDay(int year,int month){
final int START_DAY_FOR_JAN_1_1800 = 3;
int totalNumberOfDays = getTotalNumberOfDays(year,month);
return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800)%7;//1800年一月一日是从周三开始的,所以加上一个3




}

public static int getTotalNumberOfDays(int year,int month){
int total = 0;
for(int i=1800;i<year;i++)
if(isLeapYear(i))
total += 366;//闰年
else
total +=365;//非闰年
for(int i=1;i<month;i++)
total += getNumberOfDaysInMonth(year,i);//计算总共天数,包括整年的,还有所零下的月份的
return total;
}

public static int getNumberOfDaysInMonth(int year,int month){

if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
return 31;

if(month==4 || month==6 || month==9 || month==11)
return 30;

if(month==2) return isLeapYear(year)? 29:28;//闰年29天

return 0;

}
public static boolean isLeapYear(int year){
return year%400 == 0 ||(year %4==0 && year %100 !=0);//判断是否是闰年
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱ycy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值