我發誓,我這一次要認真寫。
簡要說明
編寫一個控制檯萬年曆程序。用戶輸入年份與月份,控制檯打印出該月的日曆。
(可連續輸入打印日曆,輸入exit退出系統)
簡要分析
想要打印該月的日曆需要知道以下信息:
- 該月的天數
- 該月第一天是周幾
月份的天數有四種情況:
- 大月份31天
- 小月份30天
- 閏年2月29天
- 平年2月28天
計算月第一天是周幾的方法:
已知1990年1月1日是週一,計算該月距離1990年1月1日的天數,通過與7取模可以計算是周幾。
通過以上分析,要實現該程序大概可以分位以下幾步:
- 獲取控制檯的輸入
- 判斷年份是否爲閏年
- 計算該月的天數
- 計算該月距離1990年1月1日的天數
- 計算該月第一天是周幾
- 打印該月日曆
- 修改爲循環程序(輸入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);
}
}
}
}