我发誓,我这一次要认真写。
简要说明
编写一个控制台万年历程序。用户输入年份与月份,控制台打印出该月的日历。
(可连续输入打印日历,输入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);
}
}
}
}