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);
			}
		}
	}
}


 

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