大佬勿喷,学校作业(*^_^*)
题目:万年历的设计与实现
(1)搭建Java编译环境
(2)学会使用函数解决问题,编写函数,计算某一年第一天星期几
(3)编写函数,计算某一年是否为闰年,从而计算某一月有多少天
(4)编写函数,计算某一年某一个月的第一天是星期几
(5)循环打印某一年中某一个月的日历,包括日期和星期几
(6)打印某一年的全年日历
实验原理:
需要一个基准时间用来做计算,记录时间都是从1900年1月1日开始,这天正好也是星期一。
判断是否为闰年
//判断是否为闰年
public static boolean leapYearJudge(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
计算1900年到所要计算年份之间的天数
//计算所输入年份到1900年的天数
public static int getTo1900Day(int year, int month) {
//定义变量存储天数
int dayto1900 = 0;
for (int i = 1900; i < year; i++) {
dayto1900 += leapYearJudge(i) ? 366 : 365;
//遇到闰年加366,不是闰年加365
}
return dayto1900;
}
判断输入该年的该月份的天数
//判断输入该年的该月份的天数
public static int dayOfMonthJudge(int year, int month) {
int dayOfMonth = 31;
switch (month) {
case 4:
case 6:
case 9:
case 11:
dayOfMonth = 30;
break;
case 2:
dayOfMonth = leapYearJudge(year) ? 29 : 28;
break;
}
return dayOfMonth;
}
计算所输入年份的输入月份到本年1月的总天数
//计算所输入年份的输入月份到本年1月的总天数
public static int getTo1Month(int year, int month) {
int dayTo1Month = 0;
for (int i = 1; i < month; i++) {
dayTo1Month += dayOfMonthJudge(year, i);
}
return dayTo1Month;
}
计算所输入年份的月份到1900年1月的总天数再求该输入月份的第一天是星期几
//计算星期数
public static String dayToWeek(int allDay) {
//计算是星期几
int index = allDay % 7;
char[] week = {'一', '二', '三', '四', '五', '六', '日'};
return "星期" + week[index];
}
完整代码:
package Calendar_projection;
import java.util.Scanner;
public class Calendar_wanzi {
/*
要求: (1) 搭建Java编译环境;
(2) 学会使用函数解决问题,编写函数,计算某一年第一天星期几;
(3) 编写函数,计算某一年是否为闰年,从而计算某一月有多少天;
(4) 编写函数,计算某一年某一个月第一天是星期几;
(5) 循环打印某一年中某一个月的月历,包括日期和星期几。
*/
//假设要求2023年1月,2023年2月,2022年12月
//1.基准时间为1900年1月1日,基于这个基准时间做运算
//2.需要选项选择不同操作(switch)
//3.键盘录入年和月,判断输入是否正确
//4.某一年是否为闰年:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
//5.打印日历注意格式
public static void main(String[] args) {
int year = 0;
int month = 0;
String week = "";
int choose = 1;
Scanner sc = new Scanner(System.in);
do {
switch (choose) {
case 1: {
System.out.println("请输入年份和月份");
year = sc.nextInt();
month = sc.nextInt();
while (!scanJudge(year, month)) {
System.out.println("录入数据不合理,请重新输入:");
System.out.println("请输入年份:");
year = sc.nextInt();
System.out.println("请输入月份:");
month = sc.nextInt();
}
break;
}
case 2: {
week = dayToWeek(getTo1900Day(year, month));
System.out.println(year + "年的第一天是:" + week);
break;
}
case 3: {
if (leapYearJudge(year)) {
int dayOfMonth = dayOfMonthJudge(year, month);
System.out.println(year + "年是闰年," + month + "月有" + dayOfMonth + "天");
} else {
int dayOfMonth = dayOfMonthJudge(year, month);
System.out.println(year + "年不是闰年," + month + "月有" + dayOfMonth + "天");
}
break;
}
case 4: {
week = dayToWeek(getTo1900Day(year, month) + getTo1Month(year, month));
System.out.println(year + "年" + month + "月的第一天是:" + week);
break;
}
case 5: {
printCalendar(year, month);
break;
}
case 6: {
for (int i = 1; i < 13; i++) {
System.out.println("------------------------日历分割线-----------------------");
System.out.println("\t\t\t\t\t" + year + "年" + i + "月");
printCalendar(year, i);
System.out.println();
}
break;
}
case 0:
System.exit(0);
default: {
System.out.println("没有该选项");
break;
}
}
System.out.println();
System.out.println("======================分割线=============================");
printChoose(year, month);
choose = sc.nextInt();
} while (true);
}
//打印选项
public static void printChoose(int year, int month) {
System.out.println("请选择下列选项来实现对应操作");
System.out.println("1.输入年份和月份");
System.out.println("2.打印" + year + "年第一天星期几");
System.out.println("3.打印" + year + "年是否为闰年," + month + "月有几天");
System.out.println("4.打印" + year + "年" + month + "月第一天是星期几");
System.out.println("5.打印" + year + "年" + month + "月的日历");
System.out.println("6.打印" + year + "年所有月份日历");
System.out.println("0.输入0退出");
}
//计算星期数
public static String dayToWeek(int allDay) {
//计算是星期几
int index = allDay % 7;
char[] week = {'一', '二', '三', '四', '五', '六', '日'};
return "星期" + week[index];
}
//计算所输入年份的输入月份到本年1月的总天数
public static int getTo1Month(int year, int month) {
int dayTo1Month = 0;
for (int i = 1; i < month; i++) {
dayTo1Month += dayOfMonthJudge(year, i);
}
return dayTo1Month;
}
//计算所输入年份到1900年的天数
public static int getTo1900Day(int year, int month) {
//定义变量存储天数
int dayto1900 = 0;
for (int i = 1900; i < year; i++) {
dayto1900 += leapYearJudge(i) ? 366 : 365;
//遇到闰年加366,不是闰年加365
}
return dayto1900;
}
//判断是否为闰年
public static boolean leapYearJudge(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//判断用户输入的年份和月份是否正确
public static boolean scanJudge(int year, int month) {
return (year > 1900 && year < 10000) && (month > 0 && month < 13);
}
//判断输入该年的该月份的天数
public static int dayOfMonthJudge(int year, int month) {
int dayOfMonth = 31;
switch (month) {
case 4:
case 6:
case 9:
case 11:
dayOfMonth = 30;
break;
case 2:
dayOfMonth = leapYearJudge(year) ? 29 : 28;
break;
}
return dayOfMonth;
}
public static void printCalendar(int year, int month) {
int week = (getTo1900Day(year, month) + getTo1Month(year, month) + 1) % 7;
int count = 0;//计数器,记录日期的空格
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
//打印空格
for (int i = 1; i <= week; i++) {
System.out.print("\t\t");
count++;
}
// 打印日历
for (int i = 1; i <= dayOfMonthJudge(year, month); i++) {
System.out.print(i + "\t\t");
count++;
//若记录数是七的倍数,换行输出
if (count % 7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
本代码仅供参考,不是每个学校都会留一样的题,希望你看了我的代码后能有自己的思考,将自己的想法写入代码。