用Java写的一个万年日历
当我们学过分支结构语句和循环语句后,我们可以简单的完成一个小案例:
通过输入具体的年月日,输出此年此月此日为星期几,并打印此月日历。
说一下我的思路:
首先第一步,先实现输入年月日,然后输出星期几。
要实现这一步,就得有输入,以及定义一个静态方法用来寻找星期。
第二步,判断年份为闰年还是平年
通过简单if else判断即可,并保留年份为闰年还是平年的信息。
第三步,设置月份选择器,通过月份选择器,选择此月日历输出
使用switch case即可 细节:使用穿透,可以将相同天数的月份可以放在一起。
注意 :特殊月份2月应该单独选择,并在选择后根据第二步保存的年份信息,
判断天数。
第四步,确定日历格式,先输出星期,随后按照日期在所对应的星期下输出。
为解决这一步,我将一个月的天数默认设为42即6行7列,然后找到输入年月后此月
对应的第一天是星期几,找到第一行中对应星期,然后按顺序输出日期。
第五步,处理细节
对输入,进行判断。重新排版,确保美观。
附上代码:
public static void main(String[] args) {
//输入年,月,日
String[] week={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
Scanner getNumber=new Scanner(System.in);
//定义年
int year;
//定义月
int mouth;
//定义天
int day;
//定义变量sum,用来接收某年某月某日累加天数
int sum=0;
//定义闰,平年旗帜
boolean yearFlag=false;
//定义日期输出控制旗帜
boolean dayFlag=false;
//定义sumfirstday,用来判断当月一号为星期几
int sumfirstday;
//定义天数累加变量count并初始化
int count=1;
//定义此年此月此日为星期几
int weekday;
//判断输入年份是否大于0
while (true){
System.out.println("请输入年份");
year = getNumber.nextInt();
if(year>0){
break;
}
}
//判断输入月份是否大于0且小于等于12
while (true){
System.out.println("请输入月份");
mouth = getNumber.nextInt();
if(mouth>0&&mouth<=12){
break;
}
}
//判断输入天是否大于0且小于等于31
while (true){
System.out.println("请输入日期");
day = getNumber.nextInt();
if(day>0&&day<=31){
break;
}
}
//判断闰,平年
if(year%4==0&&year%100!=0||year%400==0){
System.out.println(year+"年是闰年");
yearFlag=true;
}else{
System.out.println(year+"年是平年");
}
//计算当年某日累加天数
for(int i=1;i<mouth;i++){
if(mouth==1){
sum=day;
break;
}
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
sum+=31;
}else if(i==4||i==6||i==9||i==11){
sum+=30;
}else{
if(yearFlag==true){
sum+=29;
}else{
sum+=28;
}
}
}
//获取当前月份一号,累加天数
sumfirstday=sum+1;
//接收当年某日累加天数
sum+=day;
//计算此年此月此日为星期几
weekday=findWeekDay(year,sum);
//输出星期一至周日
for(int i=0;i<7;i++){
System.out.print(week[i]+"\t");
}
System.out.println("");
//根据月份,输出日历表
switch (mouth){
//此为特殊月份二月
case 2:
//设置二月天数
int secondMounth=0;
//判断此年为闰年还是平年
if(yearFlag==true){
secondMounth=29;
}else {
secondMounth=28;
}
//设置日历表总数为42
for(int i=1;i<=42;i++){
//判断此月一号为星期几,当i与星期几匹配时,开始按顺序输出天数
if(i==findWeekDay(year,sumfirstday)||dayFlag==true){
System.out.print(count+"\t\t");
//满足条件时,日期开始变动
count++;
//改变旗帜变量,直至完成天数输出
dayFlag=true;
//判断天数是否输出完成
if(count==secondMounth+1){
//当天数输出完成时,改变旗帜变量结束日期输出
dayFlag=false;
}
}else{
//用来控制格式
System.out.print("\t\t");
}
//每循环7次换行
if(i%7==0){
System.out.println("");
}
}
break;
//此为月天数31的月份
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
//设置日历表总数为42
for(int i=1;i<=42;i++){
//判断此月一号为星期几,当i与星期几匹配时,开始按顺序输出天数
if(i==findWeekDay(year,sumfirstday)||dayFlag==true){
System.out.print(count+"\t\t");
count++;
//改变旗帜变量,直至完成天数输出
dayFlag=true;
//判断天数是否输出完成
if(count==32){
//当天数输出完成时,改变旗帜变量结束累加
dayFlag=false;
}
}else{
System.out.print("\t\t");
}
//每循环7次换行
if(i%7==0){
System.out.println("");
}
}
break;
//此为月天数30的月份
default:
//设置日历表总数为42
for(int i=1;i<=42;i++){
//判断此月一号为星期几,当i与星期几匹配时,开始按顺序输出天数
if(i==findWeekDay(year,sumfirstday)||dayFlag==true){
System.out.print(count+"\t\t");
count++;
//改变旗帜变量,直至完成天数输出
dayFlag=true;
//判断天数是否输出完成
if(count==31){
//当天数输出完成时,改变旗帜变量结束累加
dayFlag=false;
}
}else{
System.out.print("\t\t");
}
if(i%7==0){
System.out.println("");
}
}
break;
}
System.out.println(year+"年"+mouth+"月"+day+"日是星期"+weekday);
}
/定义静态方法用来计算星期
public static int findWeekDay(int year,int sum)
{
//根据年份以及所求日期在此年份中累积的天数来求星期
int Weekday=(year-1+(year-1)/4 -(year-1)/100 +(year-1)/400+sum)%7;
//因为上述方法结果是被模了7,所以这里要将0改为7
if(Weekday==0){
Weekday=7;
}
//返回星期
return Weekday;
}
新人第一次写,希望大家看完这篇能够理解。有不足,欢迎在评论区指出。