编写一个程序,显示给定的年月的日历,程序提示用户输入年份与月份,然后显示该月的整个日历。

题目要求:编写一个程序,显示给定的年月的日历,程序提示用户输入年份与月份,然后显示该月的整个日历。


                                           printCalendar(main)

              readInput (读入 年份 以及月份)                                printMonth(输出月份部分)

                                                                    printMonthTitle(月份开头)              printMonthBody(月份主体)

                                                                    getMonthName(获得 月份名字)     getStartDay(获得 开始的那天)

                                                                                                                           getTotalNumberOfDay(获得总天数)

                                                                                                                           getNumberOfDayInMonth(分31 天与30天月份)

                                                                      isLeapYear(区分是否为闰年)

这是一个典型的自顶向下的实现方法,先把需要用到的方法给列出来然后一步一步的进行实现。这样有利于框架的构建以及限定发生错误的区域,有益于查找bug,下面是具体的实现代码,测试结果没发现什么问题。

import java.util.Scanner;
//日历
import javax.swing.JTable.PrintMode;

public class 日历 {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		System.out.println("please input the year  eg:2012");
		int year=input.nextInt();
		System.out.println("please input the month 1to12");
		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="";
		if(month>12||month<1){
			System.out.println("input have error");
			System.exit(1);
		}
		switch (month) {
		case 1: MonthName = "January";  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=getStarDay(year,month);
		int i=0;
		for(i=0;i<startDay;i++)
			System.out.printf("    ");
		int numberOfDaysInMonth = getNumberOfDayInMonth(year,month);
		
		for(i=1;i<=numberOfDaysInMonth;i++){
			System.out.printf("%4d",i);
			if((i+startDay)%7==0)
				System.out.println();
		}
	}
	
	
public static int getStarDay(int year, int month) {
		final int START_DAY_FOR_JAN_1_1800=2;
		int totalNumberOfDays=getTotalNumberOfDays(year,month);
	
		return (totalNumberOfDays+START_DAY_FOR_JAN_1_1800)%7;
	}
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+=getNumberOfDayInMonth(year, i);
	}
	return total;
}
public static boolean isLeapYear(int year) {
	
	return year%400==0||(year%4==0&&year%100!=0);
}
public static int getNumberOfDayInMonth(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){
			if(isLeapYear( year)){
				return 28;
			}else{
				return 29;
			}
		}
		return 0;
	}
}
	

            运行结果如图

代码思路比较清晰,有什么看不懂的可以留言。                                                                        

猜你喜欢

转载自blog.csdn.net/weixin_37407422/article/details/82596234