大家好,今天给大家分享万年历的编写。可能有人觉得这很难,假如输入不同的年和月,那么显示的月份天数不一样,然后还有平年闰年判断,又要算出不同年月前面的空格是多少,也要算出与日期对应的星期。前面这些问题看似有点复杂,但是如果把问题细分一下,逐个解决,然后再整合修改,万年历不就可以完成了吗?在这里我使用的是递归方法。我们一起来实现代码吧!
万年历是从1900年开始,有平年,闰年判断。
/**
\* 平闰年的判断
\* @param year 年
\* @return 返回年
*/
public static boolean isLeapYear(int year) {
//闰年就是能够被4整除并且不能被100整除或者能被400整除的数
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
之后就算最小年份和最大年份
/**
*
* @param maxYear
* 最大年份
* @param minYear最小年份
* @return
*/
public static int yearDate(int maxYear, int minYear) {
int sum = 0;
for (int i = minYear; i < maxYear; i++) {
if (isLeapYear(i)) {//如果是闰年就加366天
sum += 366;
} else {//如果不是是闰年就加365天
sum += 365;
}
}
return sum;
}
/**
* 获取今天是今年的的第几天
*
* @param year 参数 年
* @param month 参数 月
* @param date 参数 日
* @return
*/
public static int yearMonthDay(int year, int month, int date) {
int sum = 0;
for (int i = 1; i < month; i++) {
if (i == 2) {
if (isLeapYear(year)) {//如果是闰年就加29天,否则加28天
sum += 29;
} else {
sum += 28;
}
} else if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
sum += 31;
} else {
sum += 30;
}
}
sum += date;
return sum;
}
/**
* 1900年1月1号是星期一 ,计算出某年某日是星期几时
*
* @param year 参数 年
* @param month 参数 月
* @param date 参数 日
* @return
*/
public static int getWeek(int year, int month, int date) {
int sum = 0;
//调用获取今天是今年的的第几天方法
sum += yearMonthDay(year, month, date);
sum += yearDate(year, 1900);
//因为多加了1号,要自减
sum--;
int week=sum%7+1;
return week;
}
计算空格问题和换行问题
/**
* 定义空格数和换行规则
* @param e
* @param d
*/
public static void printDay1(int e,int d){
for(int i=0;i
System.out.print("\t");
}
for(int i=1;i<=d;i++){
System.out.print(i+"\t");
if((i+e)%7==0){
System.out.println();
}
}
}
写在到这一步,下面就写一个关于万年历的方法
/**
* 万年历
*/
public static void wannianli(int y,int m){
System.out.println("一\t二\t三\t四\t五\t六\t日");
int e=0;
int max=31;
if(m==2){
if(isLeapYear(y)){
max=29;
}else{
max=28;
}
}else if(m == 4 || m == 6 || m == 9 || m == 11 ){
max=30;
}
int week=getWeek(y, m, 1);
//因为星期是0-6,为了更好的规范效果所以-1
e=week-1;
printDay1(e,max);
}
最后把这这万年历方法放在主函数里面,输入一个年份月份在控制台输出就能得到结果
public static void main(String[] args) {
wannianli(2020,5);
}
结果为下图:
完整代码是:
public class Work1 {
public static void main(String[] args) {
wannianli(2020,5);
}
/**
* 万年历
*/
public static void wannianli(int y,int m){
System.out.println("一\t二\t三\t四\t五\t六\t日");
int e=0;
int max=31;
if(m==2){
if(isLeapYear(y)){
max=29;
}else{
max=28;
}
}else if(m == 4 || m == 6 || m == 9 || m == 11 ){
max=30;
}
int week=getWeek(y, m, 1);
e=week-1;
printDay1(e,max);
}
/**
* 定义空格数和换行规则
* @param e
* @param d
*/
public static void printDay1(int e,int d){
for(int i=0;i
System.out.print("\t");
}
for(int i=1;i<=d;i++){
System.out.print(i+"\t");
if((i+e)%7==0){
System.out.println();
}
}
}
/**
* 平闰年的判断
* @param year
* @return
*/
public static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
/**
*
* @param maxYear
* 最大年份
* @param minYear最小年份
* @return
*/
public static int yearDate(int maxYear, int minYear) {
int sum = 0;
for (int i = minYear; i < maxYear; i++) {
if (isLeapYear(i)) {
sum += 366;
} else {
sum += 365;
}
}
return sum;
}
/**
* 获取今天是今年的的第几天
*
* @param year
* @param month
* @param date
* @return
*/
public static int yearMonthDay(int year, int month, int date) {
int sum = 0;
for (int i = 1; i < month; i++) {
if (i == 2) {
if (isLeapYear(year)) {
sum += 29;
} else {
sum += 28;
}
} else if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
sum += 31;
} else {
sum += 30;
}
}
sum += date;
return sum;
}
/**
* 1900年1月1号是星期一 ,计算出某年某日是星期几时
*
* @param year
* @param month
* @param date
* @return
*/
public static int getWeek(int year, int month, int date) {
int sum = 0;
sum += yearMonthDay(year, month, date);
sum += yearDate(year, 1900);
sum--;
int week=sum%7+1;
return week;
}
}
以上就是本期的内容,谢谢你的观看!