day09
万年历综合案例
说明:1900年的1月1日是礼拜一,所有后面的任何一天到底是礼拜几,一定是一个固定值
所有的日历都会从1900年1月1日是礼拜一开始算起
整体思路:
我们可以计算用户输入年份和月份距离1900年1月1日总共有多少天,这一部分可以分为两部分
totalYear和totalMonth,最终将两个值加起来得到totalDay
而使用totalDay与7进行取余的运算得到firstDay,可以得出该月份的1号之前总共有多少空位
空位打印完成后,可以打印真正的日期。
真正日期面临每遇到周日换行,所以根据fristDay与具体日期数值进行取余运算,余数为零则换行
1900年 1月1日的详细日历如下:
一 二 三 四 五 六 日 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 则1900年的2月1日详细日历如下:
一 二 三 四 五 六 日 1 2 3 4 5 6 7 8 9 10 11 因为1900年1月最后一天31是周三,所有1900年2月1日必须是周四,所以需要进行对七进行取余运算得到前面的空格数
代码实现:
package com.saas; import java.util.Scanner; /** 时间:2024-03-07* 描述:打印日历*/ public class PrintCalendar { public static void main(String[] args) { // 创建键盘输入对象Scanner scan = new Scanner(System.in); System.out.print("请输入年份: ");int year = scan.nextInt(); /** 判断年份是否合法* 1900-2500*/if(year < 1900 || year > 2500){System.out.println("请输入合法的年份(1900-2500)");return;} System.out.print("请输入月份: ");int month = scan.nextInt(); /** 判断月份是否合法* 1-12*/if(month < 1 || month > 12){System.out.println("请输入合法的月份(1-12)");return;} int totalYear = 0, totalMonth = 0, totalDay = 0; /** 计算用户输入的年份距离1900之间的天数* 1900-2024*/for(int i = 1900; i < year; i++){if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0){totalYear += 366; // 闰年总天数加366}else{totalYear += 365; // 平年总天数加365}} int days = 0; /** 计算用户输入的月份距离用户输入年份的1月1日之间的天数* 20240101-20240301*/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; // 大月份总共有31天break;case 4:case 6:case 9:case 11:days = 30; // 小月份总共有30天break;case 2:if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){days = 29; // 用户输入年份是闰年,则二月份总共有29天}else{days = 28; // 用户输入年份是平年,则二月份总共有28天}} // 用户输入的月份不需要累加到totalMonth中,只需要计算1月份到输入月份之前的总天数即可if(i < month)totalMonth += days;} totalDay = totalYear + totalMonth; /** 打印日历头部信息*/System.out.println("一\t二\t三\t四\t五\t六\t日"); /** 计算用户所输入具体日历之后的1号之前应该有多少个空位* 1900-2024*/int firstDay = (totalDay % 7); // 在1号之前打印多少个空位for(int i = 0; i < firstDay; i++){System.out.print("\t");}; // 开始真正月份的打印for(int i = 1;i <= days; i++){ System.out.print(i + "\t"); // 每遇到周日之后要换行if((firstDay + i) % 7 == 0){System.out.println();}}} }
作业
模拟一个银行ATM自助银行服务:
开户1
存款2
取款3
转账4
查询余额5
修改密码6
退出0
首先可以进入银行自助服务页面,将以上功能展示出来
接下来让用户选择,以上对应各自的编号,注意退出是0号,执行对应的打印功能
如果用户输入的编号有误(不是0-6),则让用户重新输入,执行操作
需要用到的知识点是循环和switch,实现以上功能