Java入門——萬年曆(控制檯)

我發誓,我這一次要認真寫。

簡要說明

編寫一個控制檯萬年曆程序。用戶輸入年份與月份,控制檯打印出該月的日曆。

(可連續輸入打印日曆,輸入exit退出系統)

簡要分析

想要打印該月的日曆需要知道以下信息:

  • 該月的天數
  • 該月第一天是周幾

月份的天數有四種情況:

  1. 大月份31天
  2. 小月份30天
  3. 閏年2月29天
  4. 平年2月28天

計算月第一天是周幾的方法:

已知1990年1月1日是週一,計算該月距離1990年1月1日的天數,通過與7取模可以計算是周幾。

通過以上分析,要實現該程序大概可以分位以下幾步:

  1. 獲取控制檯的輸入
  2. 判斷年份是否爲閏年
  3. 計算該月的天數
  4. 計算該月距離1990年1月1日的天數
  5. 計算該月第一天是周幾
  6. 打印該月日曆
  7. 修改爲循環程序(輸入exit退出程序)

代碼分析:

第一步:獲取控制檯的輸入

/**
		 * 第一步:從控制檯獲得輸入的年月
		 */
		Scanner sc = new Scanner(System.in);
		System.out.println("請輸入年份 (輸入exit退出程序)");
		int year = sc.nextInt();
		System.out.println("請輸入月份");
		int month = sc.nextInt();

第二步:判斷年份是否爲閏年

/**
* 第二步:判斷是不是閏年
*/
boolean isleap = false;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        isleap = true;
	} else {
	isleap = false;
	}

第三步:判斷該月有多少天

/**
				 * 第三步:判斷該月有多少天
				 */
				int monthDays = 0;
				switch (month) {
				// 大月份
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					monthDays = 31;
					break;
				// 小月份
				case 4:
				case 6:
				case 9:
				case 11:
					monthDays = 30;
					break;
				// 2月份
				default:
					if (isleap) {
						monthDays = 29;
					} else {
						monthDays = 28;
					}

				}

第四步:計算該月距離1990年1月1日有多少天

先計算該年距離1990年有多少天,在計算該月距離本年的1月1日有多少天,兩者之和即爲所求。

/**
				 * 第四步:判斷該月距離1990年1月1日有多少天 
				 * 1.按照年份差距計算天數 
				 * 2.月份距離本年1月1日有多少天
				 *  3.兩部分求和
				 */
				int yearCount = 0;
				int monthCount = 0;
				int sumCount = 0;
				// 計算年份相差的天數
				for (int i = 1990; i < year; i++) {
					if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
						yearCount += 366;
					} else {
						yearCount += 365;
					}
				}
				// 計算月份距離本年1月1日的天數
				for (int i = 1; i < month; i++) {
					switch (i) {
					// 大月份
					case 1:
					case 3:
					case 5:
					case 7:
					case 8:
					case 10:
					case 12:
						monthCount += 31;
						break;
					// 小月份
					case 4:
					case 6:
					case 9:
					case 11:
						monthCount += 30;
						break;
					// 2月份
					default:
						if (isleap) {
							monthCount += 29;
						} else {
							monthCount += 28;
						}
					}
				}
				// 兩部分之和即相距天數
				sumCount = yearCount + monthCount;

第五步:計算當前月的第一天是周幾。

已知1990年1月1日是週一,根據距離天數求周幾

/**
* 第五步:計算當前月第一天是周幾 已知1990年1月1日是週一,根據上一步計算的時間距離求
*/
int week = (sumCount % 7) + 1;

第六步:打印日曆

/**
				 * 第六步:打印當前月日曆
				 */
				// 打印輸入的年月信息
				System.out.println("\t" + year + "年" + month + "月");
				// 打印頭部
				System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
				// 打印可能的空白
				for (int i = 0; i < week; i++) {
					System.out.print("\t");
				}
				// 打印日曆
				for (int i = 1; i <= monthDays; i++) {
					System.out.print(i + "\t");
					if ((i + week) % 7 == 0) {
						System.out.println();
					}
				}
				System.out.println();

第七步:實現連續輸入,輸入exit退出

具體見下面完整代碼

完整代碼

package Calendar;

import java.util.Scanner;

/**
 * 控制檯萬年曆 根據輸入的年月,輸出當月日曆
 * 
 * @author july
 *
 */
public class Calendar {

	public static void main(String[] args) {
		
		/**
		 * 第一步:從控制檯獲得輸入的年月
		 */
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("請輸入年份 (輸入exit退出程序)");
			String tempyear = sc.next();
			if (!tempyear.equals("exit")) {
				//year強轉成int使用
				int year=Integer.parseInt(tempyear); 
				System.out.println("請輸入月份");
				int month = sc.nextInt();

				/**
				 * 第二步:判斷是不是閏年
				 */
				boolean isleap = false;
				if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
					isleap = true;
				} else {
					isleap = false;
				}

				/**
				 * 第三步:判斷該月有多少天
				 */
				int monthDays = 0;
				switch (month) {
				// 大月份
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					monthDays = 31;
					break;
				// 小月份
				case 4:
				case 6:
				case 9:
				case 11:
					monthDays = 30;
					break;
				// 2月份
				default:
					if (isleap) {
						monthDays = 29;
					} else {
						monthDays = 28;
					}

				}

				/**
				 * 第四步:判斷該月距離1990年1月1日有多少天 
				 * 1.按照年份差距計算天數 
				 * 2.月份距離本年1月1日有多少天
				 *  3.兩部分求和
				 */
				int yearCount = 0;
				int monthCount = 0;
				int sumCount = 0;
				// 計算年份相差的天數
				for (int i = 1990; i < year; i++) {
					if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
						yearCount += 366;
					} else {
						yearCount += 365;
					}
				}
				// 計算月份距離本年1月1日的天數
				for (int i = 1; i < month; i++) {
					switch (i) {
					// 大月份
					case 1:
					case 3:
					case 5:
					case 7:
					case 8:
					case 10:
					case 12:
						monthCount += 31;
						break;
					// 小月份
					case 4:
					case 6:
					case 9:
					case 11:
						monthCount += 30;
						break;
					// 2月份
					default:
						if (isleap) {
							monthCount += 29;
						} else {
							monthCount += 28;
						}
					}
				}
				// 兩部分之和即相距天數
				sumCount = yearCount + monthCount;

				/**
				 * 第五步:計算當前月第一天是周幾 已知1990年1月1日是週一,根據上一步計算的時間距離求
				 */
				int week = (sumCount % 7) + 1;
				/**
				 * 第六步:打印當前月日曆
				 */
				// 打印輸入的年月信息
				System.out.println("\t" + year + "年" + month + "月");
				// 打印頭部
				System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
				// 打印可能的空白
				for (int i = 0; i < week; i++) {
					System.out.print("\t");
				}
				// 打印日曆
				for (int i = 1; i <= monthDays; i++) {
					System.out.print(i + "\t");
					if ((i + week) % 7 == 0) {
						System.out.println();
					}
				}
				System.out.println();
			}else {
				//輸入了exit,退出系統
				System.out.println("退出系統");
				System.exit(0);
			}
		}
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章