import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;
public class subject1 {
//(1)万年历的设计与实现(综合)(参考学时:4学时)
//1) 搭建Java编译环境;
//2)学会使用函数解决问题,编写函数,计算某一年第一天星期几;yes
//3) 编写函数,计算某一年是否为闰年,从而计算某一月有多少天;yes
//4) 编写函数,计算某一年某一个月第一天是星期几;yes
//5) 循环打印某一年中某一个月的月历,包括日期和星期几。yes
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 从键盘接收数据
// next方式接收字符串
System.out.println("请输入你想要查询的年份:");
int year = input.nextInt();
System.out.println("请输入你想要查询的月份:");
int month = input.nextInt();
System.out.println("请输入你想要查询的日子:");
int day = input.nextInt();
boolean yearDays = isRunYear(getAllDay1(year));
if (yearDays) {
System.out.println(getAllDay1(year) + "年是闰年");
} else
System.out.println(year + "年不是闰年");
int monthDays = getDays(month, year);
System.out.println("这一年的" + month + "月有" + monthDays + "天");
int allDay1 = CalculationDays1(year);
// System.out.println("这一年的距离1990年有"+allDay1+"天");
//System.out.println("这一年的第一天是星期" + whatWeek(allDay1+1) );
int allDay3= getMonthDays(month,year);//这年一月到month有多少天
int week = whatWeek(allDay1,allDay3,day);
System.out.println("这一天是星期" + week);
System.out.println("\t" + "\t" + "\t" + year + "年" + month + "月");
System.out.println("----------------------------------------------------");
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
newLine(allDay1 ,allDay3,monthDays);
}
// 月的总天数
public static int getMonthDays(int month, int year) {
int days = 0;
int monthDays = 0;
for (int i = 1; i <= month; i++) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if (isRunYear(year)) {
days = 29;
}
else {
days = 28;
}
}
monthDays += days;
}
monthDays -= days; //因为不能加上year年month月的天数所以减去month月的天数
return monthDays;
}
private static int getAllDay1(int allDay1) {
return allDay1;
}
public static boolean isRunYear(int year) { //判断是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return true;
}
return false;
}
public static int getDays(int month, int year) { //返回当前月的天数
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (isRunYear(year)) {
return 29;
}
return 28;
}
return 0; //如果传入的月份不再[1, 12]之间,那么就意味着switch中的所有case都不会匹配
}
//到哪一年多少天
public static int CalculationDays1(int year) {
AtomicInteger yearDays = new AtomicInteger();
if (!(year < 1900)) {
for (int i = 1900; i < year; i++) {
if (isRunYear(i)) {
yearDays.addAndGet(366);
} else {
yearDays.addAndGet(365);
}
}
} else {
for (int i = 1900; i > year; i--) {
if (isRunYear(i)) {
yearDays.addAndGet(366);
} else {
yearDays.addAndGet(365);
}
}
}
return yearDays.get();
}
//这天是星期几
public static int whatWeek(int allDay1,int allDay3,int day) {
int allDay2=allDay1+allDay3+day;
int m=0;
if(allDay2%7==0){
m=7;
}else {
m = allDay2 % 7;
}
return m;
}
// 打印日历
public static void newLine(int allDay1,int allDay3 , int monthDays) { //输入日历表的格式
int allDays=allDay1+ allDay3;
int newline = allDays % 7 + 1;
for (int i = 0; i < newline && newline != 7; i++) { //决定前面空几个
System.out.print("\t\t");
}
for (int i = 1; i <= monthDays; i++) { //每隔一个空一个\t.
System.out.print(i + "\t\t");
if ((newline + i) % 7 == 0) { // 隔7个就换行
System.out.println();
}
}
}
}
参考了其他伙伴的子函数